您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在“?”附近使用的正确语法。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?'
当我执行这段代码时:
$db = new Database();
$statement = $db->prepare("SHOW TABLES LIKE :table");
if(!$statement)
throw New Exception($db->errorInfo()[2]);
foreach($tables as $table){
$statement->execute(array(':table' => $table));
if($statement->rowCount() == 0)
echo 'Table ' . $table . ' doesn\'t exist';
}
我收到以下错误:
Exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 in something.php on line 4
当我像这样在 :table
周围放置单引号时不会引发错误:$statement = $db->prepare("SHOW TABLES LIKE ':table'");
- 但我认为您不应该在准备好的语句中将参数周围放置单引号?
此外,我将此属性设置为数据库:$db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
,以便在查询中使用错误语法时 $statement
为 false,因此我可以抛出异常。当PDO::ATTR_EMULATE_PREPARES
设置为true时可以执行查询。
我的问题是:使用 PDO
准备好的语句时如何检查查询中的错误?为什么我会收到语法错误?
您需要使用 PDO::ATTR_EMULATE_PREPARES
选项,因为本机准备语句只能在允许表达式的地方使用占位符。 SHOW TABLES LIKE
需要文字字符串,而不是表达式,因此您不能在那里使用本机占位符。所以把它放在你的代码之前:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
当我执行这段代码时:
$db = new Database();
$statement = $db->prepare("SHOW TABLES LIKE :table");
if(!$statement)
throw New Exception($db->errorInfo()[2]);
foreach($tables as $table){
$statement->execute(array(':table' => $table));
if($statement->rowCount() == 0)
echo 'Table ' . $table . ' doesn\'t exist';
}
我收到以下错误:
Exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 in something.php on line 4
当我像这样在 :table
周围放置单引号时不会引发错误:$statement = $db->prepare("SHOW TABLES LIKE ':table'");
- 但我认为您不应该在准备好的语句中将参数周围放置单引号?
此外,我将此属性设置为数据库:$db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
,以便在查询中使用错误语法时 $statement
为 false,因此我可以抛出异常。当PDO::ATTR_EMULATE_PREPARES
设置为true时可以执行查询。
我的问题是:使用 PDO
准备好的语句时如何检查查询中的错误?为什么我会收到语法错误?
您需要使用 PDO::ATTR_EMULATE_PREPARES
选项,因为本机准备语句只能在允许表达式的地方使用占位符。 SHOW TABLES LIKE
需要文字字符串,而不是表达式,因此您不能在那里使用本机占位符。所以把它放在你的代码之前:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);