PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: mysql, php
komplekt_17
Отправлено: 29 Апреля, 2016 - 15:11:50
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




Всем здрасьте, пробежался по темам, вроде ничего похожего не нашёл, может, не там смотрел.
В общем, проблема такая
есть 4 таблицы:
shoppers - покупатели,

Нажмите для увеличения

products - товары,

Нажмите для увеличения

orders - заказы,

Нажмите для увеличения

status_orders - статусы заказов

Нажмите для увеличения

необходимо вывести список заказов покупателя в таком виде:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <tbody class='tbody'>
  3. <th>Номер заказа</th>
  4. <th>Дата заказа</th>
  5. <th>Сумма заказа</th>
  6. <th>Статус заказа</th>
  7. </tbody>
  8.  

делаю следующие запросы:
PHP:
скопировать код в буфер обмена
  1. // выборка покупателя
  2.     $user_name = $_SESSION['Login'];
  3.     $sql1 = "SELECT id_sh FROM shoppers WHERE login_sh = '$user_name'";
  4.     $result1 = mysqli_query($db, $sql1);
  5.     $myrow1 = mysqli_fetch_assoc($result1);
  6. // выборка всех позиций по заказам покупателя
  7.     $user_id = $myrow1['id_sh'];
  8.     $sql2 = "SELECT * FROM orders WHERE shr_ord = '$user_id'";
  9.     $result2 = mysqli_query($db, $sql2);
  10. if (mysqli_num_rows($result2)>0){
  11. // вывод нецикличной части
  12.         echo "
  13.                        <tbody class='tbody'>
  14.                            <th>Номер</th>
  15.                            <th>Дата</th>
  16.                            <th>Сумма</th>
  17.                            <th>Статус</th>
  18.                        </tbody>";
  19. // запускаю цикл по условию
  20.         while($myrow2 = mysqli_fetch_array($result2)){
  21.             $num_ord = $myrow2['num_ord'];
  22. // выбираю только позиции   из конкретного заказа      
  23.             $sql3 = "SELECT * FROM orders WHERE num_ord = '$num_ord'";
  24.             $result3 = mysqli_query($db, $sql3);
  25.             $myrow3 = mysqli_fetch_array($result3);
  26. // выбираю цену позиций в заказе            
  27.             $prod_ord = $myrow3['prod_ord'];
  28.             $sql4 = "SELECT price_pd FROM products WHERE id_pd = '$prod_ord'";
  29.             $result4 = mysqli_query($db, $sql4);
  30.             $myrow4 = mysqli_fetch_array($result4);
  31. // вывод цикличной части
  32.             echo "
  33.                        <tr>
  34.                            <td>".$myrow3['num_ord']."</td>
  35.                            <td>".$myrow3['date_ord']."</td>
  36.                            <td>".$myrow3['qwt_ord']*$myrow4['price_pd']." ".$val."</td>
  37.                            <td>".$myrow3['stat_ord']."</td>
  38.                        </tr>";
  39.            
  40.         }

здесь застрял, как дальше????

(Отредактировано автором: 29 Апреля, 2016 - 15:30:34)

 
 Top
igosja
Отправлено: 29 Апреля, 2016 - 17:17:08
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




Запросы к базе данных в цикле можно делать только в случае крайней необходимости, а здесь такой необходимости явно нет.
Я бы сделал так:
PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT `num_ord`,
  2.                `date_ord`,
  3.                `qwt_ord`*`price_pd` AS `price`,
  4.                `stat_ord`
  5.         FROM `shoppers`
  6.         LEFT JOIN `orders`
  7.         ON `id_sh`=`shr_ord`
  8.         LEFT JOIN `products`
  9.         ON `prod_ord`=`id_pd`
  10.         WHERE `login_sh`='$user_name'
  11.         AND `id_ord` IS NOT NULL
  12.         ORDER BY `id_ord` ASC";
  13. $order_sql   = $mysqli->query($sql);
  14. $order_array = $order_sql->fetch_all(MYSQLI_ASSOC);
  15.  
  16. print '<table>
  17.          <tbody class="tbody">
  18.            <tr>
  19.              <th>Номер</th>
  20.              <th>Дата</th>
  21.              <th>Сумма</th>
  22.              <th>Статус</th>
  23.            </tr>';
  24.  
  25. foreach ($order_array as $order)
  26. {
  27.     print '<tr>
  28.              <td>' . $order['num_ord'] . '</td>
  29.              <td>' . $order['date_ord'] . '</td>
  30.              <td>' . $order['price'] . ' ' . $val . '</td>
  31.              <td>' . $order['stat_ord'] . '</td>
  32.            </tr>';
  33. }
  34.  
  35. print '<tr>
  36.         <th>Номер</th>
  37.         <th>Дата</th>
  38.         <th>Сумма</th>
  39.         <th>Статус</th>
  40.       </tr>
  41.     </tbody>
  42.   </table>';

И искать лучше по id покупателя, а не по логину.

(Отредактировано автором: 29 Апреля, 2016 - 17:34:21)

 
 Top
komplekt_17
Отправлено: 29 Апреля, 2016 - 18:28:53
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




благодарю за внимание к моему вопросу.
ваш код не сработал (Fatal error: Call to a member function query() on null in ),
я чуть поменял 2 строчки кода, а именно
PHP:
скопировать код в буфер обмена
  1.        
  2. $order_sql   = mysqli_query($db, $sql2);
  3. $order_array = mysqli_fetch_all($order_sql, MYSQL_ASSOC);
  4.  

теперь выводится только (без ошибок)
CODE (html):
скопировать код в буфер обмена
  1.  
  2.      <tr>
  3.         <th>Номер</th>
  4.         <th>Дата</th>
  5.         <th>Сумма</th>
  6.         <th>Статус</th>
  7.       </tr>

выводится 2 раза - видимо, по числу элементов, попавших в выборку.
Где и что поправить, чтобы выходила не только шапка таблицы, но и сами значения выборки?
 
 Top
igosja
Отправлено: 29 Апреля, 2016 - 18:51:35
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




Это выводится шапка 2 раза - в начале таблицы и в конце таблицы. Между ними должны быть данные. Если данных нет, значит у этого пользователя нет заказов. Попробуйте посмотреть этот код для пользователя у которого наверняка есть какие-то заказы, по вашим скринам это пользователи name10 и name11.
 
 Top
komplekt_17
Отправлено: 29 Апреля, 2016 - 19:02:21
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




да, пардон, я ошибся.

попробовал пользователя, у которого есть заказы,
так вот выходят все строки товарных позиций из заказов,
а должно быть
номер заказа\ дата заказа\сумма заказа\статус заказа(значение поля, а не его ID)

Нажмите для увеличения
 
 Top
igosja
Отправлено: 29 Апреля, 2016 - 19:33:43
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




Тогда так:
PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT `num_ord`,
  2.                `date_ord`,
  3.                SUM(`qwt_ord`*`price_pd`) AS `price`,
  4.                `name_stord`
  5.         FROM `shoppers`
  6.         LEFT JOIN `orders`
  7.         ON `id_sh`=`shr_ord`
  8.         LEFT JOIN `products`
  9.         ON `prod_ord`=`id_pd`
  10.         LEFT JOIN `status_orders`
  11.         ON `id_stord`=`stat_ord`
  12.         WHERE `login_sh`='$user_name'
  13.         AND `id_ord` IS NOT NULL
  14.         GROUP BY `num_ord`
  15.         ORDER BY `id_ord` ASC";
  16. $order_sql   = mysqli_query($db, $sql);
  17. $order_array = mysqli_fetch_all($order_sql, MYSQL_ASSOC);
  18.  
  19. print '<table>
  20.          <tbody class="tbody">
  21.            <tr>
  22.              <th>Номер</th>
  23.              <th>Дата</th>
  24.              <th>Сумма</th>
  25.              <th>Статус</th>
  26.            </tr>';
  27.  
  28. foreach ($order_array as $order)
  29. {
  30.     print '<tr>
  31.              <td>' . $order['num_ord'] . '</td>
  32.              <td>' . $order['date_ord'] . '</td>
  33.              <td>' . $order['price'] . ' ' . $val . '</td>
  34.              <td>' . $order['name_stord'] . '</td>
  35.            </tr>';
  36. }
  37.  
  38. print '<tr>
  39.         <th>Номер</th>
  40.         <th>Дата</th>
  41.         <th>Сумма</th>
  42.         <th>Статус</th>
  43.       </tr>
  44.     </tbody>
  45.   </table>';

(Отредактировано автором: 29 Апреля, 2016 - 19:36:53)

 
 Top
komplekt_17
Отправлено: 29 Апреля, 2016 - 20:00:07
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




ругается однако: Warning: mysqli_fetch_all() expects parameter 1 to be mysqli_result, boolean given in /var/www/vh262379/data/www/skart -info.ru/supershop/account.php on line 170

Нажмите для увеличения
 
 Top
igosja
Отправлено: 29 Апреля, 2016 - 20:19:53
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




На скрине из notepad++ в запросе пропущено 2 строки, скопируйте содержимое переменной $sql из последнего сообщения и вставьте к себе.
 
 Top
komplekt_17
Отправлено: 29 Апреля, 2016 - 20:21:25
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




да, да, это я криворукий, спасибо разобрался.
(Добавление)
ну и напоследок, подскажите ещё, если мне нужно выбрать все заказы всех пользователей и представить результат в том же виде
запрос будет такой:
PHP:
скопировать код в буфер обмена
  1. $sql2 = "SELECT `num_ord`,
  2.                `date_ord`,
  3.                SUM(`qwt_ord`*`price_pd`) AS `price`,
  4.                `name_stord`
  5.         FROM `shoppers`
  6.        LEFT JOIN `orders`
  7.        ON `id_sh`=`shr_ord`
  8.        LEFT JOIN `products`
  9.        ON `prod_ord`=`id_pd`
  10.        LEFT JOIN `status_orders`
  11.        ON `id_stord`=`stat_ord`
  12.        WHERE `id_ord` IS NOT NULL
  13.        GROUP BY `num_ord`
  14.        ORDER BY `id_ord` ASC";

или нет?
 
 Top
igosja
Отправлено: 29 Апреля, 2016 - 20:50:49
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




Все правильно.
 
 Top
komplekt_17
Отправлено: 29 Апреля, 2016 - 20:56:12
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




Благодарю, этот вопрос решён, но появился новый -
теперь надо выбрать из orders все товарные позиции заказа, комментарий, сумму заказа и количество. в orders хранятся id товаров, названия самих товаров и цена хранятся в products

нужно вывести результат запроса в виде:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <tr class="title">
  3.         <td>Наименование товара</td>
  4.         <td>Цена</td>
  5.         <td>Количество</td>
  6.         <td>Сумма</td>
  7.         <td></td>
  8. </tr>

запрос пишу такой
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.                         $sql1 = "SELECT `prod_ord`, `text_ord`, `shr_ord`,
  3.                SUM(`qwt_ord`*`price_pd`) AS `price`,
  4.                `name_pd`
  5.        FROM `products`
  6.        LEFT JOIN `orders`
  7.        ON `prod_ord`=`id_pd`
  8.        WHERE `num_ord`='$num_ord'
  9.        GROUP BY `prod_ord`";
  10.                         $result1 = mysqli_query($db, $sql1);
  11.                         $myrow1 = mysqli_fetch_all($result1, MYSQL_ASSOC);
  12.                         $myrow111 = mysqli_fetch_array($result1);
  13. // если результат запроса есть - выводим не цикличную часть    
  14.         if($myrow1){
  15.                 echo "
  16.                                                 <tr class='title'>
  17.                                                         <td>Наименование товара</td>
  18.                                                         <td>Цена</td>
  19.                                                         <td>Количество</td>
  20.                                                         <td>Сумма</td>
  21.                                                         <td></td>
  22.                                                 </tr>";
  23. //       выводим цикличную часть - перебираем массив
  24.                 foreach ($myrow1 as $order){
  25.                         echo "
  26.                                                 <tr>
  27.                                                         <td>".$order['name_pd']."</td>
  28.                                                         <td>".$order['price_pd']." ".$val."</td>
  29.                                                         <td>".$order['qwt_ord']."</td>
  30.                                                         <td>".$order['price']." ".$val."</td>
  31.                                                 </tr>";
  32.                 }
  33.         }
  34. // если результата запроса нет - выводим сообщение об отсутствии заказов
  35.         else{
  36.                 echo "<p class='Zagol'>Ошибка запроса".mysql_error()."</p>";
  37.                 exit();                        
  38.         }
  39.                         ?>
CODE (html):
скопировать код в буфер обмена
  1.  
  2.                                                 <tr>
  3.                                                         <td class="blue"><h4>Итоговая сумма заказа:</h4></td>
  4.                                                         <td></td>
  5.                                                         <td></td>
  6.                                                         <td><h4>
CODE (html):
скопировать код в буфер обмена
  1. </h4></td>
  2.                                                         <td></td>
  3.                                                 </tr>
  4.                                         </table>
  5.                                 </div>   
  6.                                 <div class="clearfix"></div>
  7.                                 <div class="cont col-md-12">

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.                                 $shr_ord = $myrow11['shr_ord'];
  3.                                 $sql3 = "SELECT * FROM shoppers WHERE id_sh = '$shr_ord'";
  4.                                 $result3 = mysqli_query($db, $sql3);
  5.                                 $myrow3 = mysqli_fetch_array($result3);
  6.                                 ?>

CODE (html):
скопировать код в буфер обмена
  1. <p class="title">Информация о покупателе:</p>

ругается

Нажмите для увеличения

какой должен быть запрос?

(Отредактировано автором: 30 Апреля, 2016 - 12:00:17)

 
 Top
komplekt_17
Отправлено: 30 Апреля, 2016 - 12:13:45
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Апр. 2016  
Откуда: Екатеринбург, РФ


Помог: 0 раз(а)




запрос чуть подправил, теперь всё работает,
PHP:
скопировать код в буфер обмена
  1. $sql1 = "SELECT `prod_ord`, `text_ord`, `shr_ord`, `qwt_ord`,
  2.                SUM(`qwt_ord`*`price_pd`) AS `price`,
  3.                `name_pd`,`price_pd`
  4.        FROM `products`
  5.        LEFT JOIN `orders`
  6.        ON `prod_ord`=`id_pd`
  7.        WHERE `num_ord`='$num_ord'
  8.        GROUP BY `prod_ord`";
  9.                         $result1 = mysqli_query($db, $sql1);
  10.                         $myrow1 = mysqli_fetch_all($result1, MYSQL_ASSOC);
  11.                         $myrow11 = mysqli_fetch_array($result1);

НО не вытаскивается это (для вывода данных покупателя)
PHP:
скопировать код в буфер обмена
  1. $shr_ord = $myrow11['shr_ord'];
  2.                                 $sql3 = "SELECT * FROM shoppers WHERE id_sh = '$shr_ord'";

(Добавление)
в общем решилось добавлением в foreach такого кода:
PHP:
скопировать код в буфер обмена
  1. foreach ($myrow1 as $order){
  2.                         echo "
  3.                                 <tr>
  4.                                 <td>".$order['name_pd']."</td>
  5.                                 <td>".$order['price_pd']." ".$val."</td>
  6.                                 <td>".$order['qwt_ord']."</td>
  7.                                 <td>".$order['price']." ".$val."</td>
  8.                                 </tr>";
  9.                                 $shr_ord = $order['shr_ord'];
  10.                                 $text_ord = $order['text_ord'];
  11.                 }

(Отредактировано автором: 30 Апреля, 2016 - 12:15:53)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB