Хорошо, это - странная проблема, поэтому терпите меня, как я объясняю.
Мы обновили наши 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).
Кто-либо испытал это? Как я могу обойти его?
Спасибо.
Вы передаете массив элементов ($ passarriay). Второй пункт внутри пропущенный массив должен быть ссылкой, поскольку это действительно список элементов, которые вы передаете функцию.
Я думаю, что устарело, передает ссылку через функцию. В определении функции вы делаете что-то вроде:
function(&$arg) {
}
Это не помогает вам много, но вам, вероятно, не нужно передавать ссылку в любом случае. Я думаю, вы можете попробовать функцию обертки.
function wrapper($stmt, &$passArray) {
call_user_func_array($stmt, $passArray);
}
Я думаю, что mysqli_bind_param ()
и функции mysqli_bind_result ()
очень неловко использовать. Я столкнулся с тем же трудностями, поскольку вы описываете, используя их в сочетании с Call_user_func_array ()
Мой обходной путь должен был остановить использование mysqli и вместо этого использовать pdo_mysql. Он имеет гораздо проще использовать:
$pdoStmt->execute( $passArray );
Вторым парамером должен быть массивом. Видимо, это было только введено только в 5,3
Вообще-то, имейте в виду, что в PHP 5.3.1 есть ошибка, касающаяся ссылок и всех call
семейства функций:
PHP Bugs #50394: Reference argument converted to value in __call
Поведение, которое вы наблюдаете, может быть результатом этой ошибки, и любая попытка исправить ее кодом может привести к проблемам в долгосрочной перспективе.
Проблема была исправлена в SVN версии PHP. До выхода 5.3.2 вы можете скомпилировать новую версию для использования или перейти на более раннюю версию.
Состояние просмотра - это своего рода хеш-карта (или, по крайней мере, вы можете думать об этом путь), которая ASP.NET использует для хранения всей временной информации о странице - например, какие опции в настоящее время выбраны в каждом поле выбора, какие значения есть в каждом текстовом поле, какая панель открыта и т.д. Его также можно использовать для хранения любой произвольной информации.
Вся карта сериализована и зашифрована закодирована и сохранена в скрытой переменной, которая отправляется обратно на сервер всякий раз, когда вы предпринимаете какие-либо действия на странице, требующие обхода сервера. Таким образом можно получить доступ к значениям элементов управления из кода сервера. При изменении какого-либо значения в коде сервера это изменение вносится в состояние представления и отправляется обратно в браузер.
Просто будьте внимательны к тому, сколько информации вы храните в состоянии просмотра, хотя... он может быстро раздуться и медленно передаваться каждый раз на сервер и обратно.
Что касается шифрования, я не знаю, насколько он силен, но он точно не легко читается человеком. Я бы не стал использовать его для получения конфиденциальной информации. Как указано в комментариях, он вообще не зашифрован. Просто база закодирована, что легко обратимо.
Вы можете сначала немного манипулировать. например, заменить все новые строки на пробелы, затем заменить 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;
}
У нас возникла та же проблема с этим кодом:
call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);
Мое решение заключалось в том, чтобы просто пропустить call_user_func
полностью и сделать следующее:
$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);