Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Порядковый номер товара. Цикл.
 
 автор: Лена   (22.12.2009 в 22:54)   письмо автору
 
 

Помогите, пожалуйста Сделала прайс, таблица, 4 колонки, самая левая колонка должна показывать номер товара по порядку, т.е. 1,2,3 и т.д. У меня же показывает 1,3,4,7.
Привожу только код цикла:

<?php
//здесь идет запрос к базе, который вытягивает категорию, товары в категории, 
//расфасовку товаров и их цену
for($result mysql_query($query),$b null,$i=1;$arr mysql_fetch_assoc($result);$i++) {
    
$pid $arr['pid']; //id товара
    
$ptitle htmlspecialchars($arr['ptitle']); //заголовок товара
    
$pdescr htmlspecialchars($arr['pdescr']); //описание товара
    
$pop $arr['pop'];  //популярный продукт
    
$pi $arr['pi'];  //id прайса
    
$pfas htmlspecialchars($arr['pfas']); //фасовка
    
$pprice htmlspecialchars($arr['pprice']); //цена
    
$cid $arr['cid'];  //id категории товара
    
$cname htmlspecialchars($arr['cname']); //название категории товара

    
$s "SELECT COUNT(*) fcount
    FROM product_price
    WHERE product_id = " 
$pid;
    
$res mysql_query($s);
    if(!
$res)exit("Error in" $s mysql_error());
    
$count mysql_result($res,0);
    if(
$count>1)
        
$fcount "rowspan=" $count;
    else 
$fcount "";
    
//категория товара
    
if($b !=$cid){
        
$b $cid;
        
$price .= '<tr><td colspan = 4><h3>' $cname '</h3></td></tr>';
        
$b1 0;
    }
    if(
$b1 !=$pid){
        
$b1 $pid;
        
//порядковый номер товара
        
$price .= '<tr><td ' $fcount '>' $i '</td>';
        
//название товара, его описание
        
$price .= '<td ' $fcount '>' $ptitle ".&nbsp;&nbsp;" $pdescr '</td>';
        
$b2 0;
    }
    
// далее - расфасовка, цена

}
?>


Не выходит вот это: $price .= '<tr><td ' . $fcount . '>' . $i . '</td>';
Допустим, посчитать весь товар я могу, куда можно запихнуть цикл?

  Ответить  
 
 автор: neadekvat   (22.12.2009 в 23:05)   письмо автору
 
   для: Лена   (22.12.2009 в 22:54)
 

А чего-то это вы через for? через while же удобнее, нэ?

  Ответить  
 
 автор: Лена   (22.12.2009 в 23:08)   письмо автору
 
   для: neadekvat   (22.12.2009 в 23:05)
 

>А чего-то это вы через for? через while же удобнее, нэ?
Нет. Мне через for здесь удобнее. Какая разница, если и то, и то - операторы цикла?

  Ответить  
 
 автор: neadekvat   (22.12.2009 в 23:14)   письмо автору
 
   для: Лена   (22.12.2009 в 23:08)
 

В читабильности разница, очень проблематично понять код (не пеняйте на мой опыт, с переменными ближе к концу намутили кашу)

P.S. И в бд, имхо, название у столбцов плохие:
$pid = $arr['pid']; //id товара
Понятнее либо id (т.е. основной идентификатор), либо product_id
$ptitle = htmlspecialchars($arr['ptitle']); //заголовок товара
product_id
$pdescr = htmlspecialchars($arr['pdescr']); //описание товара
product_desc
$pop = $arr['pop']; //популярный продукт
popular
$pi = $arr['pi']; //id прайса
price_id
$pfas = htmlspecialchars($arr['pfas']); //фасовка
$pprice = htmlspecialchars($arr['pprice']); //цена
эти два даже не могу расшифровать, к чему первая p относится то..
$cid = $arr['cid']; //id категории товара
cat_id
$cname = htmlspecialchars($arr['cname']); //название категории товара
cat_name

Пожалейте человека, который будет после вас работать с этим всем :)
Это мое имхо, конечно же)

  Ответить  
 
 автор: Лена   (22.12.2009 в 23:16)   письмо автору
 
   для: neadekvat   (22.12.2009 в 23:14)
 

Это все алиасы :)))
Ладно, вот весь код:

<?php
//соединение с базой
include ("configs/dbopen.php");
//общее количество товаров
    
$sq "SELECT COUNT(*) tcount
    FROM product"
;
    
$res mysql_query($sq);
    if(!
$res)exit("Error in" $sq mysql_error());
    
$tcount mysql_result($res,0);

$query "
SELECT pr.product_id pid,
pr.product_title ptitle,
pr.product_descr_price pdescr,
pr.popular_product pop,
pp.id pi,
pp.fasovka pfas,
pp.price pprice,
cat.cat_id cid,
cat.cat_name cname
FROM product pr
LEFT JOIN category cat ON pr.cat_id = cat.cat_id
LEFT JOIN product_price pp ON pr.product_id = pp.product_id
WHERE pr.product_id != 49 AND pr.product_id != 50
ORDER BY cid,pid
"
;
$price '';
$price .= '<table border = "2">';
for(
$result mysql_query($query),$b null,$i=1;$arr mysql_fetch_assoc($result);$i++) {
    
$pid $arr['pid']; //id товара
    
$ptitle htmlspecialchars($arr['ptitle']); //заголовок товара
    
$pdescr htmlspecialchars($arr['pdescr']); //описание товара
    
$pop $arr['pop'];  //популярный продукт
    
$pi $arr['pi'];  //id прайса
    
$pfas htmlspecialchars($arr['pfas']); //фасовка
    
$pprice htmlspecialchars($arr['pprice']); //цена
    
$cid $arr['cid'];  //id категории товара
    
$cname htmlspecialchars($arr['cname']); //название категории товара

    
$s "SELECT COUNT(*) fcount
    FROM product_price
    WHERE product_id = " 
$pid;
    
$res mysql_query($s);
    if(!
$res)exit("Error in" $s mysql_error());
    
$count mysql_result($res,0);
    if(
$count>1)
        
$fcount "rowspan=" $count;
    else 
$fcount "";
    
//категория товара
    
if($b !=$cid){
        
$b $cid;
        
$price .= '<tr><td colspan = 4><h3>' $cname '</h3></td></tr>';
        
$b1 0;
    }
    if(
$b1 !=$pid){
        
$b1 $pid;
        
//порядковый номер товара
        
$price .= '<tr><td ' $fcount '>' $i '</td>';
        
//название товара, его описание
        
$price .= '<td ' $fcount '>' $ptitle ".&nbsp;&nbsp;" $pdescr '</td>';
        
$b2 0;
    }
    
// расфасовка, цена
    
if($b2 != $pi){
        
$b2 $pi;
               
$price .= '<td>' $pfas '</td>';
            
$price .= '<td width="50px">' $pprice '</td>';
            
$price .= '</tr>';
            for(
$j=1;$j<$count,$b2 != $pi;$j++){
                
$price .= '<tr>';
                
$price .= '<td>' $pfas '</td>';
                
$price .= '<td width="50px">' $pprice '</td>';
                
$price .= '</tr>';
            }
   }

}

$price .= '</table>';

print 
$price;
?>

  Ответить  
 
 автор: neadekvat   (22.12.2009 в 23:27)   письмо автору
 
   для: Лена   (22.12.2009 в 23:16)
 

Шота я ужо сплю и нифига не понимаю, но раз уж начал говорить, не могу уйти по-английски)
Не знаю, пробовали вы или нет.. Попробуйте выводить какие-то ключевые переменные (в данном случаи $i) вне всяких проверок, внутренних циклов и тд. То есть сразу под главной строчкой for (по идее то должен идти натуральный ряд..) а потом спускайте все нииже..нииже.. И так, пока получающийся ряд не станет тоже глючить. После какого блока глючит - там и ошибка)
Но вообще, в целом,я бы пересмотрел код, запросы в бд, названия переменных и тд, хотя бы для себя) Закройте это и откройте через месяц..)
SELECT COUNT(*) fcount
Вот, например, что за слово после COUNT(*)? Для чего оно там нужно (просто интересуюсь, в sql не силен) и нужно ли вообще?

  Ответить  
 
 автор: Лена   (22.12.2009 в 23:36)   письмо автору
 
   для: neadekvat   (22.12.2009 в 23:27)
 

>Вот, например, что за слово после COUNT(*)? Для чего оно там нужно (просто интересуюсь, в sql не силен) и нужно ли вообще?
Это да. Согласна. Не нужно. Спасибо.

  Ответить  
 
 автор: sim5   (23.12.2009 в 04:20)   письмо автору
 
   для: Лена   (22.12.2009 в 23:36)
 

У вас выполняется условие формирования шапки для группы строк - это один проход цикла, затем выполняется условие для вывода строк - опять проход, и т.д., а счетчик то увеличивается с каждым проходом.

  Ответить  
 
 автор: Лена   (23.12.2009 в 10:24)   письмо автору
 
   для: sim5   (23.12.2009 в 04:20)
 

Да, я это уже поняла.
У меня товары выводятся на 1,4, 7 и т.д. цикле, 2,3,5,6- циклы считает фасовку товара,
поэтому для товара счетчик считает его порядковый номер как 1,4,7. Как сделать так, чтобы считалось по порядку? Как сделать счетчик, независимый от вывода товара?

  Ответить  
 
 автор: sim5   (23.12.2009 в 10:29)   письмо автору
 
   для: Лена   (23.12.2009 в 10:24)
 

А вы представьте такой счетчик вне цикла, и который обновляется только по условию вывода товаров, и все станет на свои места, будет видна "дыра" в коде. Да и действительно - код короткий, но "грузный" для чтения.

  Ответить  
 
 автор: Лена   (23.12.2009 в 11:18)   письмо автору
 
   для: sim5   (23.12.2009 в 10:29)
 

Получилось. Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования