Подскажите как подсчитать сумму переменной из цикла? побывал пользоваться оператором присваивания += но ничего хорошего не выходит.
PHP: <?php while($arr = mysql_fetch_array($result)){ $a = $arr['summa'] $a += $a; echo $a; } ?> складывает так $a = $a + $a ( где $a = 12 ) echo $a; выводит 24 и так каждую ячейку из поля summa, 24 ( ячейке 12) 16 ( в ячейке 8) 20 ( в ячейке 10) А нужно бы сложить полученную переменную $a результата выполнения цикла, т.е. 12+8 = 20 20+10 =30 и.т.д и получить конечный результат, сразу оговорюсь что SUM(summa) в mysql запросе не подходит.
Ты постоянно перезаписываешь сумму $a += $b это экивалент $a = $a + $b А теперь посмотри на то, как ты его применяешь и что в итоге получаешь?
На самом деле наверняка подходит, просто ты скорее всего неправильно составляешь запрос. Хотя, исключения конечно бывают - но редко
PHP: <?php $result = mysql_query("SELECT SUM(oplata),zayavka,number FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka"); while($arr = mysql_fetch_array($result)) { $zapopl = substr_count($arr['number'], ','); // Подсчитали кол-во запятых (в поле например 01,02,04,05 а может быть и только 01,) $sumsopl = $arr['SUM(oplata)']; // Получили суммарный массив отсортированный по $izdanie и содержащий к примеру 01, и сгпупированный по полю zayavka преобразовали в переменную $sumsopl $itogsumoplata = $sumsopl / $zapopl; // Получили оплату по искомому нами номеру в поле number разделив ровно на кол разделителей (,) в поле number echo " <font color='#99cc00'>".$itogsumoplata."</font> руб."; // Вывели // после этого я хотел с помощью оператора присваивания получить сумму переменной $itogsumoplata и выкинуть его за пределы цикла, так что бы он показал последний результат сложения не в цикле $itogsumoplata += $itogsumoplata; } echo $itogsumoplata; ?>
Этой конструкции я вообще не понял Код сумбурный. Можно на словах конечную цель всех манипуляций? (не подсчитать сумму, а для чего это все делается?)
PHP: <?php $izdanie = $_GET['izdanie']; // входящие данные "издание" $numbs = $_GET['number']; // входящие данные "номер" $result = mysql_query("SELECT SUM(oplata),zayavka,number FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka"); // Выделяем поля oplata (суммировать),zayavka,number в таблице data_oplata только izdanie = ".$izdanie." и выбираем значения равные нашему $numbs после чего сгруппировавшем по номеру заявки в книжном магазине. ?>
Это все хорошо, но картину до конца не проясняет. Что нужно? Посчитать сколько было заявок и за сколько заплатили? Посчитать общую сумму оплаты по клиенту? Посчитать общую сумму оплаты по номеру от всех клиентов?
Все работает идеально, единственное что остается это вывести сумму (оплата за номер), в виду геморройного принципа действия электронного магазина упростить или пересмотреть принцип связки таблиц невозможно, поэтому приходится сначала что то суммировать запросом mysql прямо в цикле выполнять действия и выводить результат.
Что мешает это сделать влоб? [sql]SELECT SUM(`oplata`) FROM `data_oplata` WHERE `izdanie` = 'чему-то' AND `number` LIKE 'чего-то' GROUP BY `izdanie`, `number` [/sql]
Например номер заявки 360, по ней может существовать несколько оплат под разными id в таблице data_oplata, но мы их группируем по номеру заявки, так как она может быть не до конца проплачена, Запись id 400 имеет платеж 288 руб, это за номера 08 и 18, но мы сортировали только 18 номер, что бы узнать сколько унас проплачено за 18 номер мы делим нашу оплату на количество номеров (так как расчет в оплату вноситься формулами и со всяческими скидками) получаем оплату 144 руб, если у нас существовала еще проплата по номеру 18 и по той же заявке оплата так же рассчитывается и суммируется, аналогично поступаем с заявкой № 401
Намудрили. При таком подходе к оплате за номера.... Дельного будет крайне мало. Простой пример. Что произойдет если номер стоит 200 руб, я заплатил 288 за 2 номера (08, 18). Т.е. один полностью, а один на 88 руб. Как это посчитается? Поделится пополам? по 144? А в следующий раз я заплачу 312 руб за 2 номера (18, 28). Т.е. доплачу 112 за 18й и 200 за 28й. У тебя опять поделится пополам на два номера? Итого 08й = 144 руб, 18й = 144 руб + 156 руб, 28й = 156 руб. А номер то, стоит 200 руб. Рекомендую расщеплять платежи сразу при поступлении и записывать в базу (в одну таблицу просто платежи, во вторую уже расщепленые по номерам). Причем расщеплять именно по стоимости номеров. Т.е из 288 рублей за 2 номера, сначала оплачивается 1й номер полностью, а остаток суммы записываеться как платеж за 2й номер. Выборки будут крайне тривиальные.
В поле оплата стоит проверка, нельзя заплатить свыше стоимости 1 номера (фиксированная сумма) Чекбоксами указываете номера, java передает в поле разрешенное кол-во оплаты, т.е. 200 можно заплатить только отельной проплатой т.е. за 1 номер Остальные 88 руб вы кидаете с баланса клиента не фиксированной суммой на 2-й номер, в следующий раз скрипт вам скажет что по этой заявке вы можете оплатить всего лишь 112 руб. а выше описанный скрипт как раз таки все считает и суммирует. Так как валидация работает нормально ошибок никаких не возникает, потому как пришлось создавать отдельные балансы клиентов. Была идея расщеплять 1 заявку на несколько заявок по клиенту, но это выглядит громоздко, учитывая то что в заявке может быть аж 60 номеров а за сутки заявок около 400.
Тогда каким образом оно попадает в базу в виде общей суммы и списка номеров в одной записи? Почему из этого не формируются две записи оплаты под одну заявку? Не надо расщеплять заявку. Надо расщеплять оплату. И хранить расщепление отдельно. Тогда не будет изысков с такой логикой суммирования. Вобщем, если есть желание бодаться с таким алгоритмом - ради бога. Ошибку почему не суммирует, я тебе указал.
PHP: <?php $result = mysql_query("SELECT SUM(oplata),zayavka,number FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka"); while($arr = mysql_fetch_array($result)) { $zapopl = substr_count($arr['number'], ','); // Подсчитали кол-во запятых (в поле например 01,02,04,05 а может быть и только 01,) $sumsopl = $arr['SUM(oplata)']; // Получили суммарный массив отсортированный по $izdanie и содержащий к примеру 01, и сгпупированный по полю zayavka преобразовали в переменную $sumsopl $itogsumoplata = $sumsopl / $zapopl; // Получили оплату по искомому нами номеру в поле number разделив ровно на кол разделителей (,) в поле number echo " <font color='#99cc00'>".$itogsumoplata."</font> руб."; // Вывели // после этого я хотел с помощью оператора присваивания получить сумму переменной $itogsumoplata и выкинуть его за пределы цикла, так что бы он показал последний результат сложения не в цикле $sumoplata += $itogsumoplata; } echo 'Всего оплатили:'.$sumoplata.''; ?> Поправил работает, Общая сумма и список номеров в заявке хранится в таблице zayavki, все попадает из формы и рассчитывается по формуле скриптом затем записывается в таблицу zayavki, а скрипт внесения оплаты получает данные по номеру заявки из таблицы zayavki. Я понимаю что можно было бы сделать и проще но кто знал что нужно будет такие выборки и сортировки делать, в любом бы случае передумал бы структуру базы, это у девочек "аппетит приходит во время еды" поэтому пришлось вымудровываться. Менять что то сейчас уже не имеет смысла, так как перенести все и изменить структуру еще больший гемморой. Simpliest все же огромное спасибо за интерес и проявленную помощь!