如何在使用PDO时设置SQL模式?

M. *_* CA 9 php mysql pdo

我试图设置SQL模式,我无法弄清楚如何使用PDO.我试图在MySQL中设置传统模式,不允许无效日期.

有人可以帮忙吗?

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模式

  • 这对我来说适用于 PHP7。:) 感谢您提供这个简单的解决方案。 (2认同)

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)