Передать справочную проблему с PHP 5.3.1

Хорошо, это странная проблема, поэтому, пожалуйста, несите меня, как я объясняю.

Мы обновили наши серверы от PHP с 5.2.5 до 5.3.1.

Загружая наш код после переключения, мы начинаем получать такие ошибки, как:

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /home/spot/trunk/system/core/Database.class.php on line 105

указанная линия (105) выглядит следующим образом:

call_user_func_array(Array($stmt, 'bind_param'), $passArray);

мы изменили строку на следующую:

call_user_func_array(Array($stmt, 'bind_param'), &$passArray);

в этот момент (поскольку allow_call_time_pass_reference) выключен, php выбрасывает это:

Deprecated: Call-time pass-by-reference has been deprecated in /home/spot/trunk/system/core/Database.class.php on line 105

Попытавшись исправить это в течение некоторого времени, я сломался и установил allow_call_time_pass_reference на.

Это избавило от предупреждения Deprecated, но теперь предупреждение Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference бросает каждый раз, с или без ссылок.

У меня есть нулевая подсказка, как это исправить. Если целевой метод был моим собственным, я бы просто ссылался на входящие vars в объявлении func, но это (относительно) собственный метод (mysqli).

Кто-нибудь испытал это? Как я могу обойти это?

Спасибо.

Ответ 1

Вы передаете массив элементов ($ passArray). Второй элемент внутри переданного массива должен быть ссылкой, так как это действительно список элементов, которые вы передаете функции.

Ответ 2

Я просто испытал эту же проблему, вызвав bind_param через call_user_func_array и передав массив параметров. Решение заключается в изменении значений в массиве, на который нужно ссылаться. Он не элегантный, но он работает.

call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($passArray));

function makeValuesReferenced($arr){
    $refs = array();
    foreach($arr as $key => $value)
        $refs[$key] = &$arr[$key];
    return $refs;

}

Ответ 3

Собственно, имейте в виду, что есть ошибка с PHP 5.3.1 относительно ссылок и всего call семейства функций:

PHP-ошибки # 50394: аргумент ссылки преобразован в значение в __call

Поведение, которое вы видите, может быть результатом этой ошибки, и любая попытка исправить его код может вызвать проблемы в конечном итоге.

Проблема была исправлена ​​в версии SVN для PHP. Пока не будет выпущен 5.3.2, вы можете скомпилировать новую версию для использования или перейти на более раннюю версию.

Ответ 4

Мы столкнулись с этой же проблемой с этим кодом:

call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);

Мое решение состояло в том, чтобы просто пропустить call_user_func и сделать это:

$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);

Ответ 5

Я думаю, что устаревшее - это передача ссылки через функцию. В определении функции вы делаете что-то вроде:

function(&$arg) {

}

Это не поможет вам, но вам, вероятно, вообще не нужно передавать ссылку. Я думаю, вы могли бы попробовать функцию обертки.

function wrapper($stmt, &$passArray) {
    call_user_func_array($stmt, $passArray);
}

Ответ 6

Я думаю, что функции mysqli_bind_param() и mysqli_bind_result() очень неудобны в использовании. Я столкнулся с той же трудностью, что и вы, используя их в сочетании с call_user_func_array()

Мое обходное решение состояло в том, чтобы прекратить использование mysqli и вместо этого использовать PDO_mysql. Это гораздо проще:

$pdoStmt->execute( $passArray );

Ответ 7

Это поможет:

<?php
call_user_func_array(Array($stmt, 'bind_param'), array(&$passArray));

function bind_param ($val)
{
    $val = (is_array($val)) ? $val[0] : $val;

    // operations...
}

?>

Ответ 8

У меня есть аналогичная проблема, текущий код не работал:

$query="Select id,name FROM mytable LIMIT ?,?";
$params=Array('ii');
array_push($params,$from_var);
array_push($params,$to_var);
...
$stmt=$link->prepare("$query");
$ref=new ReflectionClass('mysqli_stmt');
$method=$ref->getMethod("bind_param");
$method->invokeArgs($stmt,$params);
...

Он сказал, что "Параметр 2 to mysqli_stmt:: bind_param() должен быть ссылкой, значение, заданное"

И затем, в отчаянии, я попытался взять $from_var и $to_var в кавычки. И это сработало!

$params=Array('ii');
array_push($params,"$from_var");
array_push($params,"$to_var");

Надеюсь, это поможет кому-то, удачи:)

Ответ 9

Второй параметр должен быть массивом. по-видимому, это было соблюдено только в 5.3