подготовленный оператор, вызывающий ошибку цикла while

StackOverflow https://stackoverflow.com/questions/515893

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня есть следующее простое 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 чувствителен к регистру, по крайней мере, в именах столбцов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top