[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Checkbox и SELECT(SQL)
streetboy
Добрый день,

столкнулся с такой задачей. Нужно создать несколько(много) checkbox-ов, которые буду фильтровать поля в базе данных.
Приведу пример, есть фирма, которая занимается недвижимостью ...у нее есть база по недвижимости, чтобы пользователю было удобнее он может выбирать параметры поиска. Нажал 1-checkbox, выбрал только однокомнатные квартиры, нажал еще один checkbox, к поиску добавился критерий- двухкомнатные квартиры итд...

код с checkbox-ами


<form action="obrabotka.php" method="post" name="form">

<INPUT
TYPE="checkbox" NAME="ch[]" VALUE="Один">1+1

<INPUT TYPE="checkbox" NAME="ch[]" VALUE="Два">2+1

<INPUT TYPE="checkbox" NAME="ch[]" VALUE="Три">3+1


<BR><BR> <INPUT TYPE="submit" name="go" VALUE="Поиск">

</form>




PHP код

if ($_POST['go'])
{
for ($i = 0; $i < count($_POST['ch']); $i++)
{
echo 'Вы выбрали ', $_POST['ch'][$i], '<br/>';
if ($_POST['ch'][$i] == '1+1') {echo 1+1, '<br/>';}
if ($_POST['ch'][$i] == '2+1') {echo 2+1, '<br/>';}
if ($_POST['ch'][$i] == '3+1') {echo 3+1, '<br/>';}
}
}




Это все работает, вопрос, как сделать выборку данных? Что нужно вписать вместо
{echo 1+1, '<br/>';}
?

Выборка вроде такой (поповский код =)


$result = mysql_query ("SELECT * FROM data WHERE type1='1+1' AND type2='2+1' ", $db);
$myrow = mysql_fetch_array ($result);



Спасибо тем, кто откликнется!





Спустя 7 минут, 30 секунд (21.05.2011 - 23:46) Crash2007 написал(а):
наверно так)
if ($_POST['go'])
{
for ($i = 0; $i < count($_POST['ch']); $i++)
{
$str .= ' AND type' . $i . ' = "' . $var[$i] . '"';
}
}

$result = mysql_query ("SELECT * FROM data WHERE ' . substr($str,5) . '", $db);
$myrow = mysql_fetch_array ($result);

Спустя 36 минут, 50 секунд (22.05.2011 - 00:23) Krevedko написал(а):

if ($_POST['go'])
{
$str = '';
for ($i = 0; $i < count($_POST['ch']); $i++)
{
$str .= ($i == 0)? 'type' . $i . ' = "' . $_POST['ch'][$i] . '"' : ' AND type' . $i . ' = "' . $_POST['ch'][$i] . '"'
}
}


Спустя 6 минут, 11 секунд (22.05.2011 - 00:29) streetboy написал(а):
Спасибо Вам большое, что написали код целиком! =)

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

$str .= ' AND type' . $i . ' = "' . $var[$i] . '"';








Спустя 12 минут, 47 секунд (22.05.2011 - 00:42) Crash2007 написал(а):
$str .= ' AND type' . $i . ' = "' . $var[$i] . '"';
можно заменить на
$str .= ' AND type' . $i . ' = "' . ($i + 1) . '+1"';

Спустя 1 час, 39 минут, 57 секунд (22.05.2011 - 02:22) Krevedko написал(а):
сомневаюсь, что код краша будет работать. во -первых, зачем там субстр.
во-вторых, неопределена переменная, к которой ты конкатенацию применяешь (впрочем это нотис). и в третьих, сразу начинается с AND
вот и получишь в запросе что-то типа
SELECT * FROM data WHERE AND

Спустя 7 часов, 24 минуты, 20 секунд (22.05.2011 - 09:47) streetboy написал(а):
Простите что-то я совсем запутался =)

у меня изначально был вот такой код....я никак не мог сообразить как отредактировать SELECT, чтобы туда добавлялись checkbox-ы, которые я выберу...



if (isset($_POST['flag'])) {$flag=$_POST['flag'];}
if (isset($flag)) {$flag='61';} else {$flag='';} // если мы выбрали checkbox, то он существует и параметр у него - 61. В Select передается эта переменная и с помощью него выбираем все квартиры, площадь, которых 61 метр.


if (isset($_POST['flag1'])) {$flag1=$_POST['flag1'];}
if (isset($flag1)) {$flag1='7';} else {$flag1='';} // переменная из второго checkbox-а


$result = mysql_query ("SELECT * FROM data WHERE square='$flag' AND flooris='$flag1' ", $db); //а вот здесь и возникла трудность...как записать чтобы срабатывали только отмеченные checkbox-ы







$myrow = mysql_fetch_array ($result);

do {
printf ("<table border='1' cellpadding='0'
cellspacing='0'><tr><td><img src='%s' width='150' height='113'></td><td><a href='katalog2.php?id=%s'> %s</a><br>%s,- крон<br><br>%s состояние, %s<br>%s собственность, %s этаж<br></td><td><br>Адрес:%s</td></tr></table><br>&l t;br>"
,$myrow ['mainfoto'],$myrow ['id'],$myrow ['title'],$myrow ['price'],$myrow ['quality'],$myrow ['typeofbuilding'],$myrow ['form'],$myrow ['flooris'],$myrow ['address']);
}
while ($myrow = mysql_fetch_array ($result));


Спустя 3 часа, 17 минут, 49 секунд (22.05.2011 - 13:04) Crash2007 написал(а):
Krevedko как раз вот субстр и удаляет этот ЭНД!!! ты что это.. ph34r.gif

streetboy и форму тоже покажи)

Спустя 16 минут, 33 секунды (22.05.2011 - 13:21) Krevedko написал(а):
а..понял. просто впервые вижу, чтобы так тупо делали biggrin.gif

Спустя 1 час, 54 минуты, 31 секунда (22.05.2011 - 15:15) Crash2007 написал(а):
как много смысла..

Спустя 4 часа, 15 минут, 14 секунд (22.05.2011 - 19:31) streetboy написал(а):

вот форма


<form action="obrabotka.php" method="post" enctype="multipart/form-data" name="form">



<INPUT
TYPE="checkbox" NAME="flag" VALUE="flag">Гарсонка

<INPUT TYPE="checkbox" NAME="flag1" VALUE="flag1">1+кк


<BR><BR> <INPUT TYPE="submit" name="go" VALUE="Поиск">



</FORM>




Спустя 2 часа, 37 минут, 58 секунд (22.05.2011 - 22:09) killer8080 написал(а):
как вариант, если чекбоксов много, можно так
 mysql_query ("SELECT * FROM data WHERE type1 IN ('".implode("', '", $_POST['ch'])."')", $db);
только про экранирование sql не забывай :)

Спустя 1 час, 36 минут, 37 секунд (22.05.2011 - 23:45) streetboy написал(а):
А последний вариант никак не получится переделать? Мне его редактировать легче, сам писал все-таки )

Спустя 10 часов, 1 минута, 47 секунд (23.05.2011 - 09:47) killer8080 написал(а):
streetboy
не пойму структуру таблицы. Есть несколько взаимоисключающих вариантов - одно комнатные, двух комнатные ... квартиры, и для каждого варианта у вас отдельное поле в таблице? Где логика? Получается, для каждой записи активно только одно, соответствующие типу, поле и запросы вида
"SELECT * FROM data WHERE type1='1+1' AND type2='2+1' "
никогда ничего не вернут, нужно как минимум AND заменить на OR, а лучше использовать одно поле type, и писать в него значение соответствующее типу (1+1, 2+1). Тогда выборку можно делать использую оператор IN, как я приводил пример выше.

Спустя 2 часа, 28 минут, 34 секунды (23.05.2011 - 12:16) Krevedko написал(а):
полюбому OR или IN.
явно квартира не может быть одновременно однокомнатной и двухкомнатной

Спустя 9 часов, 34 минуты, 6 секунд (23.05.2011 - 21:50) Guest написал(а):

Это я экспериментировал...Суть не в этом. Полей там много разных:
Площадь
Этаж
Район
итд. их там 15 штук.

Если упростить и взять три поля
качество: quality (тут три чекбокса: хорошее, среднее, плохое)
жилплощадь: square (тоже три чекбокса: от 40-60, от 60-80, свыше 80)
Город: town (тут два: москва, питер)

Как подредактировать этот запрос:

$result = mysql_query ("SELECT * FROM data WHERE square='$flag' AND flooris='$flag1' ", $db);

если форма такая:



<form action="obrabotka.php" method="post" enctype="multipart/form-data" name="form">


<p>
Качество</p>
<INPUT
TYPE="checkbox" NAME="flag1" VALUE="flag1">Хорошее
<INPUT TYPE="checkbox" NAME="flag2" VALUE="flag2">Среднее
<INPUT TYPE="checkbox" NAME="flag3" VALUE="flag3">Плохое


<p>Жилплощадь</p>
<INPUT
TYPE="checkbox" NAME="flag4" VALUE="flag4">от 40-60
<INPUT TYPE="checkbox" NAME="flag5" VALUE="flag5">от 60-80
<INPUT TYPE="checkbox" NAME="flag6" VALUE="flag6">свыше 80

<p>Город</p>
<INPUT
TYPE="checkbox" NAME="flag7" VALUE="flag7">Москва
<INPUT TYPE="checkbox" NAME="flag8" VALUE="flag8">Питер

<BR><BR> <INPUT TYPE="submit" name="go" VALUE="Поиск">

</FORM>




PHP код


if (isset($_POST['flag1'])) {$flag1=$_POST['flag1'];}
if (isset($flag1)) {$flag1='хорошее';} else {$flag1='';}

if (isset($_POST['flag2'])) {$flag1=$_POST['flag2'];}
if (isset($flag2)) {$flag2='хорошее';} else {$flag2='';}

if (isset($_POST['flag3'])) {$flag3=$_POST['flag3'];}
if (isset($flag3)) {$flag3='хорошее';} else {$flag3='';}

if (isset($_POST['flag4'])) {$flag4=$_POST['flag4'];}
if (isset($flag4)) {$flag4='хорошее';} else {$flag4='';}

if (isset($_POST['flag5'])) {$flag5=$_POST['flag5'];}
if (isset($flag5)) {$flag5='хорошее';} else {$flag5='';}

if (isset($_POST['flag6'])) {$flag6=$_POST['flag6'];}
if (isset($flag6)) {$flag6='хорошее';} else {$flag6='';}

if (isset($_POST['flag7'])) {$flag7=$_POST['flag7'];}
if (isset($flag7)) {$flag7='хорошее';} else {$flag7='';}

if (isset($_POST['flag8'])) {$flag8=$_POST['flag8'];}
if (isset($flag8)) {$flag8='хорошее';} else {$flag8='';}


$result = mysql_query ("SELECT * FROM data WHERE quality='$flag1' OR town='$flag7' --------как записать этот запрос------- ", $db);



$myrow = mysql_fetch_array ($result);

do {
printf ("<table border='1' cellpadding='0'
cellspacing='0'><tr><td><img src='%s' width='150' height='113'></td><td><a href='katalog2.php?id=%s'> %s</a><br>%s,- крон<br><br>%s состояние, %s<br>%s собственность, %s этаж<br></td><td><br>Адрес:%s</td></tr></table><br>&l t;br>"
,$myrow ['mainfoto'],$myrow ['id'],$myrow ['title'],$myrow ['price'],$myrow ['quality'],$myrow ['typeofbuilding'],$myrow ['form'],$myrow ['flooris'],$myrow ['address']);
}
while ($myrow = mysql_fetch_array ($result));



Если клиент выберет с помощью чербокса качество "хорошее" и город "москва", Select должен учитывать оба этих параметра!!! Чекбоксов будет много...в этом и заключается сложность написания Selecta.

Спасибо всем кто откликнется!

Спустя 5 минут, 12 секунд (23.05.2011 - 21:55) streetboy написал(а):
Это я экспериментировал...Суть не в этом. Полей там много разных:
Площадь
Этаж
Район
итд. их там 15 штук.

Если упростить и взять три поля
качество: quality (тут три чекбокса: хорошее, среднее, плохое)
жилплощадь: square (тоже три чекбокса: от 40-60, от 60-80, свыше 80)
Город: town (тут два: москва, питер)

Как подредактировать этот запрос:

$result = mysql_query ("SELECT * FROM data WHERE quality='$flag1' OR town='$flag7' --------как записать этот запрос------- ", $db);

если форма такая:



<form action="obrabotka.php" method="post" enctype="multipart/form-data" name="form">


<p>
Качество</p>
<INPUT
TYPE="checkbox" NAME="flag1" VALUE="flag1">Хорошее
<INPUT TYPE="checkbox" NAME="flag2" VALUE="flag2">Среднее
<INPUT TYPE="checkbox" NAME="flag3" VALUE="flag3">Плохое


<p>Жилплощадь</p>
<INPUT
TYPE="checkbox" NAME="flag4" VALUE="flag4">от 40-60
<INPUT TYPE="checkbox" NAME="flag5" VALUE="flag5">от 60-80
<INPUT TYPE="checkbox" NAME="flag6" VALUE="flag6">свыше 80

<p>Город</p>
<INPUT
TYPE="checkbox" NAME="flag7" VALUE="flag7">Москва
<INPUT TYPE="checkbox" NAME="flag8" VALUE="flag8">Питер

<BR><BR> <INPUT TYPE="submit" name="go" VALUE="Поиск">

</FORM>




PHP код


if (isset($_POST['flag1'])) {$flag1=$_POST['flag1'];}
if (isset($flag1)) {$flag1='хорошее';} else {$flag1='';}

if (isset($_POST['flag2'])) {$flag1=$_POST['flag2'];}
if (isset($flag2)) {$flag2='хорошее';} else {$flag2='';}

if (isset($_POST['flag3'])) {$flag3=$_POST['flag3'];}
if (isset($flag3)) {$flag3='хорошее';} else {$flag3='';}

if (isset($_POST['flag4'])) {$flag4=$_POST['flag4'];}
if (isset($flag4)) {$flag4='хорошее';} else {$flag4='';}

if (isset($_POST['flag5'])) {$flag5=$_POST['flag5'];}
if (isset($flag5)) {$flag5='хорошее';} else {$flag5='';}

if (isset($_POST['flag6'])) {$flag6=$_POST['flag6'];}
if (isset($flag6)) {$flag6='хорошее';} else {$flag6='';}

if (isset($_POST['flag7'])) {$flag7=$_POST['flag7'];}
if (isset($flag7)) {$flag7='хорошее';} else {$flag7='';}

if (isset($_POST['flag8'])) {$flag8=$_POST['flag8'];}
if (isset($flag8)) {$flag8='хорошее';} else {$flag8='';}


$result = mysql_query ("SELECT * FROM data WHERE quality='$flag1' OR town='$flag7' --------как записать этот запрос------- ", $db);



$myrow = mysql_fetch_array ($result);

do {
printf ("<table border='1' cellpadding='0'
cellspacing='0'><tr><td><img src='%s' width='150' height='113'></td><td><a href='katalog2.php?id=%s'> %s</a><br>%s,- крон<br><br>%s состояние, %s<br>%s собственность, %s этаж<br></td><td><br>Адрес:%s</td></tr></table><br>&a mp;l t;br>"
,$myrow ['mainfoto'],$myrow ['id'],$myrow ['title'],$myrow ['price'],$myrow ['quality'],$myrow ['typeofbuilding'],$myrow ['form'],$myrow ['flooris'],$myrow ['address']);
}
while ($myrow = mysql_fetch_array ($result));


Если клиент выберет с помощью чербокса качество "хорошее" и город "москва", Select должен учитывать оба этих параметра!!! Чекбоксов будет много...в этом и заключается сложность написания Selecta.

Спасибо всем кто откликнется!

Спустя 21 час, 13 минут, 50 секунд (24.05.2011 - 19:09) killer8080 написал(а):
Цитата (streetboy @ 23.05.2011 - 21:55)
Чекбоксов будет много...в этом и заключается сложность написания Selecta.

Да нет там ничего сложного :)
Кстати запрос у вас вообще кривой, что это за условие "quality OR city", тут как раз нужно AND! Из формы нужно убрать атрибут enctype, multipart/form-data нужно для отправки файлов, в поисковой форме это ни к чему.
Я бы сделал примерно так:
$defs = array();

if(isset($_POST['flag1']) || isset($_POST['flag2']) || isset($_POST['flag3'])){
$flags = array();
if(isset($_POST['flag1']))
$flags[] = "Хорошее";

if(isset($_POST['flag2']))
$flags[] = "Среднее";

if(isset($_POST['flag3']))
$flags[] = "Плохое";

$defs[] = "`quality` IN ('".implode("', '", $flags)."')";
}

if(isset($_POST['flag4']) || isset($_POST['flag5']) || isset($_POST['flag6'])){
$flags = array();
if(isset($_POST['flag4']))
$flags[] = "40-60";

if(isset($_POST['flag5']))
$flags[] = "60-80";

if(isset($_POST['flag6']))
$flags[] = "свыше 80";

$defs[] = "`square` IN ('".implode("', '", $flags)."')";
}

if(isset($_POST['flag7']) || isset($_POST['flag8'])){
$flags = array();
if(isset($_POST['flag7']))
$flags[] = "Москва";

if(isset($_POST['flag8']))
$flags[] = "Питер";

$defs[] = "`town` IN ('".implode("', '", $flags)."')";
}

if(!empty($defs)){
// если выбрана хоть одна опция делаем запрос к базе, и выводим то что нужно
$sql = "SELECT * FROM `data` WHERE ".implode(" && ", $defs);

}
else{
// здесь действия если не выбрана ни одна опция
}

В массив $flags нужно вставлять значения опций, которые пишутся в БД.

PS и названия переменным нужно давать осмысленные, вы сами не путаетесь что такое flag1 или flag5? И кстати город по английски city, под словом town подразумевается маленький городок, применительно к Москве и Питеру это звучит не корректно :)

И да, поисковые запросы нужно передавать через GET не забывайте о постраничном выводе.

И вместо конструкции do while, нужно использовать просто while!

Спустя 3 часа, 35 минут, 51 секунда (24.05.2011 - 22:45) streetboy написал(а):
Спасибо Вам огромное killer8080 за целый код, а также дельные советы!
Это наверное последний вопрос, который задаю))

Пишу вот точно такой же код, но почему-то в массив ничего не сохраняется, а срабатывает условие else



$defs = array();

if(isset($_POST['flag1']) || isset($_POST['flag2']) || isset($_POST['flag3'])){
$flags = array();
if(isset($_POST['flag1']))
$flags[] = "Хорошее";

if(isset($_POST['flag2']))
$flags[] = "Среднее";

if(isset($_POST['flag3']))
$flags[] = "Плохое";

$defs[] = "`quality` IN ('".implode("', '", $flags)."')";
}

if(isset($_POST['flag4']) || isset($_POST['flag5']) || isset($_POST['flag6'])){
$flags = array();
if(isset($_POST['flag4']))
$flags[] = "40-60";

if(isset($_POST['flag5']))
$flags[] = "60-80";

if(isset($_POST['flag6']))
$flags[] = "свыше 80";

$defs[] = "`square` IN ('".implode("', '", $flags)."')";
}

if(isset($_POST['flag7']) || isset($_POST['flag8'])){
$flags = array();
if(isset($_POST['flag7']))
$flags[] = "Москва";

if(isset($_POST['flag8']))
$flags[] = "Питер";

$defs[] = "`town` IN ('".implode("', '", $flags)."')";
}

if(!empty($defs)){
// если выбрана хоть одна опция делаем запрос к базе, и выводим то что нужно
$result = mysql_query ("SELECT * FROM `data` WHERE ".implode(" && ", $defs));

$myrow = mysql_fetch_array ($result);

do {
printf ("<table border='1' cellpadding='0'
cellspacing='0'><tr><td><img src='%s' width='150' height='113'></td><td><a href='katalog2.php?id=%s'> %s</a><br>%s,- крон<br><br>%s состояние, %s<br>%s собственность, %s этаж<br></td><td><br>Адрес:%s</td></tr></table><br>&l t;br>"
,$myrow ['mainfoto'],$myrow ['id'],$myrow ['title'],$myrow ['price'],$myrow ['quality'],$myrow ['typeofbuilding'],$myrow ['form'],$myrow ['flooris'],$myrow ['address']);
}
while ($myrow = mysql_fetch_array ($result));


}
else{
echo "fignja"; // здесь действия если не выбрана ни одна опция
}

Быстрый ответ:

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