За последние 24 часа нас посетили 20297 программистов и 1084 робота. Сейчас ищут 736 программистов ...

Экранирование с PDO

Тема в разделе "PHP для профи", создана пользователем biryukovm, 15 янв 2018.

  1. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Приветствую.
    У меня трабл. Я использую PDO и столкнулся с проблемой экранирования у меня бывают записи с кавычками " или ' или `
    Так вот я читал где-то что PDO экранирует сразу текст но как показывает практика нет.
    Я пишу текст с кавычками и он текст просто обрубает и все.

    Есть идеи ?
    Методы с mysql_escape_string не работают.
     
  2. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    хотелось бы взглянуть на PDO с использованием mysql_escape_string :eek:
     
  3. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Я переменную беру в mysql_escape_string и потом кидаю в PDO
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это лишнее. откройте документацию по PDO и посмотрите примеры кода.
    плейсхолдеры помогут. и ненадо будет ручками эскейпить
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @biryukovm, поддержу предыдущего оратора (@runcore).
    Ну а на крайний случай в pdo есть quote.
     
  6. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    не нужен quote, если используется ИМЕННО PDO методом prepare
     
  7. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Мне видимо легче свой код показать чтоб всем все понятно было, я давно писал класс с PDO

    Код (Text):
    1. class Database{
    2.     private $host      = DB_HOST;
    3.     private $user      = DB_USER;
    4.     private $pass      = DB_PASS;
    5.     private $dbname    = DB_NAME;
    6.     private $charset    = CHARSET;
    7.     private $dbh;
    8.     public $error;
    9.     private $stmt;
    10.  
    11.     public function __construct(){
    12.         // Установить DSN
    13.         $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=' . $this->charset;
    14.         // Настройка параметров
    15.         $options = array(
    16.             PDO::ATTR_PERSISTENT         => true,
    17.             PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION
    18.             //PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
    19.         );
    20.         // Создает новый объект PDO
    21.         try{$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);}
    22.         // Ловим ошибки
    23.         catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    24.     }
    25.  
    26.     public function query($query){
    27.         $this->stmt = $this->dbh->prepare($query);
    28.     }
    29.    
    30.     public function bind($param, $value, $type = null){
    31.         try{
    32.         if (is_null($type)) {
    33.             switch (true) {
    34.                 case is_int($value):
    35.                     $type = PDO::PARAM_INT;
    36.                     break;
    37.                 case is_bool($value):
    38.                     $type = PDO::PARAM_BOOL;
    39.                     break;
    40.                 case is_null($value):
    41.                     $type = PDO::PARAM_NULL;
    42.                     break;
    43.                 default:
    44.                     $type = PDO::PARAM_STR;
    45.             }
    46.         }
    47.         $this->stmt->bindValue($param, $value, $type);
    48.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    49.     }
    50.    
    51.     public function execute(){//Запускает подготовленный запрос на выполнение
    52.         try{
    53.         return $this->stmt->execute();
    54.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    55.     }
    56.     public function resultset(){//Возвращает массив, содержащий все строки результирующего набора
    57.         try{
    58.         $this->execute();
    59.         return $this->stmt->fetchAll(PDO::FETCH_BOTH);
    60.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    61.     }
    62.     public function single(){//Извлечение следующей строки из результирующего набора
    63.         try{
    64.         $this->execute();
    65.         return $this->stmt->fetch(PDO::FETCH_BOTH);
    66.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    67.     }
    68.     public function rowCount(){//Возвращает количество строк, модифицированных последним SQL запросом
    69.         return $this->stmt->rowCount();
    70.     }
    71.     public function lastInsertId(){//возвращает последним добавленным идентификатором в виде строки
    72.         return $this->dbh->lastInsertId();
    73.     }
    74.     public function beginTransaction(){//начать транзакцию
    75.         return $this->dbh->beginTransaction();
    76.     }
    77.     public function endTransaction(){//Для завершения транзакции и зафиксировать изменения
    78.         return $this->dbh->commit();
    79.     }
    80.     public function cancelTransaction(){//Чтобы отменить транзакцию и выполнить откат изменений
    81.         return $this->dbh->rollBack();
    82.     }
    83.     public function debugDumpParams(){//Параметры , методы Дебютный Dump сбрасывает информацию , которая содержится в подготовленном заявлении.
    84.         return $this->stmt->debugDumpParams();
    85.     }
    86. }


    Может так сможете подсказать что подредактировать
    И еще бывает что надо несколько подключений на сайте можете подсказать как это сделать я вот сейчас делаю так $database = new Database();
    А чтобы разные подключения типа такого $database = new Database(1); $database = new Database(2);
     
  8. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    Всё намного проще :)

    PHP:
    1. <?php
    2.  
    3. class MySQL
    4. {
    5.     protected static $connection = null;
    6.  
    7.     public static function connection()
    8.     {
    9.         if (self::$connection === null) {
    10.             try {
    11.                 $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHAR;
    12.                 $opt = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
    13.                 self::$connection = new PDO($dsn, DB_USER, DB_PASS, $opt);
    14.             } catch (PDOException $error) {
    15.                 die($error->getMessage());
    16.             }
    17.         }
    18.         return self::$connection;
    19.     }
    20.  
    21.     public static function run($sql, $params = [])
    22.     {
    23.         $query = self::connection()->prepare($sql);
    24.         if (array_key_exists(0, $params)) {
    25.             $i = 1;
    26.             foreach ($params as $value) {
    27.                 $query->bindValue($i++, $value, self::type($value));
    28.             }
    29.         } else {
    30.             foreach ($params as $key => $value) {
    31.                 $query->bindValue($key, $value, self::type($value));
    32.             }
    33.         }
    34.         $query->execute();
    35.         return $query;
    36.     }
    37.  
    38.     public static function type($value)
    39.     {
    40.         if (is_int($value)) {
    41.             $type = PDO::PARAM_INT;
    42.         } elseif (is_string($value) || is_float($value)) {
    43.             $type = PDO::PARAM_STR;
    44.         } elseif (is_bool($value)) {
    45.             $type = PDO::PARAM_BOOL;
    46.         } elseif (is_null($value)) {
    47.             $type = PDO::PARAM_NULL;
    48.         } else {
    49.             $type = false;
    50.         }
    51.         return $type;
    52.     }
    53. }
    Несколько подключений не нужно, нужно сделать просто вызов класса для PDO в любом месте и в любое время

    PHP:
    1. define('DB_HOST', 'localhost');
    2. define('DB_NAME', 'database');
    3. define('DB_CHAR', 'utf8');
    4. define('DB_USER', 'root');
    5. define('DB_PASS', '');
    6.  
    7. spl_autoload_register(function ($class) {
    8.     require_once "{$class}.php";
    9. });
     
    #8 PhpStorm, 16 янв 2018
    Последнее редактирование: 16 янв 2018
    biryukovm нравится это.
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Тема хлам. Ей место в новичках, а не в профи.
     
  10. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Вы меня немного не поняли у меня бывает необходимость работать с 2-5 подключениями в моей админки и я на каждое подключение дублирую класс PDO но это детский сад я понимаю и надо как то по профисиональней сделать чтоб было переключение при вызове класса
    --- Добавлено ---
    Интересное у вас представление о новичках если у вас в понимании новички работают с классами и функциями то я удивлен. не думаю что вы сразу начали писать через классы не зная основы.
     
  11. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    передавайте параметры подключения в конструктор, и нет проблем.
     
  12. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    А по точнее, ведь параметры подключения надо чтоб дергались при вызове класса, а каждый раз их передовать это не безопасно лучше их хранить в классе через "private "
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нет ничего опасного в том чтобы передать логин и пароль в конструктор объекта.
    хранить настройки надо не "зашитыми" в класс, а в отдельном файле - конфиге.
    при старте приложения читать их оттуда и передавать в нужные места для инициализации зависимых компонентов.
     
  14. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Как типа джумлы ?
     
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    у вас одновременно несколько серверов баз данных что нужны разные подключения?
    --- Добавлено ---
    почти все движки отдельно хранят данные для подключения. .
    я вообще у себя все настройки приложения храню в отдельном файле а потом загружаю их в реестр)
     
  16. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    да бывает что ключи и корректировки товара на одном сервер а обработка заказов на другом и т.д
     
  17. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    сделайте реестр и там храните подключения)
     
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    На данный момент. ООП - это основа основ