Задать вопрос
@Aigerim1108

Как правильно использовать mysqli_num_rows()?

В моей задаче на странице должны отображаться комментарии к выбранной записи, а если никто не прокомментировал запись нужно сообщить об этом.
$query_comments = "SELECT * FROM comments WHERE art_id = $note_id";
$s_note = mysqli_query($link, $query_comments);
while ($n = mysqli_fetch_array($s_note))
{
if(mysqli_num_rows($query_comments)==0)
echo "Эту запись еще никто не комментировал";
else
echo $n ['comment'], "<br>";
}
  • Вопрос задан
  • 1288 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это очень хороший вопрос.
Ответ на него - никак не использовать.

Да, в mysqli действительно есть специальная функция, которая может сказать, какое количество строк вернул запрос SELECT.
Традиционно употребляется в двух случаях:

а) когда это не нужно
б) когда приводит к катастрофическим последствиям

Первый вариант - это когда мы хотим узнать, вернул ли запрос хоть какие-то данные, или нет. Но на этот случай у нас есть сами данные. Зачем отдельно запрашивать их количество, если мы все равно будем эти данные получать в переменную, которую потом и можно будет использовать чтобы узнать, вернул ли запрос что-нибудь или нет.

Второй вариант - если эта функция используется чтобы посчитать, сколько строк лежит в БД. В таком варианте это будет откровенное вредительство, поскольку данных может быть очень много, и все эти данные БД должна сначала получить у себя, а потом отправить в РНР. Заняв всю доступную память или даже вызвав фатальную ошибку нехватки памяти.

Правильным решением этой задачи будет сделать запрос вида SELECT COUNT(*) FROM .... В этом случае БД сама внутри себя посчитает количество строк (очень быстро) и вернёт только одно число, которое не занимает оперативную память вообще.

Вот и получается, что функция mysqli_num_rows() является либо вредной, либо бесполезной

В данном случае надо сначала получить записи из БД
// БЕЗОПАСНО выполняем запрос
$stmt = $link->prepare("SELECT * FROM comments WHERE art_id = ?");
$stmt->bind_param("s", $note_id);
$stmt->execute();
// получаем данные
$result = $stmt->get_result();
$comments = $result->fetch_all(MYSQLI_ASSOC);
?>

А после этого уже их выводить
<?php if ($comments): ?>
    <?php foreach ($comments as $row): ?>
         <?=$row['comment']?><br>
    <?php endforeach ?>
<?php else: ?>
    Эту запись еще никто не комментировал
<?php endif ?>


Как видно, никакой mysqli_num_rows нам не понадобилось
Ответ написан
Spartak-2205
@Spartak-2205
Разработка и создание сайтов
$query_comments = "SELECT * FROM `comments` WHERE `art_id` = '{$note_id}'";
$s_note = mysqli_query($link, $query_comments);
if (mysqli_num_rows($s_note)) {
    while ($n = mysqli_fetch_assoc($s_note)) {
        echo $n['comment']."<br>";
    }
} else {
    echo "Эту запись еще никто не комментировал";
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы