【问题标题】:Getting "wrong parameter count..." error with prepared statement使用准备好的语句获取“错误的参数计数...”错误
【发布时间】:2013-03-29 16:18:02
【问题描述】:

我一直在尝试学习准备好的语句,以便我们可以开始在我们的 PHP 站点中实现它们。此函数使用 $_POST 传输方法从搜索表单上的文本框中获取值(或无),然后使用这些文本框的名称和值将条件添加到 WHERE 子句。该函数以前有效,但我似乎无法使准备好的语句起作用。

研究了几个脚本,我开始使用下面的一个并解决了一些错误。现在当我运行它时,我得到错误 Wrong parameter count for mysqli_stmt::bind_param()

在此查询运行后,我想将值导出到表中,并且在尝试准备好的语句之前正在工作。

这是我到目前为止的代码:

  <?php

   $db = mysqli_connec("ip_address", "loginname", "password", "database");

    $refs = array('sssss');

    foreach ($_POST as $key => $value)
     {
       $refs[] =& $_POST[$key];
      }    

$query = "SELECT col1, col2, col3, col4, col5 FROM tbl_name WHERE 1=1";
    foreach ($_POST as $k => $v) 
    { 
      if(!empty($v)) {
        $query .= " AND $k = ?"; 
        $params[$k] = $v;
        }   
    }       

    $results = $db->prepare($query);        

     call_user_func_array(array($results, 'bind_param'), $refs);

    $results->execute();    

?>

【问题讨论】:

  • 开启错误报告。

标签: php mysql prepared-statement


【解决方案1】:

传递给mysqli_stmt::bind_param的参数必须通过引用传递,并且只能通过引用传递变量,所以这种情况下不能将函数的结果直接传递给call_user_func_array。此外,传递给bind_param 的第一个参数是变量类型的字符串列表。相反,试试这个:

// Change to whatever types are relevant
$refs = array('sss');

foreach ($arr as $key => $value)
{
  $refs[] =& $arr[$key];
}

call_user_func_array(array($results, 'bind_param'), $refs);

编辑

这一行是错误的:

$results = $mysqli->prepare($query);

应该是

$results = $db->prepare($query);

【讨论】:

  • 谢谢迈克尔,但仍然遇到同样的问题
  • 你看到我的编辑了吗?你没有$mysqli 变量;你有一个$db 变量。
  • $results 上执行print_r。可能是您的查询失败,因此返回 FALSE 而不是 mysqli_stmt 对象(因此使用 $db-&gt;error 来获取错误)。
  • 在其中任何一个上都没有得到任何东西。就像脚本在到达 $results 声明时停止这个错误引起了我的注意: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Array' was given
  • 然后试试var_dump。如果FALSEprint_r 不会显示任何内容。
【解决方案2】:

好的,我解决这个问题的方法是废弃所有内容并重新开始,这总是很有趣......但是适合我需要的新脚本就在这里

<?php


$dbhost     = "ip_address";
$dbname     = "db_name";
$dbuser     = "db_login";
$dbpass     = "db_pass"; 

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

    $query = "SELECT * FROM tbl_name WHERE 1=1";

    foreach ($_POST as $k => $v) 
    { 
      if(!empty($v)) {
        $query .= " AND $k LIKE ?";
        $params[] = $v;     
      }  
    }   

    $results = $conn->prepare($query);  
    $results->execute($params);

    $results->bindColumn(1, $no);
    $results->bindColumn(2, $date);
    $results->bindColumn(3, $name);
    $results->bindColumn(4, $id);
    $results->bindColumn(5, $path);

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2014-06-18
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多