Jump to content
  • 0

Цикл заканчиваеться раньше времени.


FirstMedved
 Share

Question

В общем такая ситуация: делаю вывод товаров из БД, в случае вывода таблицы 3 на 4 на каждой странице исчезает по 2 товара, при увеличении на 1 строку исчезает еще один товар. Понимаю, что ошибка в цикле, а где точно найти не получается.

<?

//Кол-во товаров

$kol_tovar = 12;

//Определение страницы

if(empty($_GET["page"])){
$page = 1;
} else {
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!");
$page = $_GET["page"];
}
$start = $page*$kol_tovar-$kol_tovar;
/* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");

/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());

/* Составляем запрос для извлечения данных из полей "articul, photo, name, opisanie, price таблицы "$table", в нужной странице */
$query = "SELECT id, articul, photo, name, opisanie, price FROM $table LIMIT $start, $kol_tovar";

/* Выполняем запрос. Если произойдет ошибка - вывести ее. */
$res = mysql_query($query) or die(mysql_error());
// Подсчёт страниц
$count = mysql_query("SELECT COUNT(*) FROM $table") or die(mysql_error());
$count = mysql_fetch_array($count);
$count = $count[0];
$pages = ceil($count/$kol_tovar);

echo ('<table width="100%" border="0" cellspacing="30" cellpadding="0">');

//цикл ввывода строк
for ($strok=0; $strok<3; $strok++) {
echo ('<tr>');
$stolb= 0 ;
//Цикл вывода сталбцов
while ($row = mysql_fetch_array($res) and $stolb<4) {
echo ('<td>');
/*Здесь таблица товара*/
echo ('</td>');
$stolb++;
}
echo ('</tr>');
}
echo ('</table>');
echo ('<table border="0" cellspacing="30" cellpadding="0" style="margin-right:10px" style="position:absolute; right:40% top:40%;"><tr>');
if($page>1){
for($i=1;$i<$page;$i++){
echo ('<td>');
echo ('<A HREF="?p=catalog&page='.($i).'"><font face="impact" size="2" color="#2A2A29">'.$i.' </A></font>');
echo ('</td>');
}
}
echo ('<td><b>'.$page.' </b></td>');
if($pages>$page){
for($i=$page+1;$i<=$pages;$i++){
echo ('<td>');
echo ('<A HREF="?p=catalog&page='.($i).'"><font face="impact" size="2" color="#2A2A29">'.$i.' </A></font>');
echo ('</td>');
}
}
echo ('</tr></table>');
mysql_close();

P.S.

Я новичок т.ч. не судите строго.

Заранее благодарю :-)

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

if(empty($_GET["page"])){
$page = 1;
} else {
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!");
$page = $_GET["page"];
}

Если $page меньше нуля, зря только дёргаете базу. Если $page больше числа страниц, опять зря дёргаете базу, да ещё на выходе получите пустую страницу.

$count = mysql_fetch_array($count);
$count = $count[0];

Можно сделать короче через mysql_result()

Попробуем упростить цикл

$str=0;
$stl=0;
echo ('<tr>');
while ($row = mysql_fetch_array($res))
{
if (!(++$stl % 4))
{
echo '</tr><tr>';
$stl=0;
}
echo ('<td>'./**/$row[1]/**/.'</td>');
if (++$str == 3) break;
}
echo ('</tr>');

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

Link to comment
Share on other sites

  • 0

Капец вообще. Я бы за такой код выгнал с работы пинком под зад, чесслово. И не из-за того, что сам код плохой — это лечится, а из-за

id, articul, photo, name, opisanie, price

Что помешало назвать поля «id», «mark», «photo», «name», «description», «price»? Это первое.

Второе, как правильно заметил Быколай, подстчёт записей надо делать через SQL_CALC_FOUND_ROWS.

Третье. Если количество товаров определено и надо его вывести в таблицу4?3, то надо делать что-то типа такого


<table>
<tbody>
<tr>
<?php
$q=mysql_query("SELECT * FROM `tablename` LIMIT 0, 12");
for ($s=0; $r=mysql_fetch_assoc($q); $s++)
{
if ($s%4==0 && $s!=0) echo '</tr><tr>';
echo '<td>'.$r['name'].'</td>';
}
?>
</tr>
</tbody>
</table>

Ну и в конце «допинать» пустыми <td>, если товаров меньше 12. И всё. А вы какой-то жути нагородили.

Link to comment
Share on other sites

  • 0

COUNT() будет быстрее чем SQL_CALC_FOUND_ROWS().

sql_found_rows.jpg

:facepalmxd:

ф-ция постранички:


function show_page_list ($page, $num, $count_on_page)
{
echo "<div class=\"navi_box\"><ul class=\"pagi_navi\">";
if (!isset($page) && intval($page) == 0) $page = 1;
$count_pages = intval($num / $count_on_page);
$ostatok = $num % $count_on_page;
if($ostatok > 0) $count_pages++;
if ($page>1)
echo "<li><a href = \"http://". $_SERVER['HTTP_HOST'] ."/".($page - 1)."/\" title = \"Предыдущая страница\">←</a></li>";
$diapazon = 10;
$page_from = $page - $diapazon;
if($page_from < 1) $page_from = 1;
$page_to = $page + $diapazon;
if($page_to > $count_pages) $page_to = $count_pages;

for ($i = $page_from; $i <= $page_to; $i++)
{
if ($i == $page) echo "<li>".$i."</li>";
else
echo "<li><a href=\"http://".$_SERVER['HTTP_HOST']."/".$i."/\" title = \"".$i." страница\">".$i."</a></li>";
}
if ($page<$count_pages)
echo "<li><a href = \"http://". $_SERVER['HTTP_HOST'] ."/".($page + 1)."/\" title = \"Следующая страница\">→</a></li>";
echo "</ul></div>";
}

вывод:


// узнаем количество категорий
$razdel = mysql_query("SELECT * FROM `pages`");
$num = mysql_num_rows ($razdel);
// используем ф-ию для постраничной навигации
@$start = page_list($_GET['page'], $num, 2);
$res = mysql_query("SELECT * FROM `pages` WHERE ORDER by `id` ASC LIMIT $start, 2");
while ($row = mysql_fetch_array($res, MYSQL_ASSOC))
{
echo "выводим контент";
}
// выводим постраничную навигацию
@show_page_list($_GET['page'], $num, 2);

если не ошибся, то так вот как-то...

Link to comment
Share on other sites

  • 0

Даже не ожидал количества ответов =) Ну как Вы поняли из кода, Я совсем чайнеГ. По этому несколько вопросов

Всё таки как лучше так:

$str=0;
$stl=0;
echo ('<tr>');
while ($row = mysql_fetch_array($res))
{
if (!(++$stl % 4))
{
echo '</tr><tr>';
$stl=0;
}
echo ('<td>'./**/$row[1]/**/.'</td>');
if (++$str == 3) break;
}
echo ('</tr>');

Или так(Опробовать сейчас не могу, но если Я правильно понимаю, то в этом варианте будет не таблица 3 на 4, а 1 на12, Я ошибся?):

<table>
<tbody>
<tr>
<?php
$q=mysql_query("SELECT * FROM `tablename` LIMIT 0, 12");
for ($s=0; $r=mysql_fetch_assoc($q); $s++)
{
if ($s%4==0 && $s!=0) echo '</tr><tr>';
echo '<td>'.$r['name'].'</td>';
}
?>
</tr>
</tbody>
</table>

Хотя если Я правильно понимаю варианты отличаются только циклами?

А можно функцию постранички с комментариями для полных чайников? :)

Я бы за такой код выгнал с работы пинком под зад, чесслово. И не из-за того, что сам код плохой — это лечится, а из-за

Это тоже лечиться :facepalmxd:

Что помешало назвать поля «id», «mark», «photo», «name», «description», «price»?

Знания английского, в следствии мне проще воспринимать транслитом... На крайний случай это можно легко исправить =)

Edited by FirstMedved
Link to comment
Share on other sites

  • 0

я бы советовал избекать embedded-синтаксиса, в серьёзных проектах это будет не айс.

в первом премере что не даёт вам сделать

print '<table>';

?

кстати, скобки в для echo() не обязательны.

Знания английского, в следствии мне проще воспринимать транслитом... На крайний случай это можно легко исправить =)

лучше сразу делать чем потом исправлять. :facepalmxd:

а знание английского только практикой добивается. я, например, язык только в точках соприкосновения. с художественным английским у меня хуже чем с "программерским".

мне лично даже вникать и запускать чужой код с транслитными именами впадлу. не говоря уже вникать и модифицировать что бы помочь.

Link to comment
Share on other sites

  • 0
я бы советовал избекать embedded-синтаксиса

А это что такое? :facepalmxd:

с художественным английским у меня хуже чем с "программерским".

мне лично даже вникать и запускать чужой код с транслитными именами впадлу. не говоря уже вникать и модифицировать что бы помочь.

Исправлюсь, Я ведь только учусь =)

Link to comment
Share on other sites

  • 0

Всем благодарность за помощь =)

Если кому интересно ошибка была в условиях цикла надо так while ($row = $stolb<4 and mysql_fetch_array($res)) а было while ($row = mysql_fetch_array($res) and $stolb<4)...

PS

Конечно исправлю на вариант предложенный вами, т.к. на сколько Я понимаю так нагрузка меньше... Или Я ошибаюсь?

Link to comment
Share on other sites

  • 0

Для выполнения данной задачи нужен счётчик, а значит for. Почему while-то?

И не оффтопа ради, но грамматики для советую автору ознакомиться со следующим ресурсом

Link to comment
Share on other sites

  • 0
while ($row = $stolb<4 and mysql_fetch_array($res))

о-О_о-О_о_О-о А расскажи лигику работы этого всего, а то я чё-то не сразу догнал. $row булевого типа? А куда же тогда данные попадают ил fetch_array?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy