Подготовленные утверждения - количество строк

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

Мое подготовленное выражение выглядит следующим образом:

if($stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ?ORDER BY id ASC")) 
    {
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();

    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);

    /* Fetch the value */
    $stmt -> fetch();

    /* Close statement */
    $stmt -> close();
   }

Я понимаю, что я должен сначала сохранить результаты, а затем использовать num_rows, например:

$stmt->store_result();
$stmt->num_rows;

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

Итак, возникает вопрос: что мне не хватает в вычислении количества строк внутри подготовленного оператора, тогда как бы я отобразил его с помощью <?php echo '# rows: '.$WHATGOESHERE;?>

Спасибо!!

Ответ 1

num_rows возвращает номер, вы должны сохранить его в переменной.

/*.....other code...*/
$numberofrows = $stmt->num_rows;
/*.....other code...*/

echo '# rows: '.$numberofrows;

Таким образом, полный код должен выглядеть примерно так:

if($stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ? ORDER BY id ASC")) 
    {
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();

    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);

    /* Fetch the value */
    $stmt -> fetch();
    $numberofrows = $stmt->num_rows;

    /* Close statement */
    $stmt -> close();
   }
echo '# rows: '.$numberofrows;

Ответ 2

Если вас интересует только количество строк, а не фактические строки данных, вот полный блок запроса, снабженный контрольными точками ошибок и рекомендуемым вызовом COUNT(*) в предложении SELECT.

if (!$conn = new mysqli("host", "user", "pass", "db")) {
    echo "Database Connection Error: " , $conn->connect_error;  // don't show this to the public
} else {
    if (!$stmt = $conn->prepare("SELECT COUNT(*) FROM 'table' WHERE id= ?")) {
        echo "Prepare Syntax Error: " , $conn->error;  // don't show this to the public
    } else {
        if (!$stmt->bind_param("s", $id)              // if trouble while binding to ? placeholder
            || !$stmt->execute()                      // or if trouble while executing
            || !$stmt->bind_result($num_rows)         // or if trouble while binding to $num_rows
            || !$stmt->fetch()) {                     // or if trouble while fetching the one row.
            echo "Statement Error: " , $stmt->error;  // don't show this to the public
        }else{
            echo $num_rows;
        }
        $stmt->close();                               // no longer need statement
    }
    $conn->close();                                   // no longer need connection
}

Или, если вы хотите узнать количество строк перед итерацией/обработкой строк, один из способов - объединить весь набор результатов (многомерный массив) в переменную и вызвать count()/sizeof() перед итерацией.

if (!$conn = new mysqli("host", "user", "pass", "db")) {
    echo "Database Connection Error: " , $conn->connect_error;
} else {
    if (!$stmt = $conn->prepare("SELECT field1, field2, field3 FROM table WHERE id= ? ORDER BY id ASC")) {
        echo "Prepare Syntax Error: " , $conn->error;
    } else {
        if (!$stmt->bind_param("s", $id)
            || !$stmt->execute()
            || !$result = $stmt->get_result()) {
            echo "Statement Error: " , $stmt->error;
        }else{
            $resultset = $result->fetch_all(MYSQLI_ASSOC);
            echo "<div>Num: " , sizeof($resultset) , "</div>";
            foreach ($resultset as $row) {
                echo "<div>Row: {$row['field1']} & {$row['field2']} & {$row['field3']}</div>";  // do what you like
            }
        }
        $stmt->close();
    }
    $conn->close();
}

* Я проверил оба вышеупомянутых фрагмента, чтобы быть успешным на моем локальном хосте.

Ответ 3

Посмотрите пример № 2 здесь: PHP.net

Используйте PDO:: query() для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш предполагаемый оператор SELECT, а затем используйте PDOStatement:: fetchColumn(), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.