Подготовленный оператор PHP ООП

Работая над страницей добавления продукта с использованием 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>";
    }
  }
?>

Вы видели документация? Какие из этих частей неясны?

Nico Haase 22.06.2018 14:18

return in __construct бесполезен, и __construct не должен использоваться для получения соединения снаружи, когда он защищен

Eakethet 22.06.2018 14:18

Ваш сценарий широко открыт для Атака с использованием SQL-инъекции Даже если вы избегаете ввода, это небезопасно! Используйте подготовленные параметризованные операторы в API MYSQLI_ или PDO

RiggsFolly 22.06.2018 14:21

Было бы полезно, если бы вы точно описали, в чем проблема / ошибка.

RiggsFolly 22.06.2018 14:22
new mysqli(... возвращает объект, а не boolean. Попробуйте сначала проверить - php.net/manual/en/…
waterloomatt 22.06.2018 14:22

Что такое prepare_string? Если он экранирует данные, я настоятельно рекомендую вам прекратить это делать и вместо этого использовать подготовленные / параметризованные запросы. Если вам нужен подход класса db, вы можете предпочесть использование PDO над Mysqli, поэтому я предлагаю попробовать

JimL 22.06.2018 14:24

Цените ваши рекомендации, я проверю их :)

EdwardK 22.06.2018 14:31

Слушайте @JimL. В частности, построение строки для запроса, как вы это сделали, является серьезной проблемой безопасности. Прочтите об атаках с использованием SQL-инъекций и используйте параметризованные запросы.

Dragonthoughts 22.06.2018 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот класс, который я часто использую. Он получает логин из отдельного .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 тоже есть мои предпочтения.

Xorifelse 22.06.2018 16:18

Да, это верно. Но если честно - это 2018 год. Mysqli должен исчезнуть, даже с ООП :)

C4pt4inC4nn4bis 22.06.2018 17:52

К сожалению, так работает не так. Вопрос ~> Решающий ответ. Это могло быть отмечено как ответ, но поверьте мне, это исключение. «Knoop dat tussen je oren», как мы говорим по-голландски, так как это поможет вам в будущем.

Xorifelse 22.06.2018 22:53

Я признаю - неправильно прочитал его вопрос как «как я могу использовать подготовленные операторы и ООП». Извините, & Bedankt voor je советует!

C4pt4inC4nn4bis 23.06.2018 10:45

Другие вопросы по теме