我的数据库类有问题。我有一个方法,它采用一个准备好的语句和任意数量的参数,将它们绑定到语句,执行语句并将结果格式化为多维数组。一切正常,直到我尝试在其中一个参数中包含电子邮件地址。该电子邮件包含一个@ 字符,并且该字符似乎破坏了一切。当我提供参数时:
$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 行),但没有任何区别。
我应该怎么做?没有 call_user_func_array 有没有更好的方法来做到这一点?
更新:我发现了一个不太漂亮的方法来解决这个问题。我所做的是创建一个带有循环的新引用数组并使用它来代替。
private function bindAndExecutePreparedStatement($statement, $parameters, $types)
{
if(!empty($parameters)) {
$parameters_references = array();
foreach($parameters as $key => $parameter) {
$parameters_references[] = &$parameters[$key];
}
call_user_func_array('mysqli_stmt_bind_param',
array_merge(array($statement, $types), $parameters_references));
}
....
我仍然对使用 PDO 解决这个问题感兴趣,它似乎还有很多其他功能。我只是还没学会使用它。