Я искал высоко и низко для ответа на этот вопрос, но безрезультатно. Я протягиваю вам своих коллег-кодеров. :-)
У меня есть следующий, казалось бы простой PHP-код:
$query = "SELECT marketid, type, quantity, price, datetime, bundleid, state, stoplossprice FROM orders WHERE type = ? AND state = ?";
$stmt = $login->mySQLi->prepare($query);
if(!$stmt) {
throw new Exception(mysqli_error($login->mySQLi));
}
$stmt->bind_param("ss", $strOrderType, $strOrderState);
if($stmt)
{
if(!$stmt->execute())
{
// Return an error
}
}
$stmt->store_result();
$stmt->bind_result($marketid, $ordertype, $quantity, $buyprice, $buydatetime, $bundleid, $orderstate, $stoplossprice);
while ($stmt->fetch()) {
// Do something with the returned data
}
$stmt->close();
У меня также почти такой же код несколько других мест, а в других местах он работает. Но по какой-то причине он заканчивается при выполнении оператора execute()
.
Кроме того, после выполнения инструкции prepare()
, $stmt->affected_rows
равно -1.
Я читал в документах MySQLi, значение -1 означает, что "-1 указывает, что запрос возвратил ошибку". Но я не могу понять, как выводить сообщение об ошибке из $stmt
. $stmt->errno
и $stmt->error
не имеют значений.
Я также проверил файл журнала для MySQL, и он показывает следующее:
141117 21:21:39 222 Подготовка SELECT marketid, тип, количество, цена, дата и время, расслоение, состояние, stoplossprice FROM orders WHERE type =? И состояние =? 222 Статистика 223 Статистика
141117 21:21:54 222 Статистика
223 Статистика
141117 21:21:55 222 Статистика
223 Статистика
141117 21:21:56 222 Статистика
223 Статистика
141117 21:21:57 222 Execute SELECT marketid, тип, количество, цена, дата и время, расслоение, состояние, стоп-лоссцена из заказов WHERE type = 'Buy' AND state = 'Pending' 223 Quit
222 Закрыть stmt
222 Выход
Помоги мне Оби-ван Кеноби, ты моя единственная надежда (и, да, поздно, я чувствую себя немного сладко)!
Я, наконец, смог найти ответ.
Перед выполнением кода, который я опубликовал, я выполнял другие операторы MySQL. В этих выражениях я выполнил mysqli_report(MYSQLI_REPORT_ALL);
,
Как я узнал в документах PHP, нужно быть осторожным при вызове mysqli_report(MYSQLI_REPORT_ALL);
, Вот выдержка из документации mysqli_report()
, объясняющая проблему:
"Будьте очень осторожны, используя эту функцию - это параметр для каждого процесса. Если ваш сервер настроен на повторное использование одного процесса PHP для нескольких запросов, это означает, что последний параметр этой функции в любом скрипте повлияет на все другие скрипты с использованием mysqli. Чтобы быть в безопасности, всегда звоните в конец скрипта. Версия PHP CGI, вероятно, безопасна от этого ".
Я добавил mysqli_report(MYSQLI_REPORT_OFF);
до конца 1-го MySQL-заявлений, и теперь он работает как шарм. Благодаря PHP-документам! И благодаря секте и Антоан Мильков за ваши усилия!
prepare
не влияет на строки в базе данных, поэтому ожидается результат -1. Вы должны проверить на наличие ошибок послеexecute
. Если есть ошибки - вставьте сюда, чтобы мы могли помочь.