Ребята помогите бьюсь 2-е сутки. Столкнулся с проблемой вывода данных из таблицы Mysql по временным интервалам "от" и "до". Данные указываются в полях формы и отправляются в обработчик. Т.е. нужно выводить данные в интервалах между разными датами указанными в полях при заполнении формы PHP: <?php // входящие данные преобразуются из d.m.y в timestamp формат для сравнения $date = $_POST['min']; // входящие данные "от" if (ereg ("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $date, $min)) $mininum = "$min[3].$min[2].$min[1] 00:00:00"; // входящие данные "от" в timestamp формате например 2010.01.01 00:00:00 $dates = $_POST['max']; // входящие данные "до" if (ereg ("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})", $dates, $max)) $maximum = "$max[3].$max[2].$max[1] 00:00:00"; // входящие данные "до" в timestamp формате например 2010.01.11 00:00:00 require 'connect.php'; mysql_query('SET NAMES `utf8`'); $result = mysql_query("SELECT * FROM zayavki WHERE ..."); while($row = mysql_fetch_array($result)) { echo ''; } ?> Заранее благодарен за помощь
ekip А не судьба хранить время и дату в базе в формате unix timestamp? Тогда можно сделать так: [sql]SELECT title FROM articles WHERE (date > 1 AND date < 111211)[/sql] И, при получении из формы, использовать функцию mktime()
PHP: <?php if(!empty($_POST['from']))$W[]='DATE(`dt`)>=DATE(\''.date('Y-m-d', strtotime($_POST['from'])).'\')'; if(!empty($_POST['to']))$W[]='DATE(`dt`)<=DATE(\''.date('Y-m-d', strtotime($_POST['to'])).'\')'; $q=mysql_query('SELECT * FROM `#table#`'.(!empty($W)?' WHERE '.implode(' AND ',$W):''));
Действительно если давать такие запросы данные нужно хранить unix формате. Спасибо admyx! Что получилось: PHP: <?php $datemin = $_POST['min']; // входящие данные "от" $datemax = $_POST['max']; // входящие данные "до" $datemin_time = explode(".",$datemin); // разбивка значения на (.) $postdata_min = mktime(0,0,0,$datemin_time[1],$datemin_time[0],$datemin_time[2]); // преобразуем в unix $datemax_time = explode(".",$datemax); // разбивка значения на (.) $postdata_max = mktime(0,0,0,$datemax_time[1],$datemax_time[0],$datemax_time[2]); // преобразуем в unix require 'connect.php'; mysql_query('SET NAMES `utf8`'); $result = mysql_query("SELECT * FROM zayavki WHERE (data > ".$postdata_min." AND data < ".$postdata_max.")"); // создали запрос while($row = mysql_fetch_array($result)) { echo ''.$row['id'].''; // вывели } ?>
Еще возник вопрос с интервалами и датами, тот же самый код описанный выше: PHP: <?php $datemin = $_POST['min']; // входящие данные "от" $datemax = $_POST['max']; // входящие данные "до" $datemin_time = explode(".",$datemin); // разбивка значения на (.) $postdata_min = mktime(0,0,0,$datemin_time[1],$datemin_time[0],$datemin_time[2]); // преобразуем в unix $datemax_time = explode(".",$datemax); // разбивка значения на (.) $postdata_max = mktime(0,0,0,$datemax_time[1],$datemax_time[0],$datemax_time[2]); // преобразуем в unix function unix_time_convert ($timestamp) { $date = date ("d.m.Y" , $timestamp); return $date; } require 'connect.php'; $query = "SELECT * FROM zayavki WHERE izdanie = 1 AND(data > ".$postdata_min." AND data < ".$postdata_max.") ORDER BY data"; $result = mysql_query($query); WHILE ($row = mysql_fetch_array($result)) { echo ''; $time = $row['data']; $date = unix_time_convert($time); echo ''.$date.''; echo' г.; '.$row['summa'].'; <br>'; } ?> При выполнении выводит даты по выбранному интервалу и данные с поля оплата (цикл): 31.12.2009 г.; 12900; 31.12.2009 г.; 12900; 31.12.2009 г.; 12900; 01.01.2010 г.; 4300; 06.01.2010 г.; 5600; 06.01.2010 г.; 5600; 10.01.2010 г.; 23900; 10.01.2010 г.; 23900; Требуется по заданному интервалу сложить поля оплата из таблицы и отобразить дату, т.е. конечный вид должен быть такой: 31.12.2009 г.; 38700; 01.01.2010 г.; 4300; 06.01.2010 г.; 11200; 10.01.2010 г.; 47800; Как можно победить?
Вот так: PHP: <?php $datemin = $_GET['min']; // входящие данные "от" $datemax = $_GET['max']; // входящие данные "до" $datemin_time = explode(".",$datemin); // разбивка значения на (.) $postdata_min = mktime(0,0,0,$datemin_time[1],$datemin_time[0],$datemin_time[2]); // преобразуем в unix $datemax_time = explode(".",$datemax); // разбивка значения на (.) $postdata_max = mktime(0,0,0,$datemax_time[1],$datemax_time[0],$datemax_time[2]); // преобразуем в unix function unix_time_convert ($timestamp) { $date = date ("d.m.Y" , $timestamp); return $date; } require 'connect.php'; $query = "SELECT data, SUM(summa) FROM zayavki WHERE izdanie = 1 AND(data > ".$postdata_min." AND data < ".$postdata_max.") GROUP BY data " ; $result = mysql_query($query); WHILE ($row = mysql_fetch_array($result)) { echo ''; $time = $row['data']; $date = unix_time_convert($time); echo ''.$date.''; echo' г.; '.$row['SUM(summa)'].'; <br>'; } ?> 440Hz спасибо!
PHP: <?php $datemin = $_POST['min']; // входящие данные "от" $datemax = $_POST['max']; // входящие данные "до" $datemin_time = explode(".",$datemin); // разбивка значения на (.) $postdata_min = mktime(0,0,0,$datemin_time[1],$datemin_time[0],$datemin_time[2]); // преобразуем в unix $datemax_time = explode(".",$datemax); // разбивка значения на (.) $postdata_max = mktime(0,0,0,$datemax_time[1],$datemax_time[0],$datemax_time[2]); // преобразуем в unix function unix_time_convert ($timestamp) { $date = date ("d.m.Y" , $timestamp); return $date; } require 'connect.php'; $query = "SELECT data, SUM(summa) FROM zayavki WHERE izdanie = 1 AND(data > ".$postdata_min." AND data < ".$postdata_max.") GROUP BY data " ; $result = mysql_query($query); $file="temp_1.csv"; $fp=fopen("$file", 'w+'); WHILE ($row = mysql_fetch_array($result)) { echo ''; $time = $row['data']; $summa = $row['SUM(summa)']; $date = unix_time_convert($time); $inf = ''.$date.' г.; '.$summa.';'; fwrite($fp, "$inf \n"); } ?> Я получил и суммировал все заявки по каждому числу в запросе поставил условие izdanie = 1 Т.е. отобрал только те которые относятся к 1 изданию, в поле izdanie существует значение izdanie = 2 В вышеприведенном коде я записываю полученные данные в файл temp_1.csv в виде: 31.12.2009 г.; 38700; 01.01.2010 г.; 4300; 06.01.2010 г.; 11200; 10.01.2010 г.; 47800; далее подключаю файл temp_1.csv к amCharts и получаю график. На графике должны отображаться 2 показателя, отображается только 1 т.е. izdanie = 1 Т.е. нужно запрос скорректировать так что бы можно было записать данные в виде: 31.12.2009 г.; 38700; 1233; 01.01.2010 г.; 4300; 4300; 06.01.2010 г.; 11200; 32000; 10.01.2010 г.; 47800; 1254; Можно ли такое реализовать?
Можно, но несколько неудобно. Несколько проще получить такое. Надо просто сделать группировку по двум полям - дате и изданию 31.12.2009 г.; 38700; 31.12.2009 г.; 1233; 01.01.2010 г.; 4300; 01.01.2010 г.; 4300; 06.01.2010 г.; 11200; 06.01.2010 г.; 32000; 10.01.2010 г.; 47800; 10.01.2010 г.; 1254; или нужен все же вариант? 31.12.2009 г.; 38700; 1233;
Simpliest идея конечно хорошая но не совсем подходит, amCharts разбивает значения на ( дата 1 график 2 график ----------------|-----------|-------- 31.12.2009 г.; 38700; 1233; в предложенном варианте в графике просто дублируются даты с разными значениями поэтому нужен вариант 31.12.2009 г.; 38700; 1233;
А когда потребуется 3й? тоже так же рядом? Я предлагаю тебе сделать выборку как я сказал. А собрать строку уже в PHP на SQL это весьма громоздко. У тебя будет несколько JOIN на подзапросы.
PHP: <?php WHILE ($row = mysql_fetch_array($result)) { echo ''; $izdanie = $row['izdanie']; $time = $row['data']; $summa = $row['SUM(summa)']; $date = unix_time_convert($time); $inf_one = ''.$date.' г.; '.$summa.';'; $inf_two = ''.$summa.';'; if ($izdanie == 2) echo $inf_two; else echo $inf_one; fwrite($fp, "$inf \n"); // записывали $inf } ?> Ну собственно получилось вывести как положено, но вот записать теперь как? Если я до этого записывал переменную $inf то теперь нужно записать условие. :cry:
PHP: <?php $lines = array(); while (false !== ($row = mysql_fetch_array($result))) { if (isset($lines[$row['data'])) { $lines[$row['data']] .= ';' . $row['SUM(summa)']; } else { $lines[$row['data']] = $row['data'] . ';' . $row['SUM(summa)']; } } $toFile = implode("\n",$lines); file_put_contents('my.csv', $toFile);
Вот это: PHP: <? while (false !== ($row = mysql_fetch_array($result))) { if (isset($lines[$row['data'])) { ... по правилам вроде должно быть : PHP: <? while (($row = mysql_fetch_array($result))!==false) { if (isset($lines[$row['data'])) { .... а вообще кто во что горазд, но { "на" строчке , а не "под" - мало кто использует
Никак я не осилю, новый косяк появился от группировки PHP: <?php $datemin = $_GET['min']; // входящие данные "от" $datemax = $_GET['max']; // входящие данные "до" $datemin_time = explode(".",$datemin); // разбивка значения на (.) $postdata_min = mktime(0,0,0,$datemin_time[1],$datemin_time[0],$datemin_time[2]); // преобразуем в unix $datemax_time = explode(".",$datemax); // разбивка значения на (.) $postdata_max = mktime(0,0,0,$datemax_time[1],$datemax_time[0],$datemax_time[2]); // преобразуем в unix function unix_time_convert ($timestamp) { $date = date ("d.m.Y" , $timestamp); return $date; } require 'connect.php'; $query = "SELECT data,izdanie, SUM(summa) FROM zayavki WHERE (data > ".$postdata_min." AND data < ".$postdata_max.") GROUP BY data,izdanie " ; $result = mysql_query($query); $file="temp_1.csv"; $toFile = fopen("$file", 'w+'); $lines = array(); while (false !== ($row = mysql_fetch_array($result))) { $summa = $row['SUM(summa)']; $time = $row['data']; $date = unix_time_convert($time); if (isset($lines[$date])) { $lines[$date] .= '' . $summa . ';'; } else { $lines[$date] = $date . ' г.; ' . $summa . '; '; } } $toFile = implode("\n",$lines); file_put_contents('temp_1.csv', $toFile); ?> В файл temp_1.csv пишет: 31.12.2009 г.; 22800; 02.01.2010 г.; 41100; 03.01.2010 г.; 19900; 23900;12600;23900; 05.01.2010 г.; 11300; 5600; 06.01.2010 г.; 22800; 07.01.2010 г.; 28200; 12900; 08.01.2010 г.; 30950; 09.01.2010 г.; 5600; 10.01.2010 г.; 7000; 03.01.2010 г.; 19900; 23900;12600;23900; то что в конце 2 суммы: 12600;23900; это тоже 03.01.2010 г. а возникло это из за того что стоит GROUP BY data, так как даты записаны в формате unix timestamp группирует запрос только строго равные числа, например 1262470800 и 1262450000 это все 03.01.2010 г. а группировка на эти числа(даты) не работают, поэтому он выплевывает нам такое, еже не знаю что делать даже... :cry:
Как нам рассказывал один человек открытие блока на следующей строчке пошло с древних времен от С программистов, которым платили за количество созданных строчек кода. Открытие блока на той же строчке более соответствует стилю Java программирования.
Честно? В большинстве случаев это делает IDE, мне такое не мешает, вот и все Ну и пустая висячая строчка с одной скобкой иногда раздражает - когда кода немного. ekip Ну так и группируй не по самой дате, а по DATEFORMAT('yyyy.mm.dd', data) (синтаксис правильный посмотришь на dev.mysql.com) и в поле это же выводи, иначе у тебя строки не будут собираться правильно.
И такой момент почитай мануал - что кто возращает и какие параметры принимает http://php.net/fopen http://php.net/file_put_contents