|
|
|
|
|
для: cheops
(21.07.2005 в 12:36)
| | Ура всё получилось, ошибка была вовсе не в запросе а в синтаксисе radiogroup!
Так что больше вас не буду мучить:)))
По крайней мере по этой теме! Спасибо вам огромное! | |
|
|
|
|
|
|
|
для: lilu
(21.07.2005 в 11:06)
| | Лучше не пытаться охватить всю программу усилием мысли, на это уходит масса времени, а в сложной программе всегда ошибётесь - при возникновении проблем сразу выводите SQL-запрос в окно браузера
Что в нём?
Если видна ошибка, но не понятно окуда взялся лишний AND, на время отладки их можно переименовать AND1, AND2 и т.д. Если ничего не получается - выложите скрипт в том виде какой он сейчас - я помогу вам его отладить. | |
|
|
|
|
|
|
|
для: cheops
(20.07.2005 в 19:42)
| | Правильно, то правильно а запрос то не работает! :(
вот смотрите после вашей логики где обрабатывались только radiogroup и checkbox
последняя строка запроса выглядела вот так
<?php
if(!empty($sell_buy_remont)) $query .= " AND ".$sell_buy_remont;
?>
|
после чего она обрабатывалась функ-ей $rez=mysql_query($query); и всё было хорошо
после внедрения куска проги с датами а я сделала это так
<?php
if(!empty($sell_buy_remont)) $query .= " AND ".$sell_buy_remont; //это последнее значение перем-ой $query, потом я обрабатываю элемент с датами
switch($_POST['daty'])
{
case 1:
$tmp = " AND data ='2005-07-05'";
break;
case 2:
$tmp = " AND data > NOW() - INTERVAL 14 DAY ";
break;
case 3:
$tmp = " AND data > NOW() - INTERVAL 30 DAY";
break;
}
//и теперь "наращиваю" переменную $query, чтобы учлись эти условия
$query .= " AND ".$tmp;
//и на выполнение
$rez=mysql_query($query);
?>
|
подскажите cheops у меня опять что-то с логикой или так просто нельзя "наращивать" переменнную запроса!
Результат работы - чистый лист :((( | |
|
|
|
|
|
|
|
для: lilu
(20.07.2005 в 17:59)
| | Ага, всё правильно, только вместо $d1 в лучше использовать встроенную функцию MySQL для текущей даты - NOW(). Подробнее о ней можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=319. А сам код можно переписать следующим образом
<?php
switch($_POST['daty'])
{
case 1:
$tmp = " AND data ='2005-07-05'";
break;
case 2:
$tmp = " AND data > NOW() - INTERVAL 14 DAY ";
break;
// case 3:
// $tmp = " AND data";
// break;
}
?>
|
Точно также при занесении даты в таблицу легче использовать эту функцию - она сама подстраивается под формат поля и выполняется быстрее, чем аналоги на PHP
INSERT INTO tbl (NULL, $name, $key, NOW())
|
PS Для выделения кода на форуме можно испльзовать теги [ code] и [ /code] (только без пробелов) - если код содержит тэги PHP <?php и ?> - он автоматически раскрасится, если не имеет - будет просто серый код в рамке. При ответе на сообщения посмотрите в правый верхний угол - там имеются ссылки, чтобы каждый раз не набирать тэги, кроме этого имеются ссылки для выделения жирным [ b] и [ /b], курсивым [ i] и [ /i] и для ссылок [ url] и [ /url]. Если у вас браузер Internet Explorer вы можете просто выделить текст и щёлкнуть на тэги - выделенный фрагмент будет автоматически заключён в выбранный тэг. | |
|
|
|
|
|
|
|
для: cheops
(20.07.2005 в 12:31)
| | Уважаемый cheops я просто поражаюсь вашему терпению и благодарна за такое описание, лучше чем в какой либо книжке! И всё-таки я сама бы до такого не додумалась бы:)))
И вот я решила закрепить понятое и добавила ещё одну радиогруппу(на ещё один checkbox я не решилась:)) Вот как я описала её
<br>
<input type="radio" name="daty" value="24hour" id="24hour">
<label for="24hour" accesskey="p"><u>н</u>овые (24 часа)</label>
<br>
<input type="radio" name="daty" value="2weeks" id="2weeks">
<label for="2weeks" accesskey="w"><u>за</u> две недели:</label>
<br>
а кусок к запросу и сам запрос ваш дополнила вот так
это последнее значение $query:
if(!empty($sell_buy_remont)) $query .= " AND ".$sell_buy_remont;
потом я след. циклом при выборе одного из двух значений радиогруппы присвоила переменной tmp продолжение условия запроса!
switch($_POST['daty'])
{
case 1:
$tmp = " AND data ='2005-07-05'";
break;
case 2:
$tmp = " AND data > $d1 - INTERVAL 14 DAY ";
break;
// case 3:
// $tmp = " AND data";
// break;
}
data -это имя поля в таблице с датами,а $d1=date("Y-m-d") - текущая дата
и теперь я просто добавляю к раннему значению $query новое, кот. и должно в себе учесть все условия радиогрупп и checkbox!
if(!empty($daty)) $query .= " AND ".$tmp;
Скажите можно ли так и правильны ли у меня с датами махинации!
Про даты это вообще отдельная песня такая путаница с выводом с запросами и занесением в таблицу, т.е. всё-равно я бы спросила но лучше сразу пока вы помните код программы!
P.S. Скажите что надо указывать при размещении сообщений чтобы код был цветной так просто нагляднее! | |
|
|
|
|
|
|
|
для: lilu
(20.07.2005 в 10:59)
| | Пользователь может не отметить ни одно из флажков, это его право. Поэтому нужно обработать ситуацию когда флажков нет и когда отмечен хотя бы один флажок.
Всё что относится к флажкам мы помещаем в переменную $sell_buy_remont, которая инициируется открывающейся скобкой
<?php
$sell_buy_remont = "(";
?>
|
Если все переменные, ответственные за флажки $buy, $sell, $remont окажутся пустыми и $sell_buy_remont не изменяется, мы обнуляем переменную $sell_buy_remont
<?php
if($sell_buy_remont == "(") $sell_buy_remont = "";
?>
|
иначе, если хотя бы один из флажков $buy, $sell, $remont не был пуст, мы закрываем ранее открытую круглую скобку
<?php
else $sell_buy_remont .= ")";
?>
|
Здесь везде используется оператор .= позволяющий добавить к строке правый операнд.
Т.е. переменная $sell_buy_remont, которая является частью запроса либо пустая, либо принимает вид в зависимости от числа выбранных флажков
(deystvie='buy' OR deystvie='sell' OR deystvie='remont')
|
Чтобы сформировать такую строку, нам нужно просто выполнить операции
<?php
$sell_buy_remont .= " OR ".$buy;
$sell_buy_remont .= " OR ".$sell;
$sell_buy_remont .= " OR ".$remont;
?>
|
За одним исключением, первая строка, которой может быть не обязательно buy (этот флажок может быть не отмечен) не должна иметь оператора OR. Поэтому нам нужно следить за тем первое это присвоение или нет. Для этого предназначен булевая переменная $is_conditon, которая принимает значение false, если это первый флаг и true для всех последующих флажков.
Т.е. строка вида
<?php
if($is_conditon) $sell_buy_remont .= " OR ".$remont;
?>
|
выполняется, если уже один флажок имеется и нужно разделить их OR, а блок
<?php
else
{
$is_conditon = true;
$sell_buy_remont .= $remont;
}
?>
|
выполняется в том случае, если это первый флажок в скобках. При этом мы изменяем значение $is_conditon на true, чтобы все последующие запросы разделялись OR.
WHERE-условие в запросе имеет вид
WHERE tip='' AND (deystvie='buy' OR deystvie='sell' OR deystvie='remont')
|
В первом случае мы используем AND так как результат должен соответствовать условию tip='' И одному из флажков, если они есть, а внутри скобок используется оператор OR, так мы должны извлечь запросы удовлетворяющие КАК deystvie='buy', ТАК И deystvie='sell' А ТАК ЖЕ deystvie='remont'. Другими словами любой запрос, удовлетворяющих хотя бы одному условию в скобках. | |
|
|
|
|
|
|
|
для: cheops
(19.07.2005 в 18:16)
| | Ура, спасибочки, это то что нужно! :)))
Только вот конечно логика ваша :), я в смысле что мне пока как новичку не совсем всё понятно, лучше я сразу спрошу а то потом если что-то надо будет поменять, то опять придёться вас тревожить
если можно вот этот момент саму логику кратенько объясните мне, особенно значение новых переменных и циклы очень круто как-то! :)
$query=("SELECT * FROM 'telephonia' WHERE tip='$_POST[rgr_tovar]'");
$sell_buy_remont = "(";
$is_conditon = false;
if(!empty($buy))
{
if($is_conditon) $sell_buy_remont .= " OR ".$buy;
else
{
$is_conditon = true;
$sell_buy_remont .= $buy;
}
}
if(!empty($sell))
{
if($is_conditon) $sell_buy_remont .= " OR ".$sell;
else
{
$is_conditon = true;
$sell_buy_remont .= $sell;
}
}
if(!empty($remont))
{
if($is_conditon) $sell_buy_remont .= " OR ".$remont;
else
{
$is_conditon = true;
$sell_buy_remont .= $remont;
}
}
if($sell_buy_remont == "(") $sell_buy_remont = "";
else $sell_buy_remont .= ")";
if(!empty($sell_buy_remont)) $query .= " AND ".$sell_buy_remont;
// echo $query;
$rez=mysql_query($query);
|
| |
|
|
|
|
 3.6 Кб |
|
|
для: lilu
(19.07.2005 в 15:07)
| | Посмотрите скрипт в аттаче - я изменил немного логику, выловив пару своих же ошибок :))) Теперь вроде как надо работает, но всё равно луше тщательно всё протестировать ещё раз.
>и ещё про where 1=1; я как раз его опустила в запросе вы наверное заметили,
>может поэтому And не срабатывает!
Здесь всё нормально, так как условие WHERE присутствует в каждом запросе. | |
|
|
|
|
|
|
|
для: cheops
(19.07.2005 в 14:01)
| | да конечно вот структура
Поле Тип Сравнение Атрибуты Ноль По умолчанию Дополнительно Действие
id int(3) auto_increment
tip varchar(10)
deystvie varchar(10)
text varchar(250)
kontact varchar(30)
data date 0000-00-00
PRIMARY id
INDEX tip deystvie data
а вот несколько строк
id tip deystvie text kontact data
1 mobila sell продаю Motorolla 25-96-13 2005-07-15
2 mobila buy куплю Siemens me45! Рассмотрю все варианты! 44-65-90 или kim@mail.ru 2005-07-05
3 hofice buy куплю радиотелефон Panasonic для дома 8-029-6326452 2005-06-08
4 hofice sell продам для офиса радиоустановку 8-029-6512596 2005-07-04
5 acsess sell продаю аксессуары для моб. телефонов 8-029-6548321 2005-07-15
6 mobila remont ремонтирую и перепрошиаю сот. телефоны 8-029-7445012 2005-07-02
и ещё про where 1=1; я как раз его опустила в запросе вы наверное заметили, может поэтому And не срабатывает! | |
|
|
|
|
|
|
|
для: lilu
(19.07.2005 в 11:21)
| | Не могли бы вы приложить структуру таблицы telephonia и пару строк из неё - чтобы можно было потестировать на локальной машине?
>тут всё вроде ясно кроме where 1=1 в запросе, объясните
>этот момент мне (на будущее)
Он ничего не делает кроме того, что позволяет писать AND во всех проверках ведь если бы не было этого условия, могла возникнуть ситуация когда сформиролся бы ошибочный запрос вида WHERE AND, что неверно и требует либо привличения флагов и отслеживания - является ли условие первым, либо добавления условия 1=1. | |
|
|
|
|