|
|
|
| radio group очень удобно, но есть минус, можно выбрать только один из предложенных вариантов, а вот есть ли checkbox group, чтобы можно было выбрать несколько !
Например, есть список фруктов radio group позволит сделать выборку только по одному из них, а если надо сразу по нескольким, подскажите на примере! Спасибо! | |
|
|
|
|
|
|
|
для: lilu
(14.07.2005 в 21:48)
| | Вопрос размещён в форуме по MySQL случайно или нет? Для этого, можно использовать флажки, как в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=427
<form action=handler.php method=post>
<input type='checkbox' name='type[]' value='1'>Первый флажок<br>
<input type='checkbox' name='type[]' value='2'>Второй флажок<br>
<input type='checkbox' name='type[]' value='3'>Третий флажок<br>
<input type='checkbox' name='type[]' value='4'>Четвёртый флажок<br>
<input type='checkbox' name='type[]' value='5'>Пятый флажок<br>
<input type='checkbox' name='type[]' value='6'>Шестой флажок<br>
<input type='checkbox' name='type[]' value='7'>Седьмой флажок<br>
<input type=submit>
</form>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.07.2005 в 22:01)
| | Вопрос в разделе по Mysql размещён не случайно, т.к.синтаксис checkbox мне известен! Запрос не работает!
$rez=mysql_query("SELECT * FROM 'telephonia' WHERE tip='$_POST[rgr_tovar]' AND deystvie='$_POST[rgr_deystvie]'");
rgr_tovar -это переменная radio group, а rgr_deystvie - checkbox!
Синтаксис всех radio такой
<br>
<input type="radio" name="rgr_tovar" value="acsess" >
<label for="acsess">сотовые:</label>
<br>
А Синтаксис всех checkbox такой
<br>
<input type="checkbox " name="rgr_deystvie" value="acsess" >
<label for="acsess">ремонт:</label>
<br>
Так что же неправильно!!!
Самое интересно если везде указать radio, то работает, но по принципу radio group конечно, а не checkbox, а неправильность работы запроса в том. что срабатывает последний нажатый флажок! и по нему же осуществляется выборка вот как | |
|
|
|
|
|
|
|
для: lilu
(18.07.2005 в 12:54)
| | У вас указан только один флажок - на самом деле их много? Используете ли в качестве имени массивы, как двумя постами выше? | |
|
|
|
|
|
|
|
для: cheops
(18.07.2005 в 13:05)
| | Не совсем понятно как с массивом быть в запросе, я с этим впервые сталкиваюсь:
Допустим это все мои флажки,в качестве имени массив (я так понимаю в массиве значения buy, sell, arenda)!
<input type='checkbox' name='rgr_deystvie[]' value='buy'>покупка<br>
<input type='checkbox' name='rgr_deystvie[]' value='sell'>продажа<br>
<input type='checkbox' name='rgr_deystvie[]' value='arenda'>аренда<br>
Как мне в запросе указать, что при выборе двух и более флажков выводились соот-ие данные: $rez=mysql_query("SELECT * FROM 'telephonia' WHERE deystvie='$_POST[rgr_deystvie[]]'");
вот мой запрос но он не работает! | |
|
|
|
|
|
|
|
для: lilu
(18.07.2005 в 16:26)
| | Следует проверить содержимое массива $_POST['rgr_deystvie'], куда помещается информация о флажках... вы даже можете вывести дамп этого массива
<?php
print_r($_POST['rgr_deystvie']);
?>
|
После чего следует формировать элемент SQL-запроса
<?php
foreach($_POST['rgr_deystvie'] as $val)
{
if($val == 'buy') $buy = "deystvie='buy'";
else $buy = "";
if($val == 'sell') $sell = "deystvie='sell'";
else $sell = "";
if($val == 'arenda') $arenda = "deystvie='arenda'";
else $arenda = "";
}
// Формируем SQL-запрос
$query = "SELECT * FROM 'telephonia' WHERE 1 = 1 ";
if(!empty($buy)) $query .= " AND ".$buy;
if(!empty($sell)) $query .= " AND ".$sell;
if(!empty($arenda)) $query .= " AND ".$arenda;
?>
|
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=427 | |
|
|
|
|
|
|
|
для: cheops
(18.07.2005 в 19:38)
| | спасибо!
тут всё вроде ясно кроме where 1=1 в запросе, объясните этот момент мне (на будущее)
как вы предложили я добавила проверку дампа массива, нажатые пользователем флажки указаны верно! Но запрос работает отвратно (даже не пойму по каким принципам он выбирает) т.к. у меня выборка не только длжна быть по флажкам но и по радиогруппе, я ваш код запроса я соединила со своим вот так !
print_r($_POST['rgr_deystvie']); //выводим дамп массива checkbox
//формируем элемент sql запроса
foreach($_POST['rgr_deystvie'] as $val)
{
if($val == 'buy') $buy = "deystvie='buy'";
else $buy = "";
if($val == 'sell') $sell = "deystvie='sell'";
else $sell = "";
if($val == 'remont') $remont = "deystvie='remont'";
else $remont = "";
}
//формируем sql запрос
$query=("SELECT * FROM 'telephonia' WHERE tip='$_POST[rgr_tovar]'");
if(!empty($buy)) $query .= " AND ".$buy;
if(!empty($sell)) $query .= " AND ".$sell;
if(!empty($remont)) $query .= " AND ".$remont;
$rez=mysql_query($query);
|
Может ошибка не в этом куске программы я прикрепила файл со всей прогой! | |
|
|
|
|
|
|
|
для: lilu
(19.07.2005 в 11:21)
| | Не могли бы вы приложить структуру таблицы telephonia и пару строк из неё - чтобы можно было потестировать на локальной машине?
>тут всё вроде ясно кроме where 1=1 в запросе, объясните
>этот момент мне (на будущее)
Он ничего не делает кроме того, что позволяет писать AND во всех проверках ведь если бы не было этого условия, могла возникнуть ситуация когда сформиролся бы ошибочный запрос вида WHERE AND, что неверно и требует либо привличения флагов и отслеживания - является ли условие первым, либо добавления условия 1=1. | |
|
|
|
|
|
|
|
для: 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 не срабатывает! | |
|
|
|
|
 3.6 Кб |
|
|
для: lilu
(19.07.2005 в 15:07)
| | Посмотрите скрипт в аттаче - я изменил немного логику, выловив пару своих же ошибок :))) Теперь вроде как надо работает, но всё равно луше тщательно всё протестировать ещё раз.
>и ещё про where 1=1; я как раз его опустила в запросе вы наверное заметили,
>может поэтому And не срабатывает!
Здесь всё нормально, так как условие WHERE присутствует в каждом запросе. | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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
(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 в 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 в 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
(21.07.2005 в 11:06)
| | Лучше не пытаться охватить всю программу усилием мысли, на это уходит масса времени, а в сложной программе всегда ошибётесь - при возникновении проблем сразу выводите SQL-запрос в окно браузера
Что в нём?
Если видна ошибка, но не понятно окуда взялся лишний AND, на время отладки их можно переименовать AND1, AND2 и т.д. Если ничего не получается - выложите скрипт в том виде какой он сейчас - я помогу вам его отладить. | |
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 12:36)
| | Ура всё получилось, ошибка была вовсе не в запросе а в синтаксисе radiogroup!
Так что больше вас не буду мучить:)))
По крайней мере по этой теме! Спасибо вам огромное! | |
|
|
|