Bri*_*nio 13
这仅适用于您的连接.一旦PDO连接,该命令将立即运行:
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"')
);
Run Code Online (Sandbox Code Playgroud)
请参阅PHP:MySQL(PDO)
请参阅5.1.6.服务器SQL模式
the*_*eer 12
在运行时设置sql_mode时,可以使用可选的"SESSION"变量.这样它不会影响其他客户.您可以设置SESSION sql_mode,然后在查询完成后将其设置回上一个值.通过这种方式,您可以为特定操作设置sql_mode.
从MySql手册:
"您可以通过使用SET [GLOBAL | SESSION] sql_mode ='modes'语句来设置sql_mode系统值,从而在运行时更改SQL模式.设置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;
}
}
Run Code Online (Sandbox Code Playgroud)