Я только что создал страницу, на которой можно было бы узнать имена учеников в двух школах, используя их название (это только для моей практики). Но когда я выполняю следующий код, я не получаю имя лучшего ученика в каждой школе, чье имя вверху в базе данных, но я получаю остальную часть списка.
<?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 для извлечения данных, я получу полный список. Пожалуйста, скажите мне, почему я скучаю по имени и решению для этого. Спасибо.
Измените условное для проверки на результат
$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>';
}
}
Ваш первый тест $people->fetch()
, Если ответ не ложный, то он делает это снова и выполняет код в цикле до последнего элемента. Таким образом, проблема if заключается в том, что при прохождении теста она проходит первый элемент.
Чтобы решить эту проблему, просто удалите условие if: если в запросе нет людей,
while( $people->fetch() ) {
Do_something(); }
…будет прыгать, и все будет работать, как ожидалось.
Чтобы добавить сообщение об ошибке, используйте try / catch или проверьте, вошли ли вы в цикл или нет с логическим значением (возможно, существуют и другие методы).