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

2022-08-31 00:16:25

我正在尝试设置SQL模式,我无法弄清楚如何使用PDO进行操作。我正在尝试在MySQL中设置传统模式,不允许无效日期。

任何人都可以帮忙吗?


答案 1

这仅适用于您的连接。该命令将在 PDO 连接后立即运行:

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

请参阅 PHP:MySQL (PDO)
请参阅 5.1.6。服务器 SQL 模式


答案 2

在运行时设置sql_mode时,可以使用可选的“SESSION”变量。这样它不会影响其他客户端。您可以设置会话sql_mode,然后在查询完成后将其设置回以前的值。通过这种方式,您可以为特定操作设置sql_mode。

来自 MySql 手册:

“您可以在运行时使用 SET [GLOBAL|SESSION] sql_mode='modes' 语句来设置sql_mode系统值。设置 GLOBAL 变量需要 SUPER 权限,并影响从那时起连接的所有客户端的操作。设置 SESSION 变量仅影响当前客户端。任何客户端都可以随时更改自己的会话sql_mode值。

我个人在我的数据库类中添加了一些方法来处理这个问题。initSqlMode() 将执行查询 “SELECT SESSION.sql_mode” 并将默认值存储为类变量。setSqlMode() 将允许您将会话sql_mode设置为(已验证的)自定义值。resetSqlMode() 将会话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;
     }
}

推荐