使用准备好的语句获取“错误的参数计数...”错误

时间:2013-03-29 16:18:02

标签: php mysql prepared-statement

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

研究几个脚本我开始使用下面的脚本并找出一些错误。现在,当我运行它时,我收到错误错误的参数计数为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();    

&GT;

2 个答案:

答案 0 :(得分:3)

传递给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);

答案 1 :(得分:0)

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

<?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);

?>