Как установить режим SQL при использовании PDO? - PullRequest
8 голосов
/ 07 августа 2011

Я пытаюсь установить режимы SQL, я не могу понять, как это сделать с помощью PDO.Я пытаюсь установить традиционный режим в MySQL и не разрешать недопустимые даты.

Может кто-нибудь помочь?

Ответы [ 3 ]

13 голосов
/ 13 января 2012

Это относится только к вашему соединению. Команда будет запущена, как только PDO подключится:

$pdo = new PDO(
     $dsn, 
     $username, 
     $password, 
     array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"') 
);

См. PHP: MySQL (PDO)
См. 5.1.6. Режимы SQL сервера

11 голосов
/ 08 марта 2013

Вы можете использовать необязательную переменную 'SESSION' при установке sql_mode во время выполнения.Таким образом, это не повлияет на других клиентов.Вы можете установить SESSION sql_mode и затем вернуть его к предыдущему значению после завершения запроса.Таким образом, вы можете установить sql_mode для конкретной операции.

Из руководства MySql:

"Режим SQL можно изменить во время выполнения с помощьюс помощью инструкции SET [GLOBAL | SESSION] sql_mode = 'mode' для установки системного значения sql_mode. Установка переменной GLOBAL требует привилегии SUPER и влияет на работу всех клиентов, которые подключаются с этого времени. Установка переменной SESSION влияет только натекущий клиент. Любой клиент может изменить свое собственное значение sql_mode сеанса в любое время. "

Я лично добавил несколько методов в свой класс базы данных, чтобы справиться с этим.initSqlMode () выполнит запрос SELECT SESSION.sql_mode и сохранит значение по умолчанию в качестве переменной класса.setSqlMode () позволит вам установить SESSION sql_mode в (VALIDATED) пользовательское значение.resetSqlMode () устанавливает для SESSION sql_mode значение по умолчанию.Я использую переменную SESSION, когда постоянно манипулирую sql_mode.

Тогда вы можете сделать что-то вроде следующего.Обратите внимание, что это только psuedocode;в моем примере нет ничего, чтобы предотвратить внедрение SQL или параметризацию запроса SQL.

$db = new database();
$badqueryresult = $db->executeStrict('BAD SQL QUERY');
Class database {
     ...
     function executeStrict($query){
      $this->initSqlMode();
      $this->setSqlMode('STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION');
      $result = $this->Execute($query);
      $this->resetSqlMode();
      return $result;
     }
}
2 голосов
/ 15 ноября 2012
function get_pdo($c =false){

    if (!$c){$c=get_config();}
    $pdo=new PDO($c['dsn'] , $c['db_user'], $c['db_password']);
    $better_sql_defaults=array (
        'SET SESSION sql_warnings=1',
        'SET NAMES utf8',
        'SET SESSION sql_mode = "ANSI,TRADITIONAL" ',
    );

    // throw an exception on errors
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    foreach ($better_sql_defaults as $sql){
        $pdo->query($sql);
    }
    return $pdo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...