Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1 2
Бьюсь вторые сутки, помогите разобраться.
Есть такой код
Fatal error: Call to a member function bind_param() on a non-object in D:\locNet\UsbWebserver\Root\test\indext.php on line 7
Вот какого это все происходит?!?!??
Вот код conf_test.php
Неактивен
Вам следует выполнять проверку на ошибку при выполнении $stmt = $mysqli->prepare("CALL add_data(?)");
Тогда будет ясно в чем причина
Неактивен
В примерах из описания сделано так
if ($stmt = $mysqli->prepare("ЗАПРОС")) {
$stmt->bind_param("s", $var);
....
Само описание ошибки говорит о том что такое возможно если ЗАПРОС не имеет смысла (неверный).
В моем случае запрос ведь верный (проверена и хранимка и вызов ее из PHP скрипта)
Я немогу понять почему она работает не всегда. Причем независимо от передаваемых параметров.
Делал уже вообще тупую хранимую процедуру
BEGIN
SELECT 1;
END;
Вызываю из скрипта, работает. Начинаю запускать снова и снова и на какой то раз вываливается ошибка. Почему? Почему 10 раз (условно) работает, а на 11 Fatal error:?
Неактивен
в примерах сказано про else?
else {
printf("Errormessage: %s\n", $mysqli->error);
}
Без кода ошибки понять в чем причина трудно
Неактивен
Блин, вот что значит опыт... =/
Да, действительно в примерах не сказано про
else {
printf("Errormessage: %s\n", $mysqli->error);
}
Но ведь это очевидно было сделать... а я...
Вобщем спасибо огромное за "намек"
Ошибка вот такая
Errormessage: Lost connection to MySQL server during query
Errormessage: MySQL server has gone away
...
и так 10 раз столько сколько идет цикл
...
Хоть и неясно чего вдруг не может соединится... хм. Но это уже что то. буду разбираться. Хотя может вы чего подсоветуете
Неактивен
Похоже, что mysql-сервер регулярно падает и перезапускается и это происходит во время запроса. Посмотрите логи сервера (в линукс /var/log/mysqld.log ), в нем должна присутствовать ошибка.
Причины могут быть разные - памяти не хватает, не хватает места на диске, бага в движке.
Неактивен
Я использую локальный сервер (USBwebserver 7.0) будем разбираться с ним.
Спасибо вам огромное!!! Рад что нашел ваш сайт.
Так начало прояснятся.
Я ведь работаю под виндой... и у нее есть проблемы с количеством соединений. Видимо в этом и проблема.
Есть патч для исправления ситуации. Как посталю-попробую, отпишусь, вдруг еще кто попадется.
Отредактированно MaxRed (28.10.2008 16:05:41)
Неактивен
Патч не решил проблемы
Для тестов сделал вот так (вообще без своих классов)
Отредактированно MaxRed (29.10.2008 14:39:59)
Неактивен
Посмотрите что в логах сервера
Неактивен
В логах мускула только это
081029 13:35:33 [Note] D:/UsbWebserver/Mysql/bin/mysqld-nt_usb.exe: ready for connections.
Version: '5.0.24a-community-nt' socket: '' port: 3306 MySQL Community Edition (GPL)
081029 13:36:51 [Note] D:/UsbWebserver/Mysql/bin/mysqld-nt_usb.exe: ready for connections.
Version: '5.0.24a-community-nt' socket: '' port: 3306 MySQL Community Edition (GPL)
В логах Апача ошибки функций библиотеки mysqli (ну ясное дело)
Неужели трабла в библиотеке
Дело в том что если сделать такой запрос $stmt = $mysqli->prepare("SELECT 1") , то баги никогда не возникает, а вот если вызываю хранимку то бага.
Блин, начинаю поглядывать в сторону файрберда... а нехочется то как...
Отредактированно MaxRed (29.10.2008 14:45:52)
Неактивен
То, что написано в логах свидетельствует о том, что mysql-сервер постоянно перезагружается. Поэтому дело не в апаче и не в скрипте, а в запросе, который выполняете. Выходит, что он валит сервер.
Неактивен
Да не, это я в это время ребутил сервер. Он стабилен.
Запрос валит... хм почему в этом то и вопрос, ведь запрос прост как бит - SELECT 1
Причем я ж говорю именно такая реакция если делаю через хранимую процедуру
Отредактированно MaxRed (29.10.2008 16:59:59)
Неактивен
Ясно, значит клиент не работает с хранимыми процедурами.
Неактивен
rgbeast написал:
Ясно, значит клиент не работает с хранимыми процедурами.
Есть ли другие возможности работать с хранимками из PHP кроме mysqli?
Неактивен
Нормально работает с ХП и MySQLi и PDO.
Просто разработчики в мануале мозги запудрили народу по их применению.
Поймите главное.
Хранимая процедура для клиента ТАКОЙ ЖЕ ЗАПРОС как и обычный SELECT , INSERT etc. Просто в запросе у вас CALL написано.
Забудьте про параметры out, биндовку и т.п.
Нафиг оно не надо.
На PDO что-то вроде. Навороты личные поубивал. Может не заработать.
Отредактированно EugeneTM (29.10.2008 19:11:34)
Неактивен
Есть ли другие возможности работать с хранимками из PHP кроме mysqli?
Ну, вообще-то обычная функция есть: mysql_query(). Почему бы ей не пользоваться?
Неактивен
А на кой тут вообще PREPARE?
Неактивен
Засчет того, что PREPARED STATEMENTS обрабатываются парсером один раз, при первом вызове, а не при каждом выполнении, они иногда работает быстрее, чем несколько отдельных обычных запросов.
Хотя из логики приводимого скрипта необходимость их использования не ясна.
Неактивен
Это понятно.
Но только если запрос выполнять.
Хранимую процедуру парсер уже прошел. Вызов ХП парсим?
Неактивен
Спасибо, уже хоть что то.
Дело не в цикле. Цикл был взят ДЛЯ ТЕСТОВ.
Просто я когда работал со своими реальными функциями, стали вываливаться неясные ошибки, я стал тестить и в итоге понял что НЕМОГУ вызвать хранимку и быть уверен что вызов пройдет без ошибок.
Спасибо за вот это
mysql_q("PREPARE my_statement FROM 'CALL add_data(?)'");
mysql_q("SET @a = $h");
$sql = "EXECUTE my_statement USING @a";
Незнал. Насклько я был знаком с работой с MySQL в ПХП думал что нельзя выполнять подготовку запросов и пользоваться хранимками используя старую библиотеку mysql. Знал что есть mysqli ну и началось.
Буду пробовать дальше уже опираясь на советы. Вообще есть подозрение на мой USBWebserver.
Я ведь тест уже урезал до предела
Отредактированно MaxRed (30.10.2008 10:48:06)
Неактивен
А зачем готовить вызов хранимой процедуры?
Кто нибудь сможет ответить?
Неактивен
EugeneTM написал:
А зачем готовить вызов хранимой процедуры?
Кто нибудь сможет ответить?
Я может чего то не знаю, просто хотелось бы в процедуру передавать параметры, и делать это безопасно (я про скл-иньект), а подготовка запроса обеспечит безопасность. Если можно иначе (без всяких там магик-квотесов) расскажите, буду рад.
Неактивен
MaxRed написал:
EugeneTM написал:
А зачем готовить вызов хранимой процедуры?
Кто нибудь сможет ответить?Я может чего то не знаю, просто хотелось бы в процедуру передавать параметры, и делать это безопасно (я про скл-иньект), а подготовка запроса обеспечит безопасность. Если можно иначе (без всяких там магик-квотесов) расскажите, буду рад.
В MySQLi
$param = $mysqli->real_escape_string($str); // искейпишь параметр - это всегда делать и не только по соображениям безопасности и не только с процедурами.
$result = $mysqli->query("CALL test_proc('$param')") // выполняешь процедуру. Счас не помню - могу путать в каком месте одинарные в каком двойные кавычки при этом вызове
В PDO аналог real_escape_string - quote
Процедура - это уже подготовленный запрос(ы), которому ты подпихиваешь параметры. Только функционально мощнее на порядок.
Неактивен
Для безопасной работы с MySQL достаточно одной-единственной функции - mysql_escape_string(). Пропускайте передаваемые параметры через неё, и всё будет хорошо.
Судя по приводимому коду, у Вас создание PREPARE STATEMENT лишнее, вызывайте просто процедуру:
Неактивен
LazY написал:
Кстати. А зачем вообще бывают нужны всякие там mysqli и тому подобное? Удобнее так?
(реально интересно, т.к. сам никогда не использовал, всегда писал через mysql_query() и т.п.; хотел, вот, узнать, мошт что-то теряю :о)
В MySQLi к примеру есть multiquery.
В ХП делаешь 10 SELECT'ов - потом из результата последовательно забираешь
PDO просто удобнее, кодить в разы меньше.
Можно конечно MySQL обернуть - дык PDO и получается :-)
Неактивен
Страниц: 1 2