2011-02-27 99 views
0

我一直试图让这个工作在大部分时间都无济于事。绑定参数错误(PHP)

基本上,我想bind_param()的一个foreach()循环中,但是,当我这样做,我得到以下错误:

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in /nfs/domains/domain.com/html/v2/includes/classes/class.Database.php on line 72 

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in /nfs/domains/domain.com/html/v2/includes/classes/class.Database.php on line 72 

我假设这是由于PHP认为由于循环内部有单个bind_param()语句,只有一个参数被绑定,因此它与prepare语句中指定的参数数量不匹配。

如果这是正确的,我该如何纠正?

代码提取物(管线19):

public function query($sql, $params) { 

    if(!$sobj = $this->conn->prepare($sql)) { 

     die('Query Prepare Error (' . $this->conn->mysqli_errno . ') ' 
      . $this->conn->mysqli_error); 

    } else { 

     if(!is_array($params)) { 

      $params = array_slice(func_get_args(), 1); 

     } 

     foreach($params as $value) { 

      $type = strtolower(gettype($value)); 
      $sobj->bind_param($type[0], $value); 

     }      

     $sobj->execute(); 
     $sobj->bind_result($result); 
     $sobj->fetch(); 

     $sobj->close(); 

     return $result; 

    } 

} 

感谢。

+0

请粘贴查询,发现错误。没有它就很难进行调试。 – 2011-02-27 04:07:49

回答

2

mysqli_stmt::bind_param期望您在一次调用中绑定所有必要的参数,而不是在多次连续调用中。这将需要更多这样的:

$types = ''; 
foreach($params as $value) { 
    $types.= substr(strtolower(gettype($value)), 0, 1); 
} 
call_user_func_array(array($sobj, 'bind_param'), array_merge(array($types), $params))); 

不要看警告有关call_user_func_arrayhere虽然。

+0

感谢您的帮助。 – Rubarb 2011-03-04 21:39:41