Работая над страницей добавления продукта с использованием PHP OOP и mysqli, на данный момент я работаю над реализацией подготовленного оператора, но не могу найти информацию о том, как добавить их в такой код.
Любые руководящие принципы будут оценены.
Код:
Класс подключения к БД:
<?php
class DbConfig {
private $_host = 'localhost';
private $_username = 'root';
private $_password = 'falcons17';
private $_database = 'scandiweb';
protected $connection;
public function __construct()
{
if (!isset($this->connection)) {
$this->connection = new mysqli($this->_host, $this->_username, $this->_password, $this->_database);
if (!$this->connection) {
echo 'Cannot connect to database server';
exit;
}
}
return $this->connection;
}
}
?>
Выполнить функцию:
public function execute($query) {
$result = $this->connection->query($query);
if ($result == false) {
echo mysqli_error($this->connection); /*'Error: cannot execute the command'*/
return false;
} else {
return true;
}
}
Процедура проверки и добавления:
<?php
//including the database connection file
include_once("classes/Crud.php");
include_once("classes/Validation.php");
$crud = new Crud();
$validation = new Validation();
if (isset($_POST['Submit'])) {
$sku = $crud->prepare_string($_POST['sku']);
$name = $crud->prepare_string($_POST['name']);
$price = $crud->prepare_string($_POST['price']);
$products = $crud->prepare_string($_POST['products']);
$weight = $crud->prepare_string($_POST['weight']);
$capacity = $crud->prepare_string($_POST['capacity']);
$height = $crud->prepare_string($_POST['height']);
$width = $crud->prepare_string($_POST['width']);
$length = $crud->prepare_string($_POST['length']);
$check_int = $validation->is_int($_POST, array('price','weight','capacity','height','width','length'));
if ($check_int != null){
echo $check_int;
}else {
$result = $crud->execute("INSERT INTO products(sku,name,price,product_type,weight,capacity,height,width,length) VALUES('$sku','$name','$price','$products','$weight','$capacity','$height','$width','$length')");
//display success message
echo "<font color='green'>Data added successfully.";
echo "<br/><a href='index.php'>View Result</a>";
}
}
?>
return in __construct бесполезен, и __construct не должен использоваться для получения соединения снаружи, когда он защищен
Ваш сценарий широко открыт для Атака с использованием SQL-инъекции Даже если вы избегаете ввода, это небезопасно! Используйте подготовленные параметризованные операторы в API MYSQLI_ или PDO
Было бы полезно, если бы вы точно описали, в чем проблема / ошибка.
new mysqli(... возвращает объект, а не boolean. Попробуйте сначала проверить - php.net/manual/en/…Что такое prepare_string? Если он экранирует данные, я настоятельно рекомендую вам прекратить это делать и вместо этого использовать подготовленные / параметризованные запросы. Если вам нужен подход класса db, вы можете предпочесть использование PDO над Mysqli, поэтому я предлагаю попробовать
Цените ваши рекомендации, я проверю их :)
Слушайте @JimL. В частности, построение строки для запроса, как вы это сделали, является серьезной проблемой безопасности. Прочтите об атаках с использованием SQL-инъекций и используйте параметризованные запросы.






Вот класс, который я часто использую. Он получает логин из отдельного .ini-файла. Не стесняйтесь вносить изменения в соответствии с вашими потребностями. Имейте в виду, что он устанавливает ассоциативные массивы в качестве стандарта.
class CC_DBV {
private static $mysqlhost;
private static $mysqluser;
private static $mysqlpwd;
public static $mysqldb;
private static $db;
private static $mysqlport;
function __construct() {
// ini File einlesen
$globSettings = parse_ini_file(_ROOTV_.'cfg/main.ini',true);
// Datenbankverbindung
self::$mysqlhost = $globSettings ['db_settings']['host']; // MySQL-Host aus Config Datei
self::$mysqluser = $globSettings ['db_settings']['db_user']; // MySQL-User aus Config Datei
self::$mysqlpwd = $globSettings ['db_settings']['db_pswd']; // Passwort aus Config Datei
self::$mysqldb = $globSettings ['db_settings']['db']; // Datenbank aus Config Datei
self::$mysqlport = $globSettings ['db_settings']['port']; // Datenbank aus Config Datei
}
public function getInstance( ) {
if (!self::$db) {
try{
self::$db = new \PDO(
'mysql:host='.self::$mysqlhost.';dbname='.self::$mysqldb.';port='.self::$mysqlport,
self::$mysqluser,
self::$mysqlpwd,
array(
\PDO::ATTR_PERSISTENT => true,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
)
);
//self::$db->exec("SET NAMES utf8");
return self::$db;
}catch (\PDOException $e){
echo 'Connection failed: ' . $e->getMessage();
}
}else{
return self::$db;
}
}
}
Чтобы использовать это, вы делаете что-то вроде этого:
$conn = new CC_DBV(); // you can use this connection multiple times, it's persistant.
$inst = $conn->getInstance(); // create or get the instance of the opened connection
$stmnt = $inst->prepare("SELECT * FROM tablename WHERE xyz = :VAR1"); // prepare statement with placeholder(s)
$v = array(':VAR1' => 'aValue'); // set up an array with corresponding values
$r1 = $stmnt->execute($v); // execute statement with values
if (!$r1){ echo "PANICMODE";}else{ var_dump($stmnt->fetchAll()));
Это PDO, а не mysqli. Конечно, у PDO тоже есть мои предпочтения.
Да, это верно. Но если честно - это 2018 год. Mysqli должен исчезнуть, даже с ООП :)
К сожалению, так работает не так. Вопрос ~> Решающий ответ. Это могло быть отмечено как ответ, но поверьте мне, это исключение. «Knoop dat tussen je oren», как мы говорим по-голландски, так как это поможет вам в будущем.
Я признаю - неправильно прочитал его вопрос как «как я могу использовать подготовленные операторы и ООП». Извините, & Bedankt voor je советует!
Вы видели документация? Какие из этих частей неясны?