столкнулся с такой задачей. Нужно создать несколько(много) 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
во-вторых, неопределена переменная, к которой ты конкатенацию применяешь (впрочем это нотис). и в третьих, сразу начинается с AND
вот и получишь в запросе что-то типа
SELECT * FROM data WHERE AND
Спустя 7 часов, 24 минуты, 20 секунд (22.05.2011 - 09:47) streetboy написал(а):
Простите что-то я совсем запутался =)
у меня изначально был вот такой код....я никак не мог сообразить как отредактировать SELECT, чтобы туда добавлялись checkbox-ы, которые я выберу...
у меня изначально был вот такой код....я никак не мог сообразить как отредактировать 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 как раз вот субстр и удаляет этот ЭНД!!! ты что это..
streetboy и форму тоже покажи)
streetboy и форму тоже покажи)
Спустя 16 минут, 33 секунды (22.05.2011 - 13:21) Krevedko написал(а):
а..понял. просто впервые вижу, чтобы так тупо делали
Спустя 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 (тут два: москва, питер)
Как подредактировать этот запрос:
если форма такая:
PHP код
Если клиент выберет с помощью чербокса качество "хорошее" и город "москва", Select должен учитывать оба этих параметра!!! Чекбоксов будет много...в этом и заключается сложность написания Selecta.
Спасибо всем кто откликнется!
Площадь
Этаж
Район
итд. их там 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
Это наверное последний вопрос, который задаю))
Пишу вот точно такой же код, но почему-то в массив ничего не сохраняется, а срабатывает условие 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"; // здесь действия если не выбрана ни одна опция
}