Я пытаюсь установить режимы SQL, я не могу понять, как это сделать, используя PDO. Я пытаюсь установить традиционный режим в MySQL и не допускать недопустимые даты.
Может ли кто-нибудь помочь?
При установке sql_mode во время выполнения вы можете использовать необязательную переменную «SESSION». Таким образом, это не повлияет на других клиентов. Вы можете установить SESSION sql_mode, а затем вернуть его к предыдущему значению после завершения запроса. Таким образом вы можете установить sql_mode для конкретной операции.
Из руководства MySql:
«Вы можете изменить режим SQL во время выполнения, используя оператор SET [GLOBAL | SESSION] sql_mode = 'modes', чтобы установить системное значение 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; } }
Это относится только к вашему соединению. Команда будет запущена, как только PDO подключится:
$pdo = new PDO( $dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"') );
См. PHP: MySQL (PDO)
См. 5.1.6. Режимы сервера SQL
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; }