У меня проблема с моим классом базы данных. У меня есть метод, который принимает один подготовленный оператор и любое количество параметров, связывает их с оператором, выполняет оператор и форматирует результат в многомерном массиве. Everthing отлично работает, пока я не попытаюсь включить адрес электронной почты в один из параметров. Письмо содержит символ @, и, похоже, он все сломает. Когда я поставляю с параметрами:Невозможно связать строку, содержащую @ char, с mysqli_stmt_bind_param
$types = "ss" and $parameters = array("[email protected]", "testtest")
Я получаю ошибку:
Warning: Parameter 3 to mysqli_stmt_bind_param() expected to be a reference, value given in ...db/Database.class.php on line 63
Вот метод:
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;
}
Я получил одно предложение, что:
the array_merge is casting parameter to string in the merge change it to &$parameters so it remains a reference
Так что я попробовал на (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, кажется, л, как это имеет много других функций, а также. Я просто еще не научился использовать его.
Благодарю вас, я прошу кое-что прочитать. :-) – Tirithen
я нашел менее симпатичный способ решения этого: частных функций bindAndExecutePreparedStatement ($ ПОЛОЖЕНИЯ, параметры $, $ типов) {\ п , если { $ parameters_references = массив ((пусто ($ параметров)!)); foreach ($ parameters as $ key => $ parameter) { $ parameters_references [] = & $ parameters [$ key]; } call_user_func_array ('mysqli_stmt_bind_param', array_merge (массив ($ statement, $ types), $ parameters_references)); } .... Я по-прежнему заинтересован в решении этого вопроса с помощью PDO, похоже, что он имеет много других функций. Я просто еще не научился использовать его. – Tirithen
Комментарий выше получил немного грязно, но я сделал, чтобы создать новый массив ссылок с циклом и использовать его вместо этого. – Tirithen