Передача ссылочной проблемой с PHP 5.3.1

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

Мы обновили наши dev серверы от 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 предупреждение бросает каждый раз, с или без ссылки.

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

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

Спасибо.

32
задан hakre 1 April 2013 в 12:29
поделиться

7 ответов

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

16
ответ дан 27 November 2019 в 20:21
поделиться

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

function(&$arg) {

}

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

function wrapper($stmt, &$passArray) {
    call_user_func_array($stmt, $passArray);
}
2
ответ дан 27 November 2019 в 20:21
поделиться

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

Мой обходной путь должен был остановить использование mysqli и вместо этого использовать pdo_mysql. Он имеет гораздо проще использовать:

$pdoStmt->execute( $passArray );
0
ответ дан 27 November 2019 в 20:21
поделиться

Вторым парамером должен быть массивом. Видимо, это было только введено только в 5,3

-1
ответ дан 27 November 2019 в 20:21
поделиться

Вообще-то, имейте в виду, что в PHP 5.3.1 есть ошибка, касающаяся ссылок и всех call семейства функций:

PHP Bugs #50394: Reference argument converted to value in __call

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

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

6
ответ дан 27 November 2019 в 20:21
поделиться

Состояние просмотра - это своего рода хеш-карта (или, по крайней мере, вы можете думать об этом путь), которая ASP.NET использует для хранения всей временной информации о странице - например, какие опции в настоящее время выбраны в каждом поле выбора, какие значения есть в каждом текстовом поле, какая панель открыта и т.д. Его также можно использовать для хранения любой произвольной информации.

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

Просто будьте внимательны к тому, сколько информации вы храните в состоянии просмотра, хотя... он может быстро раздуться и медленно передаваться каждый раз на сервер и обратно.

Что касается шифрования, я не знаю, насколько он силен, но он точно не легко читается человеком. Я бы не стал использовать его для получения конфиденциальной информации. Как указано в комментариях, он вообще не зашифрован. Просто база закодирована, что легко обратимо.

-121--1890803-

Вы можете сначала немного манипулировать. например, заменить все новые строки на пробелы, затем заменить 2 вхождения и другие < br/> на другой разделитель, например | . после этого вы можете получить свои поля.

html="""
Company A<br />
123 Main St.<br />
Suite 101<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
Company B<br />
456 Main St.<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
"""
import re
newhtml=html.replace("\n","")
pat=re.compile("(<br \/>){2,}",re.DOTALL|re.M)
print pat.sub("|",newhtml)

вывод

$ ./python.py
Company A<br />123 Main St.<br />Suite 101<br />Someplace, NY 1234|Company B<br />456 Main St.<br />Someplace, NY 1234|

Теперь информация о компании разделена трубами.

-121--3383505-

Я только что столкнулся с этой же проблемой, вызвав 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;

}
45
ответ дан 27 November 2019 в 20:21
поделиться

У нас возникла та же проблема с этим кодом:

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

Мое решение заключалось в том, чтобы просто пропустить call_user_func полностью и сделать следующее:

$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);
3
ответ дан 27 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: