我正在尝试设置SQL模式,我无法弄清楚如何使用PDO来做到这一点。我试图在MySQL中设置传统模式,不允许无效日期。
有人可以帮忙吗?
答案 0 :(得分:12)
这仅适用于您的连接。 PDO连接后,该命令将立即运行:
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"')
);
答案 1 :(得分:11)
在运行时设置sql_mode时,可以使用可选的“SESSION”变量。这样它不会影响其他客户。您可以设置SESSION sql_mode,然后在查询完成后将其设置回上一个值。通过这种方式,您可以为特定操作设置sql_mode。
来自MySql手册:
“您可以使用SET在运行时更改SQL模式 [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设置回默认值。我总是在操作sql_mode时使用SESSION变量。
然后您可以执行以下操作。注意这只是伪代码;我的例子中没有任何东西可以阻止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 :(得分:2)
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;
}