подготовленный оператор, вызывающий ошибку цикла while
Вопрос
У меня есть следующее простое PHP-приложение mysqli, которое должно работать нормально.$pk принимается идеально и является допустимым ARTICLE_NO, а запрос работает отлично, если он выполняется непосредственно MySQL.Я поставил выходные операторы после каждого события и всех, кроме проверки во время выполнения.Цикл while никогда не запускается, и я не знаю, почему.
редактировать:Я сузил проблему до того, что возвращается 0 строк, но понятия не имею, почему, поскольку тот же запрос в phpmyadmin дает правильный результат.
редактировать2:если я избавлюсь от цикла while и просто получу
if (!$getRecords->fetch()) {
printf("<p>ErrorNumber: %d\n", $getRecords->errno);
}
Это показывает, что ошибка равна 0.Таким образом, никакие записи не извлекаются и ошибок нет, но это действительный запрос.
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
$pk = $_GET["pk"];
$con = mysqli_connect("localhost", "", "", "");
if (!$con) {
echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
exit;
}
$con->set_charset("utf8");
echo "test outside loop";
if(1 < 2) {
echo "test inside loop";
$query1 = 'SELECT ARTICLE_NO FROM AUCTIONS WHERE ARTICLE_NO = ?';
if ($getRecords = $con->prepare($query1)) {
echo "inside second loop";
$getRecords->bind_param("i", $pk);
echo "test after bind param";
$getRecords->execute();
echo "test after bind execute";
$getRecords->bind_result($ARTICLE_NO);
echo "test after bind result";
while ($getRecords->fetch()) {
echo "test inside while";
echo "<h1>".$ARTICLE_NO."</h1>";
}
}
}
редактировать:
Я попробовал с этим кодом:
<?php
$mysqli = new mysqli("localhost", "", "", "");
$pk = $_GET["pk"];
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT ARTICLE_NAME, WATCH FROM AUCTIONS WHERE ARTICLE_NO = ? LIMIT 5")) {
$stmt->bind_param("i", $pk);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
/* fetch values */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Это работает без $pk, если я уберу параметры, все будет работать нормально.Получить pk через GET не проблема, потому что если я назначу $pk = 1;вместо этого он все равно терпит неудачу.1 является действительным ARTICLE_NO, а ВЫБЕРИТЕ ARTICLE_NAME, СМОТРЕТЬ НА АУКЦИОНАХ, ГДЕ ARTICLE_NO = 1 LIMIT 5 отлично работает в phmyadmin.
редактировать:проблема заключалась в том, что mysqli не могла обработать bigint, теперь я использую k как строку, и она работает нормально.
Решение
Проверьте значение:
$getRecords->num_rows
что должно помочь выявить, было ли ранее SELECT
на самом деле возвращает какие-либо данные
Возможно, вам также придется добавить:
$getRecords->store_result()
сначала убедитесь, что весь запрос выполнен, прежде чем запрашивать количество строк в наборе результатов.
Кроме того, убедитесь, что вы используете $pk
в целое число!Возможно, передаваемое значение искажается.
Другие советы
Я не уверен, изменили ли вы этот код, но, похоже, вы не выбираете там базу данных, к которой хотите подключиться.
Используйте для этого mysqli_select_db(...), если это проблема.
РЕДАКТИРОВАТЬ:Также похоже, что вы используете прописные буквы для столбца, имени таблицы и т. д.
Правильно определите чувствительность к регистру, возможно, вы предполагаете нечувствительность к регистру, потому что это работает из командной строки.Насколько я знаю, драйвер mysqlI в PHP чувствителен к регистру, по крайней мере, в именах столбцов.