[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обработчик для формы поиска
WisesT
Доброго времени суток!
Прошу помощи в следующем деле.
Есть страница поиска по БД. Выкладываю полностью (ниже по частям)
Свернутый текст
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script
type="text/javascript" src="java/jquery.js"></script>
<script
type="text/javascript" src="java/jquery.maskedinput-1.2.2.js"></script>
<script
type="text/javascript">
jQuery(function($) {
$.mask.definitions['~']='[+-]';
$('#date_start').mask('99-99-9999');
$('#date_end').mask('99-99-9999');
});</script>
<title>
Поиск</title>
</head>

<body>
<table
width="100%" border="1">
<tr>
<td
colspan="2">Шапка</td>
</tr>
<tr>
<td
colspan="2"><form id="search_form" name="search_form" method="post" action="">
<table
width="100%" border="0">
<tr>
<td><label
for="date_start">Дата: с</label>
<input
type="text" name="date_start" id="date_start" />
по
<label for="date_end"></label>
<input
type="text" name="date_end" id="date_end" /></td>
<td><label
for="firma">Фирма</label>
<input
type="text" name="firma" id="firma" /></td>
<td><label
for="oplata">Оплата</label>
<select
name="oplata" id="oplata">
<option
value="">неважно</option>
<option
value="nal">Нал</option>
<option
value="beznal">Безнал</option>
</select></td>
<td><label
for="prinyal">Принял(а)</label>
<select
name="prinyal" id="prinyal">
<option
value="sotr_1">Сотрудник 1</option>
<option
value="sotr_2">Сотрудник 2</option>
<option
value="">неважно</option>
</select></td>
<td><label
for="kurier">Курьер</label>
<select
name="kurier" id="kurier">
<option
value="kurier_1">Курьер 1</option>
<option
value="kurier_2">Курьер 2</option>
<option
value="">неважно</option>
</select>
<input
type="submit" name="search_button" id="search_button" value="Искать" /></td>
</tr>
</table>
</form></td>
</tr>
<tr>
<td
width="205px">Меню</td>
<td
width="100%"><table width="100%" border="1">
<tr>
<td>
Номер</td>
<td>
Дата</td>
<td>
На когда</td>
<td>
Готовность</td>
<td>
Фирма</td>
<td>
Адресс</td>
<td>
Имя</td>
<td>
Телефон</td>
<td>
Вес</td>
<td>
Куда</td>
<td>
Оплата</td>
<td>
Примечания</td>
<td>
Принял</td>
<td>
Курьер</td>
<td>
Статус</td>
</tr>
<tr>
<td>
Результат_номер</td>
<td>
Результат_дата</td>
<td>
Результат_на-когда</td>
<td>
Результат_готовность</td>
<td>
Результат_фирма</td>
<td>
Результат_адресс</td>
<td>
Результат_имя</td>
<td>
Результат_телефон</td>
<td>
Результат_вес</td>
<td>
Результат_куда</td>
<td>
Результат_оплата</td>
<td>
Результат_примечания</td>
<td>
Результат_принял</td>
<td>
Результат_курьер</td>
<td>
Результат_статус</td>
</tr>
</table></td>
</tr>
<tr>
<td
colspan="2">Подвал</td>
</tr>
</table>
</body>
</html>


Есть в ней вот такая форма (поиска)

<form id="search_form" name="search_form" method="post" action="">
<table
width="100%" border="0">
<tr>
<td><label
for="date_start">Дата: с</label>
<input
type="text" name="date_start" id="date_start" />
по
<label for="date_end"></label>
<input
type="text" name="date_end" id="date_end" /></td>
<td><label
for="firma">Фирма</label>
<input
type="text" name="firma" id="firma" /></td>
<td><label
for="oplata">Оплата</label>
<select
name="oplata" id="oplata">
<option
value="nal">Нал</option>
<option
value="">неважно</option>
<option
value="beznal">Безнал</option>
</select></td>
<td><label
for="prinyal">Принял(а)</label>
<select
name="prinyal" id="prinyal">
<option
value="sotr_1">Сотрудник 1</option>
<option
value="sotr_2">Сотрудник 2</option>
<option
value="">неважно</option>
</select></td>
<td><label
for="kurier">Курьер</label>
<select
name="kurier" id="kurier">
<option
value="kurier_1">Курьер 1</option>
<option
value="kurier_2">Курьер 2</option>
<option
value="">неважно</option>
</select>
<input
type="submit" name="search_button" id="search_button" value="Искать" /></td>
</tr>
</table>
</form>

и вроде как место под результат
<table width="100%" border="1">
<tr>
<td>
Номер</td>
<td>
Дата</td>
<td>
На когда</td>
<td>
Готовность</td>
<td>
Фирма</td>
<td>
Адресс</td>
<td>
Имя</td>
<td>
Телефон</td>
<td>
Вес</td>
<td>
Куда</td>
<td>
Оплата</td>
<td>
Примечания</td>
<td>
Принял</td>
<td>
Курьер</td>
<td>
Статус</td>
</tr>
<tr>
<td>
Результат_номер</td>
<td>
Результат_дата</td>
<td>
Результат_на-когда</td>
<td>
Результат_готовность</td>
<td>
Результат_фирма</td>
<td>
Результат_адресс</td>
<td>
Результат_имя</td>
<td>
Результат_телефон</td>
<td>
Результат_вес</td>
<td>
Результат_куда</td>
<td>
Результат_оплата</td>
<td>
Результат_примечания</td>
<td>
Результат_принял</td>
<td>
Результат_курьер</td>
<td>
Результат_статус</td>
</tr>
</table>

Таблица из которой берутся данные, имеет следующую структуру
CREATE TABLE `zakazy_test` (
`nomer` int(11) NOT NULL AUTO_INCREMENT ,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`gotovnost` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`firma` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`adress` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`imya` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`tel` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`ves` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`kuda` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`oplata` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`primechaniya` varchar(200) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`prinyal` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`kurier` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`na_kogda` date NOT NULL ,
`status` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`prioritet` varchar(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
PRIMARY KEY (`nomer`)
)

ENGINE=InnoDB
DEFAULT
CHARACTER SET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=15
ROW_FORMAT=COMPACT
;


Что нужно сделать:
Помогите правильно написать sql-запрос и правильно вывести результат.

Запрос
Что-то похожее на

SELECT FROM zakazy_test WHERE time=(Диапазон от date_start до date_end)
AND firma=firma
AND oplana=oplata
AND prinyal=prinyal
AND kurier=kurier
AND status=status

Но как быть если к примеру поле "Оплата" не важно и его можно оставить пустым?
Для этого я создал пункт
<option value="">неважно</option>
с пустым value="". Правильно ли это? Проверить не могу, запрос еще не написан.
Тоже самое, если запрос будет на подобии
"Вся заказы за такой-то период, где оплата была по безналу". Как тогда правильно написать запрос?.

Теперь о выводе результата.
Предположим, нашли мы запись удовлетворяющую запрос.
Как вывести запись полностью? Всю строку из бд.
+ не 1 запись, а несколько, если это потребуется.

Очень уповаю на вашу помощь и ТЕРПЕНИЕ.



Спустя 6 часов, 14 секунд (3.03.2012 - 00:35) vmunt написал(а):
Вообще-то проблем не должно быть по идее:
function post($name) { return (isset($_POST[$name])?$_POST[$name]:''); }
// Эту функцию следует сильно расширить проверками на безопасность (термины HTML injection, PHP injection, SQL injection знакомы?)

$conditions = (post('date_start')!=''?' and time>='.post('date_start'):'');
$conditions.= (post('date_end')!=''?' and time<='.post('date_end'):'');
$conditions.= (post('firma')!=''?" and firma like '%".post('firma')."%'":'');
$conditions.= (post('oplata')=='nal'?" and oplata='Наличные'":'');
$conditions.= (post('oplata')=='beznal'?" and oplata='Безналичный расчёт'":'');
// В последних трёх случаях вообще-то просится связанная таблица по типу
//" and oplata_id=(select id from oplata_type where oplata_name='".post('oplata')."')"


$query =
'SELECT
список нужных полей
FROM zakazy_test'
.
(
strlen($conditions>0)
?
' WHERE '.substr($conditions,4)
:
''
);

Запрос выдаст произвольное количество строк, ну а далее Вы знаете, что делать...

Спустя 9 часов, 31 минута, 15 секунд (3.03.2012 - 10:06) WisesT написал(а):
Спасибо.
Вижу для себя кучу новых/незнакомых функций.
Почитаю, покопаю. Если не разберусь - отпишусь.
Я вообще думал, что это как-то будет строиться на AND/OR/LIKE, но пхоже этого будет мало.

Спустя 26 минут, 35 секунд (3.03.2012 - 10:33) killer8080 написал(а):
WisesT
как вариант
// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$defs = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "
SELECT *
FROM `zakazy_test`
WHERE `time` BETWEEN '"
.$start_date."' AND '".$end_date."'
"
;

foreach($defs as $k => $v)
$sql .= isset($_POST[$k]) && $_POST[$k] != '' ? " AND `".$v."` = '".mysql_real_escape_string($_POST[$k])."'" : '';

mysql_query($sql);




Спустя 5 минут, 35 секунд killer8080 написал(а):
Кстати ввод даты нужно делать селектами, а не текстовым инпутом.

Спустя 29 минут, 51 секунда (3.03.2012 - 11:03) WisesT написал(а):
killer8080
"Кстати ввод даты нужно делать селектами, а не текстовым инпутом."
Тоесть?

Спустя 38 секунд (3.03.2012 - 11:03) WisesT написал(а):
А! Тоесть селект на день, месяц, год?

Спустя 3 минуты, 3 секунды (3.03.2012 - 11:06) killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 10:03)
А! Тоесть селект на день, месяц, год?

Естественно, мало ли в каком формате юзер начнет в инпут дату вписывать. smile.gif

Спустя 1 минута, 4 секунды (3.03.2012 - 11:07) WisesT написал(а):
killer8080
А можно без масивов? я пока с ними плохо знаком.

Спустя 1 минута, 23 секунды (3.03.2012 - 11:09) killer8080 написал(а):
Либо выводить календарик, так даже юзабильней будет smile.gif



Спустя 31 секунда killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 10:07)
А можно без масивов? я пока с ними плохо знаком.

Ну так самое время познакомится rolleyes.gif

Спустя 2 минуты, 46 секунд (3.03.2012 - 11:12) WisesT написал(а):
killer8080
Про календарик. Это походу вообще каким-то отдельным скриптом нужно пилить. Куда уж мне)

Щас пока попробую инпут даты в селекты перевести.
А с запросом, пока так и не разобрался)

Спустя 19 минут, 53 секунды (3.03.2012 - 11:32) WisesT написал(а):
Блин) дата через селекты - тоже проблемка)
Ладно там, если бы можно было написать просто селекты на Дни, Месяца, Года.
Но тут же есть заморочка с кол.дней в определенных месяцах)

АПД. Фиг с ней, с датой через селекты.
Пусть пока так вводят. Как с запросом быть?

Спустя 21 минута, 50 секунд (3.03.2012 - 11:53) killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 10:32)
Пусть пока так вводят. Как с запросом быть?

как запрос сделать я уже показал, а насчет даты, ну хотя бы укажи что она должна быть в формате YYYY-MM-DD.
Хотя я не понял в чем проблема с селектами? Повесь на onchange обработчик который будет динамически модифицировать селект по количеству дней в месяце.

Спустя 8 минут, 37 секунд (3.03.2012 - 12:02) WisesT написал(а):
killer8080
Цитата
Повесь на onchange обработчик который будет динамически модифицировать селект по количеству дней в месяце.

Это нужно будет писать еще один обработчик и довольно непростой.

Цитата
укажи что она должна быть в формате YYYY-MM-DD.

я думал потом разворачивать из DD-MM-YYYY в YYYY-MM-DD (у меня же там стоит маска ввода). Но есть там еще одна загвоздка.

`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,

Тоесть там еще и время дописывается. Но думаю это тоже можно будет допилить.

Цитата
как запрос сделать я уже показал

похоже твой вариант не реагирует на запросы типа "все заказы (неважно какая дата, фирма, курьер...) в период с ** по **" или "все заказы курьера такого-то".
Могу ошибаться. Малоли что таится в неведомых мне масивах))

Спустя 40 минут, 26 секунд (3.03.2012 - 12:42) killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 11:02)
Это нужно будет писать еще один обработчик и довольно непростой.

Свернутый текст
<script type="text/javascript">

function checkDate(select){
var myform = select.form,
year = myform.year,
month = myform.month,
day = myform.day,
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var days = dayInMonth[month.value];
if(year.value %4 == 0 && month.value == 2)
days++;
day.options.length = 0;

var selDay = (day.value <= days) ? day.value : days;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}


function addOption (oListbox, text, value, isSelected, highLight){
var option = document.createElement("option");
option.appendChild(document.createTextNode(text));
option.setAttribute("value", value);
if(typeof isSelected == 'undefined') isSelected= false;
if(typeof highLight == 'undefined') highLight= false;

if(highLight) option.style.color= "#F00";
if(isSelected){
if(navigator.userAgent.toLowerCase().indexOf("msie")!= -1)
option.selected= true;
else
option.defaultSelected = true;
}

oListbox.appendChild(option);
}
</script>
<
form>
<
select name="day">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>


<
select name="month" onchange="checkDate(this)">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
</
select>


<
select name="year" onchange="checkDate(this)">
<
option value="2007">2007</option>
<
option value="2008">2008</option>
<
option value="2009">2009</option>
<
option value="2010">2010</option>
<
option value="2011">2011</option>
<
option value="2012">2012</option>
</
select>
</
form>

Цитата (WisesT @ 3.03.2012 - 11:02)
я думал потом разворачивать из DD-MM-YYYY в YYYY-MM-DD (у меня же там стоит маска ввода). Но есть там еще одна загвоздка.

`time`timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,

Тоесть там еще и время дописывается. Но думаю это тоже можно будет допилить.

не понял вопроса, все там правильно, при добавлении записи в таблицу, автоматом прописывается текущая дата.
Цитата (WisesT @ 3.03.2012 - 11:02)
(неважно какая дата

я бы просто добавил чекбокс "за период", и по его активации показывал селекты с вводом даты. Аналогично на серверной стороне проверял бы наличие флага
// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = mysql_real_escape_string($_POST['from_year'].'-'.$_POST['from_month'].'-'.$_POST['from_day']);
$end_date = mysql_real_escape_string($_POST['till_year'].'-'.$_POST['till_month'].'-'.$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

mysql_query($sql);

Спустя 35 минут, 19 секунд (3.03.2012 - 13:18) WisesT написал(а):
killer8080
Цитата
не понял вопроса, все там правильно, при добавлении записи в таблицу, автоматом прописывается текущая дата.

Смотри. При добавлении заказа, автоматом ставит таймштамп в виде ГГГГ-ММ-ДД чч-мм-сс. А мы в запросе даем только ГГГГ-ММ-ЧЧ.
Цитата
я бы просто добавил чекбокс "за период", и по его активации показывал селекты с вводом даты. Аналогично на серверной стороне проверял бы наличие флага

Нет, нужно организовать именно так. Пусть ввод даты будет обязательным.
Мне больше заморочки с тем, как заставить его реагировать и на запросы с отсутствующими некоторыми данными.
Например "по курьеру за такой-то период", "Все заказы за период с* по* сотрудника такого-то", ну вообщем полноценный расширеный поиск.
я думал это через AND|OR как-то реализовывается, но похоже ошибся.
П.С. спасибо за терпение.

Спустя 38 секунд (3.03.2012 - 13:18) killer8080 написал(а):
это лучше заменить
$start_date = mysql_real_escape_string($_POST['from_year'].'-'.$_POST['from_month'].'-'.$_POST['from_day']);
$end_date = mysql_real_escape_string($_POST['till_year'].'-'.$_POST['till_month'].'-'.$_POST['till_day']);

на это
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);

И добавить проверку валидности периода.

Спустя 3 минуты, 54 секунды (3.03.2012 - 13:22) killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 12:18)
Смотри. При добавлении заказа, автоматом ставить таймштамп в виде ГГГГ-ММ-ДД чч-мм-сс. А мы в запросе даем только ГГГГ-ММ-ЧЧ.

тут проблемы нет, MySQL сам корректно обрабатывает даты, можешь проверить.
Цитата (WisesT @ 3.03.2012 - 12:18)
Нет, нужно организовать именно так. Пусть ввод даты будет обязательным.

ну тогда как в первом моем варианте.
Цитата (WisesT @ 3.03.2012 - 12:18)
я думал это через AND|OR как-то реализовывается, но похоже ошибся.

ну так и есть, через AND добавляются обязательные опции.

Спустя 10 минут, 38 секунд (3.03.2012 - 13:33) WisesT написал(а):
Цитата
ну так и есть, через AND добавляются обязательные опции.

К примеру нужно найти все заказы курьера Ололоева, с безнальным расчетом(заполнены не все поля. не указан сотрудник принявший заказ и фирма).
В форме поиска указываем период (так как он будет обязательным), поле "Фирма оставляем пустым)

where firma=(пусто) AND oplata="beznal" AND prinyal=(Пусто) AND kurier="Ололоев"

выдаст мне то что нужно?

+ если нужно найти заказы за такой-то период, фирмы "Гараж" с оплатой по наличке, курьера Ололоева, которые принял Сотрудник1(заполнены все поля), то этаже форма сделает

where firma="Гараж" AND oplata="beznal" AND kurier="Ололоев" AND prinyal="Сотрудник1"
и выдаст нужный результат?
АПД. Ко второму варианту в запрос еще и дата подставится.

Спустя 2 минуты, 48 секунд (3.03.2012 - 13:36) Visman написал(а):
Цитата (WisesT @ 3.03.2012 - 18:33)
where firma=(пусто) AND oplata="beznal" AND prinyal=(Пусто) AND kurier="Ололоев"

Наверное надо из условия убирать те сравнения где (пусто).

Спустя 3 минуты, 56 секунд (3.03.2012 - 13:40) killer8080 написал(а):
Цитата (WisesT @ 3.03.2012 - 12:33)
В форме поиска указываем период (так как он будет обязательным), поле "Фирма оставляем пустым)
where firma=(пусто) AND oplata="beznal" AND prinyal=(Пусто) AND kurier="Ололоев" выдаст мне то что нужно?

нет, если ты в запросе укажешь firma='' выведет только те записи, где поле firm не заполнено, тебе же нужно просто вывести с любым значением этого поля? Значит это условие нужно просто не вписывать в запрос, что собственно мой пример и делает. Попробуй вывести содержимое $sql через echo, и посмотри как выглядит запрос. Потом можешь его скопировать, и пихнуть в PMA, увидишь результат.

Спустя 24 минуты, 41 секунда (3.03.2012 - 14:04) WisesT написал(а):
Хорошо. Буду делать попорядку.
Переделал инпут даты на селекты. Теперь выглядит вот так
Свернутый текст
<form id="form_from_date" name="form_from_date">
<label
for="date">Дата: <br>с<br></label>
<select
name="from_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="31">31</option>
</select>


<select
name="from_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="12">12</option>
</select>


<select
name="from_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>
<option
value="2010">2010</option>
<option
value="2011">2011</option>
<option
value="2012">2012</option>
</select></form><br>


<form
id="form_till_date" name="form_till_date">
<label
for="date_end">по</label>
<select
name="till_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="31">31</option>
</select>


<select
name="till_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="12">12</option>
</select>


<select
name="till_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>
<option
value="2010">2010</option>
<option
value="2011">2011</option>
<option
value="2012">2012</option>
</select>
</form>

Твой обработчик к селектам даты работал, когда именя селектов были day, month, year. Причем работало сразу на две групы селектов.
Переименовал селекты под твой пример (добавил from_ till), но тпеперь скрипт отказался работать. Понимаю, что из-за изменений имен селектов, но переделать сам не могу (ума нехватает).

Щас еще за сам РНР возьмусь. Отпишусь в след посте.

Спустя 17 минут, 2 секунды (3.03.2012 - 14:21) WisesT написал(а):
Обработчик, как я понимаю должен иметь следующий вид?
<?php
include("config.php");

// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
//if(isset($_POST['period'])){ // period - имя чекбокса
// мы же без чекбокса

$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
//}

//foreachтоже убрал. чекбокса то нет
//$check as $k => $v

if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

mysql_query($sql);
?>


UPD. Неа, не работает. Что-то я накриворучил)
UPD2. подтер $check as $k => $v//), страничка начала отображаться. Ща проверим или ищет.

Но тут вопрос. Как выводить всю строку из бд? а не только те которые являются параметрами поиска?

Спустя 2 часа, 45 минут, 57 секунд (3.03.2012 - 17:07) killer8080 написал(а):
WisesT
а зачем ты селекты в разные формы разнес? Форма то должна быть одна. В общем функцию адаптируешь под задачу так
Свернутый текст
function checkDate(select){
var myform = select.form,
prefix = select.name.split('_')[0],
year = myform[prefix+'_year'],
month = myform[prefix+'_month'],
day = myform[prefix+'_day'],
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
days = year.value % 4 == 0 && month.value == 2 ? 29 : dayInMonth[month.value],
selDay = day.value <= days ? day.value : days;

day.options.length = 0;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}

html форма будет такой структуры
Свернутый текст
<form>
...
<select name="from_day">
...
</select>

<select
name="from_month" onchange="checkDate(this)">
...
</select>


<select
name="from_year" onchange="checkDate(this)">
...
</select>
...
<select name="till_day">
...
</select>

<select
name="till_month" onchange="checkDate(this)">
...
</select>

<select
name="till_year" onchange="checkDate(this)">
...
</select>
</form>


Цитата (WisesT @ 3.03.2012 - 13:21)
//foreachтоже убрал. чекбокса то нет

а вот это напрасно, без него работать не будет. К чекбоксу он никакого отношения не имеет, верни как было.

Спустя 1 день, 20 часов, 7 минут, 13 секунд (5.03.2012 - 13:14) WisesT написал(а):
тоесть вот это
<script type="text/javascript">

function
checkDate(select){
var myform = select.form,
year = myform.year,
month = myform.month,
day = myform.day,
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var days = dayInMonth[month.value];
if(year.value %4 == 0 && month.value == 2)
days++;
day.options.length = 0;
;

var selDay = (day.value <= days) ? day.value : days;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}


function addOption (oListbox, text, value, isSelected, highLight){
var option = document.createElement("option");
option.appendChild(document.createTextNode(text));
option.setAttribute("value", value);
if(typeof isSelected == 'undefined') isSelected= false;
if(typeof highLight == 'undefined') highLight= false;

if(highLight) option.style.color= "#F00";
if(isSelected){
if(navigator.userAgent.toLowerCase().indexOf("msie")!= -1)
option.selected= true;
else
option.defaultSelected = true;
}

oListbox.appendChild(option);
}
</script>

сменить на вот это?
<script type="text/javascript">
function
checkDate(select){
var myform = select.form,
prefix = select.name.split('_')[0],
year = myform[prefix+'_year'],
month = myform[prefix+'_month'],
day = myform[prefix+'_day'],
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
days = year.value % 4 == 0 && month.value == 2 ? 29 : dayInMonth[month.value],
selDay = day.value <= days ? day.value : days;

day.options.length = 0;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}
</script>


АПД. А нет. похоже только первую функцию chekDate нужно подменить.

Спустя 24 минуты, 14 секунд (5.03.2012 - 13:39) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 12:14)
А нет. похоже только первую функцию chekDate нужно подменить.

Ну да, и html подправь.

Спустя 7 минут, 53 секунды (5.03.2012 - 13:47) WisesT написал(а):
такс, обработчик сделал вот таким
<?php
include("config.php");

// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

mysql_query($sql);
?>

Работает-неработате я не знаю, но при запуске страницы - не критует :)

Теперь нужно как-то вывести данные.
Запрос мы делали по некоторым полям, а как теперь вывести всю строчку и з бд, где одно из полей (или несколько) удовлетворяют запрос поиска?

Спустя 3 минуты, 24 секунды (5.03.2012 - 13:50) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 12:47)
Теперь нужно как-то вывести данные.
Запрос мы делали по некоторым полям, а как теперь вывести всю строчку и з бд, где одно из полей (или несколько) удовлетворяют запрос поиска?

Ну так как обычно mysql_fetch_assoc() в цикле while.

Спустя 2 минуты, 41 секунда (5.03.2012 - 13:53) WisesT написал(а):
для меня это "как обычно mysql_fetch_assoc() в цикле while" - китайская грамота)))
Точнее, я потихоньку читаю литературку, но еще далеко до уверенных знаний)

Щас, попробую что-то почитать по этим каракулям;)

Если не справлюсь - попрошу о помощи.

Спустя 10 минут, 44 секунды (5.03.2012 - 14:03) killer8080 написал(а):
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
echo '<pre>'.print_r($row, 1).'</pre>';
}

Спустя 2 минуты, 10 секунд (5.03.2012 - 14:06) WisesT написал(а):
а я не так делал.
<?php
include("config.php");

// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

mysql_query($sql);
$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus

while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];
}

mysql_free_result($result);
?>

Выводит данные из таблицы. Правда может неверно?

Спустя 5 минут, 39 секунд (5.03.2012 - 14:11) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 13:06)
Выводит данные из таблицы. Правда может неверно?

Верно, только зачем два раза запрос делать?
Цитата (WisesT @ 5.03.2012 - 13:06)
mysql_query($sql);
$result = mysql_query($sql);


Спустя 7 минут, 40 секунд (5.03.2012 - 14:19) WisesT написал(а):
Поправил.
Из формы поиска я наверное лучше уберу селекты вида оплаты, курьера и тд. Ибо если всунуть в селект курьера "курьер1", "курьер2" - то как искать по всем курьерам? Пусть ручками вписывают. Или есть варианты?

Спустя 15 минут, 31 секунда (5.03.2012 - 14:34) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 13:19)
Ибо если всунуть в селект курьера "курьер1", "курьер2" - то как искать по всем курьерам? Пусть ручками вписывают. Или есть варианты?

Ну так для этого мы и формируем динамически запрос sql
<select name="kurier">
<option
value="">Все</option>
<option
value="курьер1">курьер1</option>
<option
value="курьер2">курьер2</option>
</select>

Спустя 2 минуты, 28 секунд (5.03.2012 - 14:37) WisesT написал(а):
Цитата (killer8080 @ 3.03.2012 - 10:40)
Цитата (WisesT @ 3.03.2012 - 12:33)
В форме поиска указываем период (так как он будет обязательным), поле "Фирма оставляем пустым)
where firma=(пусто) AND oplata="beznal" AND prinyal=(Пусто) AND kurier="Ололоев" выдаст мне то что нужно?

нет, если ты в запросе укажешь firma='' выведет только те записи, где поле firm не заполнено, тебе же нужно просто вывести с любым значением этого поля? Значит это условие нужно просто не вписывать в запрос, что собственно мой пример и делает. Попробуй вывести содержимое $sql через echo, и посмотри как выглядит запрос. Потом можешь его скопировать, и пихнуть в PMA, увидишь результат.

а как же это?

Спустя 4 минуты, 44 секунды (5.03.2012 - 14:42) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 13:37)
а как же это?

а вот для этого мы смотрим, если переменная не пустая, то добавляем условие в запрос, если нет игнорируем
foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

вместо isset($_POST[$k]) && $_POST[$k] != '', можно было просто !empty($_POST[$k]), но я перестраховался на случай если нужно ввести "0".

Спустя 1 минута, 19 секунд (5.03.2012 - 14:43) WisesT написал(а):
Да, точно, я уже тоже вычитал)

А поле ввода фирмы регистронезависимо?

Спустя 1 минута, 53 секунды (5.03.2012 - 14:45) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 13:43)
А поле ввода фирмы регистронезависимо?

Поле ввода тут не причем, это в СУБД регистро-независимый поиск.

Спустя 11 минут, 18 секунд (5.03.2012 - 14:56) WisesT написал(а):
Добавил в селекты (кооме тех, что отвечают за дату)
<option value="">Все</option>

Прикручивал проверку на нажатие кнопки

Свернутый текст


//проверяю на нажатие кнопки поиска
$submit=$_POST['search_button']; //тут пробовал и submit
if(isset($submit))
{



// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);


$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus

while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];
}

mysql_free_result($result);
}
else
{
echo "Кнопка не нажата";
}
?>

теперь не отображает echo, но почему-то думает, что кнопка не нажата. Где ошибка?

Спустя 7 минут, 57 секунд (5.03.2012 - 15:04) killer8080 написал(а):
Ну во первых нет так
//проверяю на нажатие кнопки поиска
$submit=$_POST['search_button']; //тут пробовал и submit
if(isset($submit))
{

а так правильно будет
//проверяю на нажатие кнопки поиска

if(isset($_POST['search_button']))
{

во вторых попробуй вывести что передает пост
if(!empty($_POST)) 
die('<pre>'.print_r($_POST,1).'</pre>');

Спустя 5 минут, 49 секунд (5.03.2012 - 15:10) WisesT написал(а):
такое ощущение, что форма не реагирует на нажати кнопки.
на всякий случай выложу весь код
Свернутый текст
<?php
include("config.php");

//проверяю на нажатие кнопки поиска
if(isset($_POST['search_button']))
{



// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);


$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus

while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];
}

mysql_free_result($result);
}
else
{
echo "Кнопка не нажата";
}
?>


Свернутый текст


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<script
type="text/javascript">

function
checkDate(select){
var myform = select.form,
prefix = select.name.split('_')[0],
year = myform[prefix+'_year'],
month = myform[prefix+'_month'],
day = myform[prefix+'_day'],
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
days = year.value % 4 == 0 && month.value == 2 ? 29 : dayInMonth[month.value],
selDay = day.value <= days ? day.value : days;

day.options.length = 0;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}


function addOption (oListbox, text, value, isSelected, highLight){
var option = document.createElement("option");
option.appendChild(document.createTextNode(text));
option.setAttribute("value", value);
if(typeof isSelected == 'undefined') isSelected= false;
if(typeof highLight == 'undefined') highLight= false;

if(highLight) option.style.color= "#F00";
if(isSelected){
if(navigator.userAgent.toLowerCase().indexOf("msie")!= -1)
option.selected= true;
else
option.defaultSelected = true;
}

oListbox.appendChild(option);
}
</script>
<title>
Поиск</title>
</head>

<body>
<table
width="100%" border="1">
<tr>
<td
colspan="2">Шапка</td>
</tr>
<tr>
<td
colspan="2">
<form
id="form1" name="form1" method="post" action="">
<table
width="100%" border="0">
<tr>
<td>

<form>
<label
for="date">Дата: <br>с</label>
<select
name="from_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>
<option
value="4">4</option>
<option
value="5">5</option>
<option
value="6">6</option>
<option
value="7">7</option>
<option
value="8">8</option>
<option
value="9">9</option>
<option
value="10">10</option>
<option
value="11">11</option>
<option
value="12">12</option>
<option
value="13">13</option>
<option
value="14">14</option>
<option
value="15">15</option>
<option
value="16">16</option>
<option
value="17">17</option>
<option
value="18">18</option>
<option
value="19">19</option>
<option
value="20">20</option>
<option
value="21">21</option>
<option
value="22">22</option>
<option
value="23">23</option>
<option
value="24">24</option>
<option
value="25">25</option>
<option
value="26">26</option>
<option
value="27">27</option>
<option
value="28">28</option>
<option
value="29">29</option>
<option
value="30">30</option>
<option
value="31">31</option>
</select>


<select
name="from_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>
<option
value="4">4</option>
<option
value="5">5</option>
<option
value="6">6</option>
<option
value="7">7</option>
<option
value="8">8</option>
<option
value="9">9</option>
<option
value="10">10</option>
<option
value="11">11</option>
<option
value="12">12</option>
</select>


<select
name="from_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>
<option
value="2010">2010</option>
<option
value="2011">2011</option>
<option
value="2012">2012</option>
</select><br>


<label
for="date_end">по</label>
<select
name="till_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>
<option
value="4">4</option>
<option
value="5">5</option>
<option
value="6">6</option>
<option
value="7">7</option>
<option
value="8">8</option>
<option
value="9">9</option>
<option
value="10">10</option>
<option
value="11">11</option>
<option
value="12">12</option>
<option
value="13">13</option>
<option
value="14">14</option>
<option
value="15">15</option>
<option
value="16">16</option>
<option
value="17">17</option>
<option
value="18">18</option>
<option
value="19">19</option>
<option
value="20">20</option>
<option
value="21">21</option>
<option
value="22">22</option>
<option
value="23">23</option>
<option
value="24">24</option>
<option
value="25">25</option>
<option
value="26">26</option>
<option
value="27">27</option>
<option
value="28">28</option>
<option
value="29">29</option>
<option
value="30">30</option>
<option
value="31">31</option>
</select>


<select
name="till_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>
<option
value="4">4</option>
<option
value="5">5</option>
<option
value="6">6</option>
<option
value="7">7</option>
<option
value="8">8</option>
<option
value="9">9</option>
<option
value="10">10</option>
<option
value="11">11</option>
<option
value="12">12</option>
</select>


<select
name="till_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>
<option
value="2010">2010</option>
<option
value="2011">2011</option>
<option
value="2012">2012</option>
</select>
</form>
<td><label
for="firma">Фирма</label>
<input
type="text" name="firma" id="firma" /></td>
<td><label
for="oplata">Оплата</label>
<select
name="oplata" id="oplata">
<option
value="">Все</option>
<option
value="nal">Нал</option>
<option
value="beznal">Безнал</option>
</select></td>
<td><label
for="prinyal">Принял(а)</label>
<select
name="prinyal" id="prinyal">
<option
value="">Все</option>
<option
value="sotr_1">Сотрудник 1</option>
<option
value="sotr_2">Сотрудник 2</option>
</select></td>
<td><label
for="kurier">Курьер</label>
<select
name="kurier" id="kurier">
<option
value="">Все</option>
<option
value="kurier_1">Курьер 1</option>
<option
value="kurier_2">Курьер 2</option>
</select>
<input
type="submit" name="search_button" id="search_button" value="Искать" /></td>
</tr>
</table>
</form></td>
</tr>
<tr>
<td
width="205px">Меню</td>
<td
width="100%"><table width="100%" border="1">
<tr>
<td>
Номер</td>
<td>
Дата</td>
<td>
На когда</td>
<td>
Готовность</td>
<td>
Фирма</td>
<td>
Адресс</td>
<td>
Имя</td>
<td>
Телефон</td>
<td>
Вес</td>
<td>
Куда</td>
<td>
Оплата</td>
<td>
Примечания</td>
<td>
Принял</td>
<td>
Курьер</td>
<td>
Статус</td>
</tr>
<tr>
<td>
Результат_номер</td>
<td>
Результат_дата</td>
<td>
Результат_на-когда</td>
<td>
Результат_готовность</td>
<td>
Результат_фирма</td>
<td>
Результат_адресс</td>
<td>
Результат_имя</td>
<td>
Результат_телефон</td>
<td>
Результат_вес</td>
<td>
Результат_куда</td>
<td>
Результат_оплата</td>
<td>
Результат_примечания</td>
<td>
Результат_принял</td>
<td>
Результат_курьер</td>
<td>
Результат_статус</td>
</tr>
</table></td>
</tr>
<tr>
<td
colspan="2">Подвал</td>
</tr>
</table>
</body>
</html>


все находится в одном файле, под коварным именем 111.php

Спустя 13 минут, 14 секунд (5.03.2012 - 15:23) Visman написал(а):
Это что?
	 <form id="form1" name="form1" method="post" action="">
<table
width="100%" border="0">
<tr>
<td>

<form>

Спустя 3 минуты, 8 секунд (5.03.2012 - 15:26) WisesT написал(а):
сама форма поиска. в ней ипуты и селекты для поиска.

Форма в форме - беда?

Спустя 1 минута, 30 секунд (5.03.2012 - 15:28) killer8080 написал(а):
у тебя там </form> встречается несколько раз подряд, исправь html.

Спустя 1 минута, 59 секунд (5.03.2012 - 15:30) Visman написал(а):
WisesT, одну форму во второй ни кто не пишет!

Спустя 5 минут, 24 секунды (5.03.2012 - 15:35) WisesT написал(а):
Цитата (Visman @ 5.03.2012 - 12:30)
WisesT, одну форму во второй ни кто не пишет!

я пишу;)
Я уже исправился.

Спустя 2 минуты, 48 секунд (5.03.2012 - 15:38) Visman написал(а):
WisesT, перед

$result = mysql_query($sql);

вставь
exit($sql);


и покажи какой запрос сформирован при тех или иных данных из формы.

Спустя 3 минуты, 48 секунд (5.03.2012 - 15:42) WisesT написал(а):
вроде все работает, но неработает фильтр по дате.
Есть заказ от 01-01-2012 и заказ от 05-03-2012.
А фильтр не срабатывает.

Спустя 1 минута, 18 секунд (5.03.2012 - 15:43) killer8080 написал(а):
WisesT
Цитата (Visman @ 5.03.2012 - 14:38)
и покажи какой запрос сформирован при тех или иных данных из формы.


Спустя 1 минута, 19 секунд (5.03.2012 - 15:44) WisesT написал(а):
Цитата (Visman @ 5.03.2012 - 12:38)
WisesT, перед
<pre class="sh_sourceCode" rel="php">
<span class="sh_variable">$result</span> <span class="sh_symbol">=</span> <span class="sh_function">mysql_query</span><span class="sh_symbol">(</span><span class="sh_variable">$sql</span><span class="sh_symbol">);</span></pre>
вставь
<pre class="sh_sourceCode" rel="php"><span class="sh_function">exit</span><span class="sh_symbol">(</span><span class="sh_variable">$sql</span><span class="sh_symbol">);</span></pre>

и покажи какой запрос сформирован при тех или иных данных из формы.

тогда при нажатии на кнопку поиска выдает
SELECT * FROM `zakazy_test`

АПД. Если меняю только дату - выдает то что выше.
Если добавлю курьера - SELECT * FROM `zakazy_test` WHERE `kurier` = 'kurier_1'

а дату не подвязывает.

АПД 2. Нал, безнал тоже не подвязывает

Спустя 2 минуты, 38 секунд (5.03.2012 - 15:47) killer8080 написал(а):
так делал?
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";
}

у тебя же нет чекбокса period, вроде.

Спустя 1 минута, 32 секунды (5.03.2012 - 15:49) WisesT написал(а):
нету. какую строчку выпилить?

Спустя 45 секунд (5.03.2012 - 15:49) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 14:49)
нету. какую строчку выпилить?

ну дык $_POST['period'] же biggrin.gif

Спустя 2 минуты, 39 секунд (5.03.2012 - 15:52) WisesT написал(а):
да я уже прикрутил чекбокс)
Щас еще с нал/безнал копнусь.

Спустя 7 минут, 21 секунда (5.03.2012 - 15:59) WisesT написал(а):
что то с датой все же не так.
Есть заказ от 01-01-2012 и заказ от 05-03-2012.
В запрос даю только дату.
Период с 01 01 2007 по 01 01 2012 - надеясь найти заказ от 01-01-2012. не находит (SELECT * FROM `zakazy_test` WHERE `time` BETWEEN '2007-01-01' AND '2012-01-01')
а задаю перод 01-03-2012 по 31-03-2012 - находит заказ от 05-03-2012

АПД. А если, ища первый заказ, задать диапазон до 02 01 2012 - находит) чудеса)

Спустя 5 минут, 49 секунд (5.03.2012 - 16:05) killer8080 написал(а):
исправь
	$defs []= "`time` BETWEEN '".$start_date."' AND '".$end_date."'";

на
	$defs []= "DATE(`time`) BETWEEN '".$start_date."' AND '".$end_date."'";

Спустя 9 минут, 6 секунд (5.03.2012 - 16:14) WisesT написал(а):
иcправилось. отлично.

осталось еще чуток. Не реагирует на селект "оплата". Указываю в поле Фирма - "фирма" (есть на ее заказ. Оплата там "Нал"), выбираю селект "Нал"
вот его код


<select name="oplata" id="oplata">
<option
value="">Все</option>
<option
value="Нал">Нал</option>
<option
value="Безнал">Безнал</option>
</select>

а оно выдает

SELECT * FROM `zakazy_test` WHERE `firma` = 'фирма'

Обработчик
Свернутый текст

<?php
include("config.php");

//проверяю на нажатие кнопки поиска
if(isset($_POST['search_button']))
{



// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplana' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "DATE(`time`) BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

//exit($sql);

$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus

while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];
}

mysql_free_result($result);
}
else
{
echo "Кнопка не нажата";
}
?>


Спустя 3 минуты, 27 секунд (5.03.2012 - 16:18) WisesT написал(а):
вижу ошибку)

Спустя 2 минуты, 51 секунда (5.03.2012 - 16:20) WisesT написал(а):
ну и последнее, как результат вывести в определенном месте, а именно в таблицу
<td width="100%"><table width="100%" border="1">
<tr>
<td>
Номер</td>
<td>
Дата</td>
<td>
На когда</td>
<td>
Готовность</td>
<td>
Фирма</td>
<td>
Адресс</td>
<td>
Имя</td>
<td>
Телефон</td>
<td>
Вес</td>
<td>
Куда</td>
<td>
Оплата</td>
<td>
Примечания</td>
<td>
Принял</td>
<td>
Курьер</td>
<td>
Статус</td>
</tr>
<tr>
<td>
Результат_номер</td>
<td>
Результат_дата</td>
<td>
Результат_на-когда</td>
<td>
Результат_готовность</td>
<td>
Результат_фирма</td>
<td>
Результат_адресс</td>
<td>
Результат_имя</td>
<td>
Результат_телефон</td>
<td>
Результат_вес</td>
<td>
Результат_куда</td>
<td>
Результат_оплата</td>
<td>
Результат_примечания</td>
<td>
Результат_принял</td>
<td>
Результат_курьер</td>
<td>
Результат_статус</td>
</tr>
</table></td>


<td><?php echo $row["nomer"];?></td> не получается

Спустя 33 минуты, 58 секунд (5.03.2012 - 16:54) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 15:20)
ну и последнее, как результат вывести в определенном месте, а именно в таблицу

А в чем проблема? В цикле выборки из бд, заносишь все в переменную, а потом выводишь где надо.

Спустя 19 минут, 7 секунд (5.03.2012 - 17:14) WisesT написал(а):
Ну, можно каждой строке делать переменную. Тоесть
while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];

$nomer= $row["nomer"]; //и так с каждой
}

а потом выввести
<td><?php echo $nomerok;?></td>

но так выводится только 1 строчка. Нужно как-то это дело зациклить похоже?

Спустя 5 минут, 26 секунд (5.03.2012 - 17:19) killer8080 написал(а):
echo '<table width="100%" border="1">
<tr>
<td>Номер</td>
<td>Дата</td>
<td>На когда</td>
<td>Готовность</td>
<td>Фирма</td>
<td>Адресс</td>
<td>Имя</td>
<td>Телефон</td>
<td>Вес</td>
<td>Куда</td>
<td>Оплата</td>
<td>Примечания</td>
<td>Принял</td>
<td>Курьер</td>
<td>Статус</td>
</tr>'
;
while($row = mysql_fetch_assoc($result)){
echo '<tr><td>'.implode('</td><td>', $row).'</td><tr>';
}
echo '</table>';

только в запросе задай правильный порядок полей

Спустя 5 минут, 35 секунд (5.03.2012 - 17:25) WisesT написал(а):
эм..
вместо
<td width="100%"><table width="100%" border="1">
<tr>
<td>
Номер</td>
<td>
Дата</td>
<td>
На когда</td>
<td>
Готовность</td>
<td>
Фирма</td>
<td>
Адресс</td>
<td>
Имя</td>
<td>
Телефон</td>
<td>
Вес</td>
<td>
Куда</td>
<td>
Оплата</td>
<td>
Примечания</td>
<td>
Принял</td>
<td>
Курьер</td>
<td>
Статус</td>
</tr>
<tr>
<td><?php
echo $row["nomer"]?></td>
<td>
Результат_дата</td>
<td>
Результат_на-когда</td>
<td>
Результат_готовность</td>
<td>
Результат_фирма</td>
<td>
Результат_адресс</td>
<td>
Результат_имя</td>
<td>
Результат_телефон</td>
<td>
Результат_вес</td>
<td>
Результат_куда</td>
<td>
Результат_оплата</td>
<td>
Результат_примечания</td>
<td>
Результат_принял</td>
<td>
Результат_курьер</td>
<td>
Результат_статус</td>
</tr>
</table>

Поставил



<?php
echo '<td width="100%"><table width="100%" border="1">
<tr>
<td>Номер</td>
<td>Дата</td>
<td>На когда</td>
<td>Готовность</td>
<td>Фирма</td>
<td>Адресс</td>
<td>Имя</td>
<td>Телефон</td>
<td>Вес</td>
<td>Куда</td>
<td>Оплата</td>
<td>Примечания</td>
<td>Принял</td>
<td>Курьер</td>
<td>Статус</td>
</tr>'
;
while($row = mysql_fetch_assoc($result)){
echo '<tr><td>'.implode('</td><td>', $row).'</td><tr>';
}
echo '</table>';
?>


беду выдало.

Спустя 1 минута, 34 секунды (5.03.2012 - 17:26) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 16:25)
беду выдало.

а конкретней?

UPD и подправь, там в начале <td width="100%"> лишний

Спустя 3 минуты, 55 секунд (5.03.2012 - 17:30) WisesT написал(а):
при старте страницы
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in Z:\home\192.168.1.10\www\111.php on line 294

294: while($row = mysql_fetch_assoc($result)){

при нажатии на поиск


Warning: mysql_fetch_assoc(): 5 is not a valid MySQL result resource in Z:\home\192.168.1.10\www\111.php on line 294

выводится все это над таблицей

Спустя 1 минута, 34 секунды (5.03.2012 - 17:32) killer8080 написал(а):
WisesT
ну так эту конструкцию нужно было использовать, там где выводишь из бд, а ты куда её вставил?



Спустя 1 минута, 44 секунды killer8080 написал(а):
Вместо
while ($row = mysql_fetch_assoc($result)) {
echo $row["nomer"];
echo $row["time"];
echo $row["gotovnost"];
echo $row["firma"];
echo $row["adress"];
echo $row["imya"];
echo $row["tel"];
echo $row["ves"];
echo $row["kuda"];
echo $row["oplata"];
echo $row["primechaniya"];
echo $row["prinyal"];
echo $row["kurier"];
echo $row["na_kogda"];
echo $row["status"];
echo $row["prioritet"];
}

Спустя 2 минуты, 3 секунды (5.03.2012 - 17:34) WisesT написал(а):
Свернутый текст
<?php
include("config.php");

//проверяю на нажатие кнопки поиска
if(isset($_POST['search_button']))
{



// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplata' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT * FROM `zakazy_test`";

$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "DATE(`time`) BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

//exit($sql);

$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus



mysql_free_result($result);
}
else
{
echo "Кнопка не нажата";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<
script type="text/javascript">

function checkDate(select){
var myform = select.form,
prefix = select.name.split('_')[0],
year = myform[prefix+'_year'],
month = myform[prefix+'_month'],
day = myform[prefix+'_day'],
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
days = year.value % 4 == 0 && month.value == 2 ? 29 : dayInMonth[month.value],
selDay = day.value <= days ? day.value : days;

day.options.length = 0;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}


function addOption (oListbox, text, value, isSelected, highLight){
var option = document.createElement("option");
option.appendChild(document.createTextNode(text));
option.setAttribute("value", value);
if(typeof isSelected == 'undefined') isSelected= false;
if(typeof highLight == 'undefined') highLight= false;

if(highLight) option.style.color= "#F00";
if(isSelected){
if(navigator.userAgent.toLowerCase().indexOf("msie")!= -1)
option.selected= true;
else
option.defaultSelected = true;
}

oListbox.appendChild(option);
}
</script>
<
title>Поиск</title>
</
head>

<
body>
<
table width="100%" border="1">
<
tr>
<
td colspan="2">Шапка</td>
</
tr>
<
tr>
<
td colspan="2">
<
form id="form1" name="form1" method="post" action="">
<
table width="100%" border="0">
<
tr>
<
td>

<
input type="checkbox" name="period" value="1">Период
<label for="date">Дата: <br>с</label>
<
select name="from_day">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>


<
select name="from_month" onchange="checkDate(this)">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
</
select>


<
select name="from_year" onchange="checkDate(this)">
<
option value="2007">2007</option>
<
option value="2008">2008</option>
<
option value="2009">2009</option>
<
option value="2010">2010</option>
<
option value="2011">2011</option>
<
option value="2012">2012</option>
</
select><br>


<
label for="date_end">по</label>
<
select name="till_day">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>


<
select name="till_month" onchange="checkDate(this)">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
</
select>


<
select name="till_year" onchange="checkDate(this)">
<
option value="2007">2007</option>
<
option value="2008">2008</option>
<
option value="2009">2009</option>
<
option value="2010">2010</option>
<
option value="2011">2011</option>
<
option value="2012">2012</option>
</
select>

<
td><label for="firma">Фирма</label>
<
input type="text" name="firma" id="firma" /></td>
<
td><label for="oplata">Оплата</label>
<
select name="oplata" id="oplata">
<
option value="">Все</option>
<
option value="Нал">Нал</option>
<
option value="Безнал">Безнал</option>
</
select></td>
<
td><label for="prinyal">Принял(а)</label>
<
select name="prinyal" id="prinyal">
<
option value="">Все</option>
<
option value="sotr_1">Сотрудник 1</option>
<
option value="sotr_2">Сотрудник 2</option>
</
select></td>
<
td><label for="kurier">Курьер</label>
<
select name="kurier" id="kurier">
<
option value="">Все</option>
<
option value="kurier_1">Курьер 1</option>
<
option value="kurier_2">Курьер 2</option>
</
select>
<
input type="submit" name="search_button" id="search_button" value="Искать" /></td>
</
tr>
</
table>
</
form></td>
</
tr>
<
tr>
<
td width="205px">Меню</td>
<?php
echo '<td width="100%"><table width="100%" border="1">
<tr>
<td>Номер</td>
<td>Дата</td>
<td>На когда</td>
<td>Готовность</td>
<td>Фирма</td>
<td>Адресс</td>
<td>Имя</td>
<td>Телефон</td>
<td>Вес</td>
<td>Куда</td>
<td>Оплата</td>
<td>Примечания</td>
<td>Принял</td>
<td>Курьер</td>
<td>Статус</td>
</tr>'
;
while($row = mysql_fetch_assoc($result)){
echo '<tr><td>'.implode('</td><td>', $row).'</td><tr>';
}
echo '</table>';
?></td>
</
tr>
<
tr>
<
td colspan="2">Подвал</td>
</
tr>
</
table>
</
body>
</
html>

Спустя 10 минут, 32 секунды (5.03.2012 - 17:44) killer8080 написал(а):
WisesT
ну во первых ошибка в логике, вывод контента начинается раньше чем положено. Вместо echo, нужно текст хранить в переменной, а потом выводить его в нужном месте html шаблона.
Вот так делать нельзя!
Цитата (WisesT @ 5.03.2012 - 16:34)
else
{
echo "Кнопка не нажата";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Во вторых, я же сказал в явном виде перечислить поля в запросе, не SELECT *, а вместо * имна полей в нужном порядке через запятую.

Спустя 10 минут, 29 секунд (5.03.2012 - 17:55) WisesT написал(а):
Цитата (killer8080 @ 5.03.2012 - 14:44)
WisesT
ну во первых ошибка в логике, вывод контента начинается раньше чем положено. Вместо echo, нужно текст хранить в переменной, а потом выводить его в нужном месте html шаблона.
Вот так делать нельзя!
Цитата (WisesT @ 5.03.2012 - 16:34)
else
{
echo "Кнопка не нажата";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Во вторых, я же сказал в явном виде перечислить поля в запросе, не SELECT *, а вместо * имна полей в нужном порядке через запятую.

по первому пунку ничего не понял.

второе сделал.
$sql = "SELECT 
nomer, time, na_kogda, gotovnost, firma,
adress, imya, tel, ves, kuda, oplata, primechaniya, prinyal, kurier, status
FROM `zakazy_test`"
;

Спустя 11 минут, 32 секунды (5.03.2012 - 18:06) WisesT написал(а):
вот так наладилось.
Если нужно - скажите где можно сделать лучше)

Свернутый текст


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<
script type="text/javascript">

function checkDate(select){
var myform = select.form,
prefix = select.name.split('_')[0],
year = myform[prefix+'_year'],
month = myform[prefix+'_month'],
day = myform[prefix+'_day'],
dayInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
days = year.value % 4 == 0 && month.value == 2 ? 29 : dayInMonth[month.value],
selDay = day.value <= days ? day.value : days;

day.options.length = 0;
for(var i = 1; i <= days; i++) {
var weekDay = new Date(year.value, (month.value - 1), i).getDay();
addOption(day, i, i, (selDay == i), (weekDay == 0 || weekDay == 6));
}
}


function addOption (oListbox, text, value, isSelected, highLight){
var option = document.createElement("option");
option.appendChild(document.createTextNode(text));
option.setAttribute("value", value);
if(typeof isSelected == 'undefined') isSelected= false;
if(typeof highLight == 'undefined') highLight= false;

if(highLight) option.style.color= "#F00";
if(isSelected){
if(navigator.userAgent.toLowerCase().indexOf("msie")!= -1)
option.selected= true;
else
option.defaultSelected = true;
}

oListbox.appendChild(option);
}
</script>
<
title>Поиск</title>
</
head>

<
body>
<
table width="100%" border="1">
<
tr>
<
td colspan="2">Шапка</td>
</
tr>
<
tr>
<
td colspan="2">
<
form id="form1" name="form1" method="post" action="">
<
table width="100%" border="0">
<
tr>
<
td>

<
input type="checkbox" name="period" value="1">Период
<label for="date">Дата: <br>с</label>
<
select name="from_day">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>


<
select name="from_month" onchange="checkDate(this)">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
</
select>


<
select name="from_year" onchange="checkDate(this)">
<
option value="2007">2007</option>
<
option value="2008">2008</option>
<
option value="2009">2009</option>
<
option value="2010">2010</option>
<
option value="2011">2011</option>
<
option value="2012">2012</option>
</
select><br>


<
label for="date_end">по</label>
<
select name="till_day">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>


<
select name="till_month" onchange="checkDate(this)">
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
</
select>


<
select name="till_year" onchange="checkDate(this)">
<
option value="2007">2007</option>
<
option value="2008">2008</option>
<
option value="2009">2009</option>
<
option value="2010">2010</option>
<
option value="2011">2011</option>
<
option value="2012">2012</option>
</
select>

<
td><label for="firma">Фирма</label>
<
input type="text" name="firma" id="firma" /></td>
<
td><label for="oplata">Оплата</label>
<
select name="oplata" id="oplata">
<
option value="">Все</option>
<
option value="Нал">Нал</option>
<
option value="Безнал">Безнал</option>
</
select></td>
<
td><label for="prinyal">Принял(а)</label>
<
select name="prinyal" id="prinyal">
<
option value="">Все</option>
<
option value="sotr_1">Сотрудник 1</option>
<
option value="sotr_2">Сотрудник 2</option>
</
select></td>
<
td><label for="kurier">Курьер</label>
<
select name="kurier" id="kurier">
<
option value="">Все</option>
<
option value="kurier_1">Курьер 1</option>
<
option value="kurier_2">Курьер 2</option>
</
select>
<
input type="submit" name="search_button" id="search_button" value="Искать" /></td>
</
tr>
</
table>
</
form></td>
</
tr>
<
tr>
<
td width="205px">Меню</td>
<
td><?php
include("config.php");

//проверяю на нажатие кнопки поиска
if(isset($_POST['search_button']))
{



// массив опций поиска
// ключ соответсвует ключу в массиве $_POST
// значение - имя поля в БД

$check = array(
'firma' => 'firma',
'oplata' => 'oplata',
'prinyal' => 'prinyal',
'kurier' => 'kurier',
'status' => 'status'
);

$sql = "SELECT
nomer, time, na_kogda, gotovnost, firma,
adress, imya, tel, ves, kuda, oplata, primechaniya, prinyal, kurier, status
FROM `zakazy_test`"
;


$defs = array();
if(isset($_POST['period'])){ // period - имя чекбокса
$start_date = sprintf('%d-%02d-%02d', (int)$_POST['from_year'], (int)$_POST['from_month'], (int)$_POST['from_day']);
$end_date = sprintf('%d-%02d-%02d', (int)$_POST['till_year'], (int)$_POST['till_month'], (int)$_POST['till_day']);
$defs []= "DATE(`time`) BETWEEN '".$start_date."' AND '".$end_date."'";
}

foreach($check as $k => $v)
if(isset($_POST[$k]) && $_POST[$k] != '')
$defs []= "`".$v."` = '".mysql_real_escape_string($_POST[$k])."'";

if($defs)
$sql .= " WHERE ".implode(' AND ', $defs);

//exit($sql);

$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus

echo '<table width="100%" border="1">
<tr>
<td>Номер</td>
<td>Дата</td>
<td>На когда</td>
<td>Готовность</td>
<td>Фирма</td>
<td>Адресс</td>
<td>Имя</td>
<td>Телефон</td>
<td>Вес</td>
<td>Куда</td>
<td>Оплата</td>
<td>Примечания</td>
<td>Принял</td>
<td>Курьер</td>
<td>Статус</td>
</tr>'
;
while($row = mysql_fetch_assoc($result)){
echo '<tr><td>'.implode('</td><td>', $row).'</td><tr>';
}
echo '</table>';

mysql_free_result($result);
}
else
{
echo "Кнопка не нажата";
}
?></td></td>
</
tr>
<
tr>
<
td colspan="2">Подвал</td>
</
tr>
</
table>
</
body>
</
html>

Спустя 3 часа, 44 минуты, 31 секунда (5.03.2012 - 21:51) killer8080 написал(а):
Цитата (WisesT @ 5.03.2012 - 16:55)
по первому пунку ничего не понял.

я имел ввиду разделение логики и представления. Почитай про MVC, например на ирбисе. У тебя все в одной куче, но в принципе для первого раза сойдет.
Замечания по коду:
1 это
$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

можно записать проще
$result = mysql_query($sql) or die("Could not successfully run query ($sql) from DB: " .  mysql_error());

хотя вывод ошибок допустим только при отладке, в продакшине такого быть не должно. Ошибки должны писаться в лог, но не в коем случае не отображаться на странице. Они раскрывают структуру файловой системы и таблиц БД сервера, что угрожает безопасности.


2 опять же
if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

можно записать короче
if (mysql_num_rows($result) == 0) 
exit("No rows found, nothing to print so am exiting");


3 у тебя все селекты с датами статичны, ограничены текущим годом. Что будешь делать, когда наступит следующий год? Вручную править код? Такие вещи делаются динамически.
НУ и напоследок, если ты не заметил, в моем коде уикенды подсвечиваются красным цветом, так наглядней. Логично было бы и в документе это организовать.

Спустя 12 часов, 23 минуты, 23 секунды (6.03.2012 - 10:14) WisesT написал(а):
Цитата (killer8080 @ 5.03.2012 - 18:51)
Цитата (WisesT @ 5.03.2012 - 16:55)
по первому пунку ничего не понял.


3 у тебя все селекты с датами статичны, ограничены текущим годом. Что будешь делать, когда наступит следующий год? Вручную править код? Такие вещи делаются динамически.

Тоесть то, что написано сейчас... Если добавить 2013 год в список годов - не даст результата?

Спустя 1 час, 26 минут, 11 секунд (6.03.2012 - 11:40) killer8080 написал(а):
Цитата (WisesT @ 6.03.2012 - 09:14)
Если добавить 2013 год в список годов - не даст результата?

и так будешь делать каждый раз? Не проще скрипт написать который будет это делать автоматом? smile.gif

Спустя 3 минуты, 21 секунда (6.03.2012 - 11:44) WisesT написал(а):
я настолько боюсь, что мне проще раз в год дописать user posted image
Подучусь и допишу;)

А тебе - огромное спасибо за помощь;)

Спустя 1 час, 39 минут, 30 секунд (6.03.2012 - 13:23) killer8080 написал(а):
Цитата (WisesT @ 6.03.2012 - 10:44)
я настолько боюсь, что мне проще раз в год дописать

чего там боятся, решение в одну строчку user posted image
<select name="year">
<?php
foreach(range(1997, date('Y')) as $year)
echo '<option value="'.$year.'">'.$year.'</option>'."\r\n";
?>
</select>

аналогично и остальные селекты
<select name="month">
<?php
foreach(range(1, 12) as $month)
echo '<option value="'.$month.'">'.$month.'</option>'."\r\n";
?>
</select>
<
select name="day">
<?php
foreach(range(1, 31) as $day)
echo '<option value="'.$day.'">'.$day.'</option>'."\r\n";
?>
</select>

Спустя 37 минут, 10 секунд (6.03.2012 - 14:00) WisesT написал(а):
что б не напартачить.

вместо
<select name="from_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="31">31</option>
</select>


<select
name="from_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="12">12</option>
</select>


<select
name="from_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>

<option
value="2012">2012</option>
</select><br>


<label
for="date_end">по</label>
<select
name="till_day">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="31">31</option>
</select>


<select
name="till_month" onchange="checkDate(this)">
<option
value="1">1</option>
<option
value="2">2</option>
<option
value="3">3</option>

<option
value="12">12</option>
</select>


<select
name="till_year" onchange="checkDate(this)">
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>

<option
value="2012">2012</option>
</select>


сделать
<select name="from_day">
<?php

foreach(range(1, 31) as $day)
echo '<option value="'.$day.'">'.$day.'</option>'."\r\n";
?></select>


<select
name="from_month" onchange="checkDate(this)">
<?php

foreach(range(1, 12) as $month)
echo '<option value="'.$month.'">'.$month.'</option>'."\r\n";
?>
</select>


<select
name="from_year" onchange="checkDate(this)">
<?php

foreach(range(1997, date('Y')) as $year)
echo '<option value="'.$year.'">'.$year.'</option>'."\r\n";
?>
</select><br>


<label
for="date_end">по</label>
<select
name="till_day">
<?php

foreach(range(1, 31) as $day)
echo '<option value="'.$day.'">'.$day.'</option>'."\r\n";
?>
</select>


<select
name="till_month" onchange="checkDate(this)">
<?php

foreach(range(1, 12) as $month)
echo '<option value="'.$month.'">'.$month.'</option>'."\r\n";
?>
</select>


<select
name="till_year" onchange="checkDate(this)">
<?php

foreach(range(1997, date('Y')) as $year)
echo '<option value="'.$year.'">'.$year.'</option>'."\r\n";
?>
</select>

?

Спустя 3 минуты, 35 секунд (6.03.2012 - 14:04) killer8080 написал(а):
WisesT
да, только вместо 1997 подставь год с которого нужно выводить.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.