为什么我不能使用 PDO/MySQL 将变量绑定到 'SHOW VARIABLE LIKE' 查询?
Why can't I bind a variable to a 'SHOW VARIABLE LIKE' query with PDO/MySQL?
我一直在研究 PHP PDO 文档,但我无法弄清楚此查询失败的原因。
查询如下:
$var = 'information_schema_stats_expiry';
$stmt = $pdo->prepare('SHOW VARIABLES LIKE :var');
$stmt->execute([':var' => $var]);
执行时出现此错误:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 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
我知道我可以通过稍微改变查询来解决这个问题。这些是我测试过的一些 有效 .
$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES LIKE "' . $var . '"');
$stmt->execute();
或者,
$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES WHERE variable_name=:var');
$stmt->execute([':var' => $var]);
或者,同上,但有
SHOW VARIABLES WHERE variable_name LIKE :var
但是,我想了解为什么 第一个查询不起作用。它让我想起了人们试图为 LIMIT
子句绑定变量的问题,但它失败了,因为数字被引用了;但是,在这种情况下,变量名 需要 被引用,所以我认为查询可以正常工作。这是一个错误,还是有记录说明此查询失败的原因?
总而言之,当我直接通过 MySQL 客户端 运行 或在 PHP:
中作为静态查询时,此查询工作正常
SHOW VARIABLES LIKE "information_schema_stats_expiry"
但是,如果我尝试使用完全相同的语法创建准备好的语句,它将失败:
SHOW VARIABLES LIKE :var
这不起作用有什么明显的原因吗?
这是 运行宁 PHP 8 和 MySQL 8.
这是一个 MySQL 限制。并非所有陈述都可以准备。 (有一个设置参数绑定的 PREPARE
语法,我们通常不会在 PHP/PDO 中看到它。你应该得到各种各样的警告。)
SHOW VARIABLES
绝对免税:
https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html#prepared-statements-permitted
我一直在研究 PHP PDO 文档,但我无法弄清楚此查询失败的原因。
查询如下:
$var = 'information_schema_stats_expiry';
$stmt = $pdo->prepare('SHOW VARIABLES LIKE :var');
$stmt->execute([':var' => $var]);
执行时出现此错误:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 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
我知道我可以通过稍微改变查询来解决这个问题。这些是我测试过的一些 有效 .
$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES LIKE "' . $var . '"');
$stmt->execute();
或者,
$var = 'information_schema_stats_expiry';
$stmt = $this->pdo->prepare('SHOW VARIABLES WHERE variable_name=:var');
$stmt->execute([':var' => $var]);
或者,同上,但有
SHOW VARIABLES WHERE variable_name LIKE :var
但是,我想了解为什么 第一个查询不起作用。它让我想起了人们试图为 LIMIT
子句绑定变量的问题,但它失败了,因为数字被引用了;但是,在这种情况下,变量名 需要 被引用,所以我认为查询可以正常工作。这是一个错误,还是有记录说明此查询失败的原因?
总而言之,当我直接通过 MySQL 客户端 运行 或在 PHP:
中作为静态查询时,此查询工作正常SHOW VARIABLES LIKE "information_schema_stats_expiry"
但是,如果我尝试使用完全相同的语法创建准备好的语句,它将失败:
SHOW VARIABLES LIKE :var
这不起作用有什么明显的原因吗?
这是 运行宁 PHP 8 和 MySQL 8.
这是一个 MySQL 限制。并非所有陈述都可以准备。 (有一个设置参数绑定的 PREPARE
语法,我们通常不会在 PHP/PDO 中看到它。你应该得到各种各样的警告。)
SHOW VARIABLES
绝对免税:
https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html#prepared-statements-permitted