PHP

PHP MYSQL после ввода запроса , отображается пустая строка перед 1 кой, немогу понять Помогите пожалуйста

<div class="content">

<?php

$result2 = mysql_query ("SELECT id, title, img FROM cartridge_table", $db);

$myrow = mysql_fetch_array($result);

do {

printf ("

<div id='tovar'>

<br>%s <br> %s <br> %s

</div>", $myrow["img"], $myrow["id"], $myrow["title"]);

}

while ($myrow = mysql_fetch_array($result2));



?>

</div>
У вас в скрипте три ошибки:
1. Во-первых: принцип работы do-while подразумевает, что цикл сначала делает указанное действие один раз, а после – выполняет то, что указано в while. То есть do-while в любом случае единожды выполнит итерацию цикла, вне зависимости от условий в while, что подразумевает, что при пустом ответе базы данных (например когда нет ни одной записи, или СУБД не вернула ни одной записи при наличии оператора WHILE) у вас всё равно произойдёт одна итерация, то есть появится подобный пустой блок.
2. Во-вторых: в строке
 $myrow = mysql_fetch_array($result); 
вы пытаетесь перегнать в массив результат MySQL-запроса $result, а выше и ниже по коду у вас фигурирует $result2.

Фактически при первой итерации цикла, у вас массив $myrow ещё пуст (поскольку преобразование в массив из пустой переменной не может быть выполнено). И только при второй итерации в него помещаются значения из запроса (из while).

3. Для обращения к элементам массива по буквенным ключам, правильнее использовать не mysql_fetch_array, а mysql_fetch_assoc – это перевод в ассоциативный массив.

Попробуйте так:
 $result2 = mysql_query ("SELECT id, title, img FROM cartridge_table", $db);

while ($myrow = mysql_fetch_assoc($result2)) {
printf ("

%s %s %s
", $myrow["img"], $myrow["id"], $myrow["title"]);
}

Так же укажу нюанс по базе данных, который напрямую не относится к ответу на вопрос, но в будущем будет полезен: в столбце img у вас указаны не пути на изображения, а HTML-код с тегом вывода этих изображений.

Рекомендую не хранить изображения в таком виде в базе данных, поскольку если у вас будет множество строк, и вам впоследствии будет необходимо, например, добавить класс к этому изображению (например class="image-preview"), вам фактически придётся вручную редактировать все строки таблицы, чтобы каждой строке задать этот класс.

Храните в базе данных только пути к файлам изображений, а выводите их кодом наподобие:
 printf("", $myrow['img']); 
В этом случае, при необходимости откорректировать вид этого изображения на странице, вам будет достаточно изменить одну строку в PHP-исходнике, и не будет необходимости затрагивать базу данных, а тем более вручную изменять каждую строку.
Алексей Рябков
Алексей Рябков
11 395
Лучший ответ
Алексей Рябков Прошу прощения, по запаре допустил ошибку в части текста: "например когда нет ни одной записи, или СУБД не вернула ни одной записи при наличии оператора WHILE", следует вместо WHILE читать WHERE - это оператор сужения выборки.

Также ещё небольшое дополнение к части, где указываю на хранение в базе данных только ссылок на изображения: если изображения располагаются на вашем сайте (то есть вы получаете их не с чужого ресурса), рекомендую указывать абсолютные пути к файлам без указания доменного имени, например: "/template/images/myimage.png". Это очень поможет в случае, если вы будете переезжать на новый домен или разворачивать копию сайта на локальном домене - не придётся переписывать пути к изображениям в каждой строке.
Попробуй переписать через цикл с предусловием