MySQLi. Почему при выборке данных цикл может выполняться бесконечно?

12
М
На сайте с 30.01.2009
Offline
61
2033

Добрый вечер форумчане!

Решил поэкспериментировать с MySQL-i-, написал простой запрос на выборку данных из Базы mysql(стандартная база), таблицы user. При обходе строк циклом while результат одной строки выводится бесконечно, насколько я понял. Интересно что если закоментировать цикл, бесконечный перебор заканчивается, но это меня не может устроить, так как хочется увидеть всех пользователей базы. Смотрел примеры http://php.net/manual/ru, http://phpclub.ru.

Как решить проблему, в чем моя ошибка? Поясните подробно...

Код такой:

<?php

$link = mysqli_connect('localhost','root','password','mysql');

if (mysqli_connect_errno()) {

printf("Не удалось подключиться: %s\n", mysqli_connect_error());

exit();

}

$query = "SELECT User, Host FROM User ORDER by Host LIMIT 5";

$result = mysqli_query($link, $query);

if ($result){

$row = mysqli_fetch_array($result, MYSQLI_ASSOC);

// while($row){

printf("%s (%s)\n", $row["Host"], $row["User"]);

// }

mysqli_free_result($result);

}

mysqli_close($link);

?>

ок.
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1

Я вам так скажу.

mysql_ умирает и очень быстро. Я вам рекомендую сразу переходить на PDO.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
М
На сайте с 30.01.2009
Offline
61
#2
LEOnidUKG:
Я вам так скажу.

mysql_ умирает и очень быстро. Я вам рекомендую сразу переходить на PDO.

Умирает в каком смысле? Прекращается работа над развитием СУБД? Много ли проектов PHP использует PDO? Есть хорошие мануалы по PDO, насколько я знаю по MySQL куча примеров в интернет, по PDO не уверен. Насколько синтаксис и т.п. PDO отличается от MySQL?

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#3
марио:
Умирает в каком смысле? Прекращается работа над развитием СУБД? Много ли проектов PHP использует PDO? Есть хорошие мануалы по PDO, насколько я знаю по MySQL куча примеров в интернет, по PDO не уверен. Насколько синтаксис и т.п. PDO отличается от MySQL?

http://php.net/manual/ru/function.mysql-connect.php

Внимание
Данное расширение устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:

Отличный мануал: http://php.net/manual/ru/pdo.construct.php

А вы поищите про PDO удивитесь, но это стандарт для многих фреиворком. Особенно отлично PDO тем, что можно перебрасывать на любые СУБД не меняя код запросов.

М
На сайте с 30.01.2009
Offline
61
#4
LEOnidUKG:
http://php.net/manual/ru/function.mysql-connect.php



Отличный мануал: http://php.net/manual/ru/pdo.construct.php

А вы поищите про PDO удивитесь, но это стандарт для многих фреиворком. Особенно отлично PDO тем, что можно перебрасывать на любые СУБД не меняя код запросов.

Мой пример как раз с работой не MySQL, а MySQL---i---. Потому и спрашиваю, что решил перейти на новый драйвер. Может я не так написал или не понял что имеется ввиду...

C
На сайте с 26.10.2013
Offline
54
#5

if ($result){
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
while($row){ // Тут row всегда true, ведь в цикле он не переопределяется
printf("%s (%s)\n", $row["Host"], $row["User"]);
}
mysqli_free_result($result);
}

Правильный вариант такой

if ($result){
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
printf("%s (%s)\n", $row["Host"], $row["User"]);
}
mysqli_free_result($result);
}
Услуги по парсингу данных (/ru/forum/939826), единоразовый и регулярный сбор данных. Любые объемы. Скрипты на PHP, создание и доработка, решение проблем с сайтами Пишите в личные сообщения или скайп
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#6
марио:
Мой пример как раз с работой не MySQL, а MySQL---i---. Потому и спрашиваю, что решил перейти на новый драйвер. Может я не так написал или не понял что имеется ввиду...

Я о том, что бы вы не тратили время на замену mysql на mysqlI, а сразу переходили на стандарт PDO

И что за бесконечный цикл?

попробуйте вместо:

$row = mysqli_fetch_array($result, MYSQLI_ASSOC);

while($row){

Написать:

while( $row = mysqli_fetch_assoc($result) ){

М
На сайте с 30.01.2009
Offline
61
#7
LEOnidUKG:
Я о том, что бы вы не тратили время на замену mysql на mysqlI, а сразу переходили на стандарт PDO


И что за бесконечный цикл?

попробуйте вместо:
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
while($row){


Написать:
while( $row = mysqli_fetch_assoc($result) ){

Пока не уверен, что смогу найти хорошие мануалы для уверенного перехода на PDO.

Благодарю, все заработало. В чем была ошибка, то что в выборка массива каждый раз бралась с самого начала, а не передавалась как аргумент в цикл while? Или не правильно была выбрана функция mysqli_fetch_array, вместо mysqli_fetch_assoc...

---------- Добавлено 28.11.2015 в 23:17 ----------

colorito:
if ($result){

$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
while($row){ // Тут row всегда true, ведь в цикле он не переопределяется
printf("%s (%s)\n", $row["Host"], $row["User"]);
}
mysqli_free_result($result);
}


Правильный вариант такой
if ($result){

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
printf("%s (%s)\n", $row["Host"], $row["User"]);
}
mysqli_free_result($result);
}

Благодарю, этот вариант тоже рабочий. Как я понял условие выборки должно обрабатываться внутри цикла while.

siv1987
На сайте с 02.04.2009
Offline
427
#8
марио:
Как я понял условие выборки должно обрабатываться внутри цикла while.

Условия выборки находится в SQL запросе. Внутри цикла while фетчится результат запроса который возвращает false по окончанию обхода. Вы бы почитали документацию что-ли http://php.net/manual/ru/function.mysql-fetch-array.php, либо подтянули логику, потому что в вашем коде она напрочь отсутствует.

М
На сайте с 30.01.2009
Offline
61
#9

Спасибо!

Проблема решена. Была детская ошибка, возможно из-за того, что пример кода совмещался с синтаксисом старой версии MySQL. Там такой код вполне успешно работал.

$connection = mysql_connect('localhost', 'root', 'password')
or die ("Ошибка соединения с Базой Данных Сервера");
$db = mysql_select_db("mysql", $connection)
or die ("Ошибка Выбора Базы Данных MySQL");
$query = "SELECT * FROM user";
$result = mysql_query($query)
or die ("Query failed: " . mysql_error());
while ($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td> Пользователь ", $row['User'], "</td> <td> Хост ", $row['Host'], "</td><br>" ;
echo "<tr>";
};

mysql_close($connection);
siv1987
На сайте с 02.04.2009
Offline
427
#10

Никакого отношения версия mysql здесь не имеет. Это банальный баг в логике.


if ($result){
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
while($row){

и


while ($row = mysql_fetch_array($result))
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий