带有绑定参数的大型查询导致 Doctrine 中的无效参数号错误
Large query with bound parameters causes invalid parameter number error in Doctrine
注意:这不是 What is maximum query size for mysql? 的副本。我的问题似乎特定于 Doctrine and/or PHP,而不是 MySQL.
我的查询如下所示:
SELECT COUNT(*) FROM post
WHERE username = :username
AND comment REGEXP '...giant regular expression...'
请注意,巨大的正则表达式不包含文本 :username
(这可能会混淆 Doctrine)。
我的 PHP 是普通的 Doctrine DQL,类似于
$connection->executeQuery($sql, ['username' => 'Frank Sinatra']);
我收到 PDO DriverException SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
。事实上,我可以从错误输出中看出 Doctrine 没有尝试输入我告诉它的参数。
经过几个小时的调试,我终于发现这与查询本身的 length 有某种关系。如果查询字符串少于 3,074 个字符,运行 就好了。此外,此问题仅发生在准备好的语句中。如果我不需要绑定任何参数,那么非常长的查询(超过 3,074 个字符)工作正常。
更令人费解的是,我只在我的本地环境 (PHP 7.2) 上遇到此错误,而不是仍在 PHP 5.6 上的生产环境。我不知道 PHP 是否是问题所在,但我想不出其他任何问题。我已经 运行 composer update
获取 PHP 7.2.
的最新版本的依赖项(Doctrine 等)
我不认为这是由于 MySQL max_allowed_packet
选项或 MySQL 中的任何其他选项的值过低,因为我可以 运行 查询在 MySQL 控制台中手动(输入参数值)并且它有效。所以,我只能责怪 Doctrine 或 PHP 本身。
有人听说过这个问题吗? PHP 或 Doctrine 中是否有一些关于最大查询长度的秘密设置,这会导致 Doctrine 以这种方式混淆?
正则表达式是什么样的,您是如何生成它的?它有问号吗?如果是这样,它会期望您为它们绑定参数。
如果您还没有,您也应该绑定正则表达式值:
$sql = 'SELECT COUNT(*) FROM post WHERE username = :username AND comment REGEXP :comment_regex;';
$connection->executeQuery($sql, [
'username' => $username,
'comment_regex' => $comment_regex,
]);
旁注:为了性能和实用性,我建议使用 ID 而不是外键的用户名(如果必须更改用户名就没意思了)。
注意:这不是 What is maximum query size for mysql? 的副本。我的问题似乎特定于 Doctrine and/or PHP,而不是 MySQL.
我的查询如下所示:
SELECT COUNT(*) FROM post
WHERE username = :username
AND comment REGEXP '...giant regular expression...'
请注意,巨大的正则表达式不包含文本 :username
(这可能会混淆 Doctrine)。
我的 PHP 是普通的 Doctrine DQL,类似于
$connection->executeQuery($sql, ['username' => 'Frank Sinatra']);
我收到 PDO DriverException SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
。事实上,我可以从错误输出中看出 Doctrine 没有尝试输入我告诉它的参数。
经过几个小时的调试,我终于发现这与查询本身的 length 有某种关系。如果查询字符串少于 3,074 个字符,运行 就好了。此外,此问题仅发生在准备好的语句中。如果我不需要绑定任何参数,那么非常长的查询(超过 3,074 个字符)工作正常。
更令人费解的是,我只在我的本地环境 (PHP 7.2) 上遇到此错误,而不是仍在 PHP 5.6 上的生产环境。我不知道 PHP 是否是问题所在,但我想不出其他任何问题。我已经 运行 composer update
获取 PHP 7.2.
我不认为这是由于 MySQL max_allowed_packet
选项或 MySQL 中的任何其他选项的值过低,因为我可以 运行 查询在 MySQL 控制台中手动(输入参数值)并且它有效。所以,我只能责怪 Doctrine 或 PHP 本身。
有人听说过这个问题吗? PHP 或 Doctrine 中是否有一些关于最大查询长度的秘密设置,这会导致 Doctrine 以这种方式混淆?
正则表达式是什么样的,您是如何生成它的?它有问号吗?如果是这样,它会期望您为它们绑定参数。
如果您还没有,您也应该绑定正则表达式值:
$sql = 'SELECT COUNT(*) FROM post WHERE username = :username AND comment REGEXP :comment_regex;';
$connection->executeQuery($sql, [
'username' => $username,
'comment_regex' => $comment_regex,
]);
旁注:为了性能和实用性,我建议使用 ID 而不是外键的用户名(如果必须更改用户名就没意思了)。