此问题在此处已有答案:
mysqli bind_param() expected to be a reference, value given(3个答案)
4小时前关门了。
我的数据库类有一个问题。我有一个方法,它接受一个预处理语句和任意数量的参数,将它们绑定到语句,执行语句并将结果格式化为多维数组。一切都很好,直到我尝试在其中一个参数中包含一个电子邮件地址。电子邮件包含一个@字符,这个字符似乎破坏了一切。当我提供参数时:
$types = "ss" and $parameters = array("email@domain.com", "testtest")
我得到错误:
警告:mysqli_stmt_bind_param()的参数3应为引用,值在第63行的... db/Database.class.php中给定
方法如下:
private function bindAndExecutePreparedStatement(&$statement, $parameters, $types) {
if(!empty($parameters)) {
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($statement, $types), &$parameters));
/*foreach($parameters as $key => $value) {
mysqli_stmt_bind_param($statement, 's', $value);
}*/
}
$result = array();
$statement->execute() or debugLog("Database error: ".$statement->error);
$rows = array();
if($this->stmt_bind_assoc($statement, $row)) {
while($statement->fetch()) {
$copied_row = array();
foreach($row as $key => $value) {
if($value !== null && mb_substr($value, 0, 1, "UTF-8") == NESTED) { // If value has a nested result inside
$value = mb_substr($value, 1, mb_strlen($value, "UTF-8") - 1, "UTF-8");
$value = $this->parse_nested_result_value($value);
}
$copied_row[$ke<y] = $value;
}
$rows[] = $copied_row;
}
}
// Generate result
$result['rows'] = $rows;
$result['insert_id'] = $statement->insert_id;
$result['affected_rows'] = $statement->affected_rows;
$result['error'] = $statement->error;
return $result;
}
我得到一个建议:
array_merge正在将参数转换为合并中的字符串,请将其更改为&$parameters,以使其保持引用
所以我尝试了那个(方法的第3行),但它没有做任何区别。
我应该怎么做?有没有更好的方法来做这个没有调用_用户_函数_数组?
1条答案
按热度按时间wlp8pajw1#
我在Zend Framework的MySQLi适配器中编写了参数绑定代码。我发现MySQLi的参数绑定API很难使用。需要引用的不是数组,而是数组的 * 每个元素 *。
您可以看到我在这个类的
_execute()
方法中编写的代码:http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Statement/Mysqli.php我建议你看看PDO,它更容易使用。你可以绑定参数,但是把参数值数组作为一个数组传递给PDOStatement的
execute()
方法会更容易。