подготовленный оператор, вызывающий ошибку цикла - PullRequest
0 голосов
/ 05 февраля 2009

У меня есть следующее простое приложение PHP MySQL, которое должно работать нормально. $ pk принимается отлично и является допустимым ARTICLE_NO, и запрос отлично работает при непосредственном выполнении mysql. Я поместил выходные операторы после каждого события и все, кроме tetsing, пока выполняется. Цикл while никогда не вводится, и я не уверен почему.

edit: я сузил проблему до того факта, что возвращается 0 строк, но я понятия не имею, почему тот же запрос в phpmyadmin дает правильный результат.

edit2: если я избавлюсь от цикла while и просто получу

    if (!$getRecords->fetch()) {
    printf("<p>ErrorNumber: %d\n", $getRecords->errno);
}

Это показывает, что 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.

edit: проблема заключалась в том, что mysqli не мог обрабатывать bigint, сейчас я использую k в качестве строки, и она отлично работает.

Ответы [ 2 ]

1 голос
/ 05 февраля 2009

Проверьте значение:

$getRecords->num_rows

, который должен помочь выяснить, действительно ли ранее SELECT возвращает какие-либо данные

Возможно, вам также понадобится добавить:

$getRecords->store_result()

сначала убедитесь, что вы выполнили весь запрос, прежде чем запрашивать количество строк в наборе результатов.

Также - обязательно приведите $pk к целому числу! Возможно, что передаваемое значение искажается.

0 голосов
/ 05 февраля 2009

Я не уверен, что вы изменили этот код, но вы, похоже, не выбираете базу данных, к которой хотите подключиться.

Используйте mysqli_select_db (...) для этого, если это проблема.

РЕДАКТИРОВАТЬ: похоже, вы используете заглавные буквы для столбца, имя таблицы и т. Д.

Получите правильную чувствительность к регистру, возможно, вы предполагаете нечувствительность к регистру, потому что она работает из командной строки. Насколько я знаю, драйвер mysqlI в PHP чувствителен, по крайней мере, к именам столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...