За последние 24 часа нас посетили 19430 программистов и 1633 робота. Сейчас ищут 1856 программистов ...

раскидать данные из БД по таблицам

Тема в разделе "Сделайте за меня", создана пользователем Dmitrey, 9 сен 2015.

  1. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Добрый день.
    Есть таблица в базе:

    Fam Num Sum1 Sum2
    Фамилия1 923 100 200
    Фамилия1 936 111 222
    Фамилия1 923 2247 45
    Фамилия2 903 785 5444
    Фамилия2 926 0 785

    получить нужно:

    фамилия1
    923 100 200
    936 111 222
    923 2247 45
    итоговая сумма по фамилии

    фамилия2
    903 785 5444
    926 0 785
    итоговая сумма по фамилии

    Пытаюсь сделать так:
    Код (PHP):
    1. <?php $lFam = null;
    2. while ($row = mysqli_fetch_assoc($result)){
    3. if ($row['fam'] != $lFam){
    4. $tsum = 0;
    5. $osum = 0;
    6. $lFam = $row['fam'];
    7. $tsum = $row['sum1'] + $row['sum2'];
    8. $tsum += ($row['sum1'] + $row['sum2'])*0.13;
    9. $osum = $tsum;
    10. ?>
    11. <table>
    12. <tr>
    13. <td>
    14. <?php echo "{$lFam}" ?>
    15. </td>
    16. <td>
    17. май 2015
    18. </td>
    19. </tr>
    20. <tr>
    21. <th> номер </th>
    22. <th> сумма </th>
    23. <th> сумма</th>
    24. </tr>
    25. <tr>
    26. <td> <?php echo "{$row['num']}" ?> </td>
    27. <td> <?php echo "{$row['sum1']}" ?> </td>
    28. <td> <?php echo "{$row['sum2']}" ?> </td>
    29. </tr>
    30. <?php 
    31. } elseif ($row['fam'] == $lFam){
    32. $lFam = $row['fam'];
    33. $tsum = $row['sum1'] + $row['sum2'];
    34. $tsum += ($row['sum1'] + $row['sum2'])*0.13;
    35. $osum += $tsum;
    36. ?>
    37. <tr>
    38. <td> <?php echo "{$row['num']}" ?> </td>
    39. <td> <?php echo "{$row['sum1']}" ?> </td>
    40. <td> <?php echo "{$row['sum2']}" ?> </td>
    41. </tr>
    42. <tr>
    43. <td> <?php echo "{$osum}" ?> </td>
    44. </tr>
    45. <tr></tr>
    46. </table>
    47. <?php }
    48.  
    49. }
    50. ?>
    Считает правильно и выводит в виде таблиц, но выводит в таблицу только 1 и 2 строки и итоговую сумму(osum) отображает в таблице только за 2 строчки. Где больше 2х строк, он выбрасывает их за таблицу в одну строку без пробелов, хотя все расчёты проводятся. Если таблицу не использовать и выводить через echo с разделителями и br, то всё расставляет по столбикам.
    Толи я логику вывода неправильно понимаю, толи знаний мало. Помогите разобраться.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Выложи ещё всю таблицу как sql запрос, где будет схема и данные, так тебе легче будет помочь.
    Ещё запрос на выборку, всё это можно сделать в PHPMyAdmin через export.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    либо выборка, либо сумма.
     
  4. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Запрос на выборку из базы:
    Код (PHP):
    1. <?php
    2.         $zapros = "SELECT scha.tel, tlf.fam, scha.sum1, scha.sum2 FROM schet_abon scha INNER JOIN telefones tlf ON scha.tel = tlf.tel ORDER BY tlf.fam";
    3.         $result = mysqli_query($link, $zapros);
    4.         /* отслеживем ошибку MySQL */
    5.         if( !$result ){
    6.             echo 'Ошибка: ' 
    7.                 .mysqli_errno($link) 
    8.                 .':' 
    9.                 .mysqli_error($link);
    10.         };
    11.         mysqli_close($link);
    12. ?>
    igordata: либо выборка, либо сумма.
    выборку предоставил. а какую сумму?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в одном запросе ты либо выбираешь все строки, либо суммируешь все строки.
     
  6. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    только выбираю в переменную. и через while вывожу построчно из переменной.
    я пробовал делать так
    Код (PHP):
    1. while ($row = mysqli_fetch_assoc($result)){
    2.                     if ($row['fam'] != $lFam){
    3.                         $tsum = 0;
    4.                         $osum = 0;
    5.                         $lFam = $row['fam'];
    6.                         $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'];
    7.                         $tsum += ($row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'])*0.18;
    8.                         $osum = $tsum;
    9.                         echo "$lFam </br>";
    10.                         echo "{$row['tel']} | {$row['tel']} | {$row['mestn_zv']} | {$row['abonentka']} | {$row['roum']} | {$row['skidka']} | {$tsum} </br>";  
    11.                     } elseif ($row['fam'] == $lFam){
    12.                         $lFam = $row['fam'];
    13.                         $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'];
    14.                         $tsum += ($row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'])*0.18;
    15.                         $osum += $tsum;
    16.                         echo "{$row['tel']} | {$row['mestn_zv']} | {$row['abonentka']} | {$row['roum']} | {$row['skidka']} | {$tsum} </br>"; 
    17.                     }
    18.                     echo "$osum </br>";
    19.                 }
    20.  
    и получил более похожий на желаемый результат, но нужно разбить по таблицам. Я не понимаю где ошибся?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не понимаю вопроса. объясни ещё раз другими словами пожалуйста.
     
  8. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Видимо я не совсем правильно разбираюсь. этим $zapros я запрашиваю данные из базы. там много строчек. а это $result будет некая переменная, которая содержит в себе массив запрошенных строчек. Этим $row = mysqli_fetch_assoc($result) я делаю массив ассоциативным, чтобы выбирать данные по символьному индексу, а не числовому. через while я перебираю строчки и вывожу их. Так я думаю.
    Проблема в том, что не знаю как данные из $row раскидать по таблицам в которых имени соответствуют определённые номера и посчитать сумму. Т.е хочу получить табличку, где фамилия , ниже строчки с номерами, соответствующие этой фамилии, с суммами. Ниже вторая таблица с фамилией и соответствующими номерами. Получается нужно сделать страницу html с выводом фамилий с номерами. Где-то так. Здесь и застрял.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну вроде ты правильно думаешь.

    скопить всё в другой массив, в котором всё будет сгруппировано как тебе надо
     
  10. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Это сделать до while?
    Или по ходу while помещать строчки в новый массив и формировать таблицы?
    я пока плохо представляю как это реализовать.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    непосредственно внутри. А выводом заниматься уже проходя по новому массиву.
     
  12. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Т.е. делаю
    Код (PHP):
    1. while ($row = mysqli_fetch_assoc($result)) 
    / Потом получаю первую фамилию и записываю в новый массив телефоны с суммами соответствующими этой фамилии? Если фамилия изменилась, то вывожу полученный ранее массив в таблицу, обнуляю значения и запускаю запись нового массива? Это правильный алгоритм?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. сначала все фамилии копишь в массив.
    в самом примитивном виде это вот
    Код (Text):
    1. while ($row = mysqli_fetch_assoc($result)) {
    2.   $новыймассив[$row['фамилия']][] = $row;

    потом можно выводить и сумму делать через array_sum()
     
  14. Dmitrey

    Dmitrey Активный пользователь

    С нами с:
    17 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    igordata спасибо за совет, но это сложновато для моего уровня. пришлось напрячься, но более примитивно сделал. получилось такое:
    Код (PHP):
    1. while ($row = mysqli_fetch_assoc($result)){
    2.     
    3.     
    4.     $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'];
    5.     $nds = $tsum*0.18;
    6.     $tsum += $nds;
    7.     
    8.     
    9.     if($lFam != $row['fam'])
    10.     {
    11.         if($lFam != null)
    12.         {
    13.             ?>
    14.                 <tr>
    15.                     <td colspan="5">
    16.                     Итого:
    17.                     </td>
    18.                     <td>
    19.                     <?php echo $osum ?>
    20.                     </td>
    21.                     </tr>
    22.                 </table>
    23.             <?php
    24.               $osum = 0;  
    25.         }
    26.         
    27.         ?>
    28.         <table style="margin-top:10px;" cellspacing="0" cellpadding="0">
    29.             <tr>
    30.                 <td colspan="5">
    31.                     <?php echo "{$row['fam']}" ?>
    32.                 </td>
    33.                 <td>
    34.                     Май 2015
    35.                 </td>
    36.             </tr>
    37.         <tr>
    38.             <td>номер</td>
    39.             <td>местные</td>
    40.             <td>абонентка</td>
    41.             <td>роуминг</td>
    42.             <td>скидка</td>
    43.             <td>За телефон</td>
    44.         </tr>
    45.         
    46.         <?php 
    47.     }
    48.     ?>
    49.         
    50.  
    51.  
    52.         <tr>
    53.             <td> <?php echo "{$row['tel']}" ?> </td>
    54.             <td> <?php echo "{$row['mestn_zv']}" ?> </td>
    55.             <td> <?php echo "{$row['abonentka']}" ?> </td>
    56.             <td> <?php echo "{$row['roum']}" ?> </td>
    57.             <td> <?php echo "{$row['skidka']}" ?> </td>
    58.             <td> <?php echo "{$tsum}" ?> </td>
    59.         </tr>
    60.     
    61.  
    62.     <?php
    63.     $osum += $tsum;
    64.     $lFam = $row['fam'];
    65.     
    66. }
    67. ?>
    68.  <tr>
    69. <td colspan="5">
    70. Итого:
    71. </td>
    72. <td>
    73. <?php echo $osum ?>
    74. </td>
    75. </tr>          
    76. </table>
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну и норм