mysqli — извлечение данных из базы данных mysql с помощью переполнения стека

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

<?php
require 'connect.php';

if(isset($_GET['school']))
{
$school = trim($_GET['school']);
$people = $db->prepare("SELECT id, name FROM users WHERE school = ? ");
$people->bind_param('s', $school);
$people->execute();
$people->bind_result($id, $name);

if(!$people->fetch())
{
echo "Invalid School Name!!";
}
else
{
while($people->fetch())
{
echo 'ID. ',$id, ' ',$name,'<br>';
}
}
}
?>

Эта проблема возникает, только когда я использую операторы if и else для вывода сообщения об ошибке «Invalid School Name !!». Если я просто использую цикл while для извлечения данных, я получу полный список. Пожалуйста, скажите мне, почему я скучаю по имени и решению для этого. Спасибо.

0

Решение

Измените условное для проверки на результат

$people->execute();
$people->store_result();
$people->bind_result($id, $name);

if($people->num_rows == 0)
{
echo "Invalid School Name!!";
}
else
{
while($people->fetch())
{
echo 'ID. ',$id, ' ',$name,'<br>';
}
}
0

Другие решения

Ваш первый тест $people->fetch(), Если ответ не ложный, то он делает это снова и выполняет код в цикле до последнего элемента. Таким образом, проблема if заключается в том, что при прохождении теста она проходит первый элемент.

Чтобы решить эту проблему, просто удалите условие if: если в запросе нет людей,

while( $people->fetch() ) {
Do_something(); }

…будет прыгать, и все будет работать, как ожидалось.

Чтобы добавить сообщение об ошибке, используйте try / catch или проверьте, вошли ли вы в цикл или нет с логическим значением (возможно, существуют и другие методы).

2

По вопросам рекламы [email protected]