如何在使用 PDO 时设置 SQL 模式?
我正在尝试设置SQL模式,我无法弄清楚如何使用PDO进行操作。我正在尝试在MySQL中设置传统模式,不允许无效日期。
任何人都可以帮忙吗?
我正在尝试设置SQL模式,我无法弄清楚如何使用PDO进行操作。我正在尝试在MySQL中设置传统模式,不允许无效日期。
任何人都可以帮忙吗?
这仅适用于您的连接。该命令将在 PDO 连接后立即运行:
$pdo = new PDO(
$dsn,
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="TRADITIONAL"')
);
请参阅 PHP:MySQL (PDO)
请参阅 5.1.6。服务器 SQL 模式
在运行时设置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;
}
}