为啥在查询中设置 group_concat_max_len 变量会导致 PHP 的 bind_param() 出错?

Posted

技术标签:

【中文标题】为啥在查询中设置 group_concat_max_len 变量会导致 PHP 的 bind_param() 出错?【英文标题】:Why setting the group_concat_max_len variable in a query results in an error in PHP's bind_param()?为什么在查询中设置 group_concat_max_len 变量会导致 PHP 的 bind_param() 出错? 【发布时间】:2019-05-07 04:40:05 【问题描述】:

我有以下疑问:

$query = <<<SQL
SELECT
      year,  
      count(*) AS `counter`, 
      GROUP_CONCAT(team) AS `team_list` 
    FROM
      team_list 
    WHERE year IS NOT NULL              
SQL;

if (!empty($sql))  //$sql is an array of SQL WHERE statements "a IN (a,b,c)"
    $query .= ' AND ' . implode(' AND ', $sql);
 
    

    $query .= 'GROUP BY year ORDER BY year';
    
    
    /////////////////////////////
    //EXECUTING THE QUERIES
    /////////////////////////////
    
    //Filter count to know how many 's' variable have to be bind to the prepared statement
    $filterCount = count($teams) + count($countries) + count($years) + count($rankings); //These are my ajax elements that are also used in the $sql variable
        
    //Data query
    $queryYears = $connection->prepare($query);
    $queryYears->bind_param(str_repeat('s', $filterCount), ...$teams, ...$countries, ...$years, ...$rankings);
    $queryYears-> execute();

这一切都很好!

问题

但是,一旦我尝试在查询语句的开头输入SET SESSION group_concat_max_len = 1000000;,我就会收到以下错误:

Fatal error: Uncaught Error: Call to a member function bind_param() on boolean

我知道我的查询现在有问题,但是当将它复制粘贴到我的 DBMS 时,可以毫无问题地执行查询。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

您的问题是您试图一次执行两个查询,而mysqli::prepare 不支持,因此它失败并返回 false。相反,首先将变量集作为单独的查询运行:

$connection->query("SET SESSION group_concat_max_len = 1000000;") or die($connection->error);
$queryYears = $connection->prepare($query) or die($connection->error);
// etc.

请注意,您应该检查通话状态,就像我在上面的代码中所做的那样。

【讨论】:

感谢我的问题的解决方案和检查通话状态的评论!

以上是关于为啥在查询中设置 group_concat_max_len 变量会导致 PHP 的 bind_param() 出错?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要在 BigQuery 中设置“asia-northeast1”的处理位置?

为啥无法在 IdentityServer 中设置选项?

为啥我不能在 React 中设置这个状态?

为啥我没有在 kivy 中设置?

为啥 ORM 不自动在内存中设置反向关联?

为啥这个变量没有在 setTimeout 函数中设置?