Добрый день. Есть таблица в базе: 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): <?php $lFam = null; while ($row = mysqli_fetch_assoc($result)){ if ($row['fam'] != $lFam){ $tsum = 0; $osum = 0; $lFam = $row['fam']; $tsum = $row['sum1'] + $row['sum2']; $tsum += ($row['sum1'] + $row['sum2'])*0.13; $osum = $tsum; ?> <table> <tr> <td> <?php echo "{$lFam}" ?> </td> <td> май 2015 </td> </tr> <tr> <th> номер </th> <th> сумма </th> <th> сумма</th> </tr> <tr> <td> <?php echo "{$row['num']}" ?> </td> <td> <?php echo "{$row['sum1']}" ?> </td> <td> <?php echo "{$row['sum2']}" ?> </td> </tr> <?php } elseif ($row['fam'] == $lFam){ $lFam = $row['fam']; $tsum = $row['sum1'] + $row['sum2']; $tsum += ($row['sum1'] + $row['sum2'])*0.13; $osum += $tsum; ?> <tr> <td> <?php echo "{$row['num']}" ?> </td> <td> <?php echo "{$row['sum1']}" ?> </td> <td> <?php echo "{$row['sum2']}" ?> </td> </tr> <tr> <td> <?php echo "{$osum}" ?> </td> </tr> <tr></tr> </table> <?php } } ?> Считает правильно и выводит в виде таблиц, но выводит в таблицу только 1 и 2 строки и итоговую сумму(osum) отображает в таблице только за 2 строчки. Где больше 2х строк, он выбрасывает их за таблицу в одну строку без пробелов, хотя все расчёты проводятся. Если таблицу не использовать и выводить через echo с разделителями и br, то всё расставляет по столбикам. Толи я логику вывода неправильно понимаю, толи знаний мало. Помогите разобраться. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Выложи ещё всю таблицу как sql запрос, где будет схема и данные, так тебе легче будет помочь. Ещё запрос на выборку, всё это можно сделать в PHPMyAdmin через export.
Запрос на выборку из базы: Код (PHP): <?php $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"; $result = mysqli_query($link, $zapros); /* отслеживем ошибку MySQL */ if( !$result ){ echo 'Ошибка: ' .mysqli_errno($link) .':' .mysqli_error($link); }; mysqli_close($link); ?> igordata: либо выборка, либо сумма. выборку предоставил. а какую сумму?
только выбираю в переменную. и через while вывожу построчно из переменной. я пробовал делать так Код (PHP): while ($row = mysqli_fetch_assoc($result)){ if ($row['fam'] != $lFam){ $tsum = 0; $osum = 0; $lFam = $row['fam']; $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka']; $tsum += ($row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'])*0.18; $osum = $tsum; echo "$lFam </br>"; echo "{$row['tel']} | {$row['tel']} | {$row['mestn_zv']} | {$row['abonentka']} | {$row['roum']} | {$row['skidka']} | {$tsum} </br>"; } elseif ($row['fam'] == $lFam){ $lFam = $row['fam']; $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka']; $tsum += ($row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka'])*0.18; $osum += $tsum; echo "{$row['tel']} | {$row['mestn_zv']} | {$row['abonentka']} | {$row['roum']} | {$row['skidka']} | {$tsum} </br>"; } echo "$osum </br>"; } и получил более похожий на желаемый результат, но нужно разбить по таблицам. Я не понимаю где ошибся?
Видимо я не совсем правильно разбираюсь. этим $zapros я запрашиваю данные из базы. там много строчек. а это $result будет некая переменная, которая содержит в себе массив запрошенных строчек. Этим $row = mysqli_fetch_assoc($result) я делаю массив ассоциативным, чтобы выбирать данные по символьному индексу, а не числовому. через while я перебираю строчки и вывожу их. Так я думаю. Проблема в том, что не знаю как данные из $row раскидать по таблицам в которых имени соответствуют определённые номера и посчитать сумму. Т.е хочу получить табличку, где фамилия , ниже строчки с номерами, соответствующие этой фамилии, с суммами. Ниже вторая таблица с фамилией и соответствующими номерами. Получается нужно сделать страницу html с выводом фамилий с номерами. Где-то так. Здесь и застрял.
ну вроде ты правильно думаешь. скопить всё в другой массив, в котором всё будет сгруппировано как тебе надо
Это сделать до while? Или по ходу while помещать строчки в новый массив и формировать таблицы? я пока плохо представляю как это реализовать.
Т.е. делаю Код (PHP): while ($row = mysqli_fetch_assoc($result)) / Потом получаю первую фамилию и записываю в новый массив телефоны с суммами соответствующими этой фамилии? Если фамилия изменилась, то вывожу полученный ранее массив в таблицу, обнуляю значения и запускаю запись нового массива? Это правильный алгоритм?
нет. сначала все фамилии копишь в массив. в самом примитивном виде это вот Код (Text): while ($row = mysqli_fetch_assoc($result)) { $новыймассив[$row['фамилия']][] = $row; потом можно выводить и сумму делать через array_sum()
igordata спасибо за совет, но это сложновато для моего уровня. пришлось напрячься, но более примитивно сделал. получилось такое: Код (PHP): while ($row = mysqli_fetch_assoc($result)){ $tsum = $row['mestn_zv'] + $row['abonentka'] + $row['roum'] + $row['skidka']; $nds = $tsum*0.18; $tsum += $nds; if($lFam != $row['fam']) { if($lFam != null) { ?> <tr> <td colspan="5"> Итого: </td> <td> <?php echo $osum ?> </td> </tr> </table> <?php $osum = 0; } ?> <table style="margin-top:10px;" cellspacing="0" cellpadding="0"> <tr> <td colspan="5"> <?php echo "{$row['fam']}" ?> </td> <td> Май 2015 </td> </tr> <tr> <td>номер</td> <td>местные</td> <td>абонентка</td> <td>роуминг</td> <td>скидка</td> <td>За телефон</td> </tr> <?php } ?> <tr> <td> <?php echo "{$row['tel']}" ?> </td> <td> <?php echo "{$row['mestn_zv']}" ?> </td> <td> <?php echo "{$row['abonentka']}" ?> </td> <td> <?php echo "{$row['roum']}" ?> </td> <td> <?php echo "{$row['skidka']}" ?> </td> <td> <?php echo "{$tsum}" ?> </td> </tr> <?php $osum += $tsum; $lFam = $row['fam']; } ?> <tr> <td colspan="5"> Итого: </td> <td> <?php echo $osum ?> </td> </tr> </table>