|
 7.8 Кб |
|
| Добрый день, помогите доработать форму с поиском по выбранным критериям. Например как здесь или здесь здесь. Мне нужно, чтобы из базы выводились конкретные элементы, которым соответствуют значения, что выбрал человек из формы. Например:
В таблице есть 15 полей и в каждом поле стоят свои значения(Яблоко, Груша, Свелка, Огурец и тд), а в самой таблице пусть будет 20 записей. Человеку нужно выбрать все записи из таблицы, в которых есть поле и содержит в себе "Яблоко". А если человек выбрал "Яблоко", "Груша", "Морковь", то нужно вывести из базы все записи, в которых есть как минимум эти поля.
Пока что вот что у меня получилось:
http://forma.anapa-kurort.net/index.php
Ниже весь код
<form action="index.php" method="get">
<label>Синий<input name="blue" type="checkbox" value="1"></label><br>
<label>Зеленый<input name="green" type="checkbox" value="1"></label><br>
<label>Красный<input name="red" type="checkbox" value="1"></label><br><br>
<input name="" type="submit" value="Показать все картинки, в которых есть как минимум эти цвета">
</form>
<?php
if(isset($_GET['blue'])) {$blue = $_GET['blue'];}
if(isset($_GET['green'])) {$green = $_GET['green'];}
if(isset($_GET['red'])) {$red = $_GET['red'];}
/* Соединяемся с бд, делаем запрос */
function zapros($primer)
{
$connect = mysql_connect("localhost","php","12345");
mysql_select_db("colorbd", $connect);
{
$result = mysql_query("SELECT img FROM colors $primer", $connect);
$myrow = mysql_fetch_array($result);
do
{
printf("<div style='border-bottom:2px solid #424242; width:200px; margin:0 auto;'><img src='%s'></div><br>", $myrow['img']);
}
while ($myrow = mysql_fetch_array($result));
}
}
/* Если ничего не выбрано, то выводим все */
if (!isset($blue) and !isset($green) and !isset($red))
{
zapros("");
}
/* Если были выбраны все цвета */
if (isset($green) and isset($red) and isset($blue))
{
zapros("WHERE green='$green' AND red='$red' AND blue='$blue'");
exit();
}
/* Если был выбран зеленый и красный цвет */
if (isset($green) and isset($red))
{
zapros("WHERE green='$green' AND red='$red'");
exit();
}
/* Если был выбран зеленый и синий цвет */
if (isset($green) and isset($blue))
{
zapros("WHERE green='$green' AND blue='$blue'");
exit();
}
/* Если был выбран синий и красный цвет */
if (isset($red) and isset($blue))
{
zapros("WHERE red='$red' AND blue='$blue'");
exit();
}
/* Если был выбран синий цвет */
if (isset($blue))
{
zapros("WHERE blue='$blue'");
}
/* Если был выбран красный цвет */
if (isset($red))
{
zapros("WHERE red='$red'");
}
/* Если был выбран зеленый цвет */
if (isset($green))
{
zapros("WHERE green='$green'");
}
?>
|
У меня в базе было 7 записей и по 5 полей в каждой( в 3-х полях были указанные значения из формы). Я составил все запросы к базе по всем возможным вариантам, которые мог бы выбрать пользователь. С 3 полями работать было несложно, а что если в форме будет не 3 варианта, а 20 и следовательно сколько вариантов нужно составлять, это же жесть :)
Чувствую что на таких сайтах как здесь использовали другой метод. Буду очень благодарен, если подскажите как правильно это делается ! :) | |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 15:39)
| | Так обычно не поступают, есть более элегантный путь - формируют массив $sql со значениями "green='$green'", "red='$red'", "blue='$blue'" в зависимости от того, какие галки были выбраны, а потом при формировании WHERE-условия этот массив преобразуют в строку при помощи implode(), объединяя элементы при помощи разделителя " AND ".
<?php
$query = "SELECT * FROM tbl WHERE ".implode(" AND ", $sql);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 15:57)
| | Спасибо!!!, сейчас попробую :) | |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 16:03)
| | Обалдеть, сделал как вы сказали, все работает, правда если что-то не выбрано, вылазиет ошибка что переменная не определена, но исправил это значком @ присвоив к массиву sql. Попробую усложнить задачу и напишу попозже :) | |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 16:51)
| |
@$sql = array("green='$green'", "red='$red'", "blue='$blue'");
$connect = mysql_connect("localhost","php","12345");
mysql_select_db("colorbd", $connect);
$result = mysql_query("SELECT * FROM colors WHERE ".implode(" AND ",@$sql));
$myrow = mysql_fetch_array($result);
do
{
printf("<div style='border-bottom:2px solid #424242; width:200px; margin:0 auto;'><img src='%s'></div><br>", $myrow['img']);
}
while ($myrow = mysql_fetch_array($result));
|
Теперь по нажатию по галкам выводится только 1 запись из таблицы, либо синий, либо красный, либо зеленый, либо красно-зеленый и тд. Несколько вариантов больше не выводится( . Если я ставлю галку там где переменная $blue=1, то к базе идет обращение и вытаскивается поле с id равному 2, хотя по идеи мне нужно чтобы выводились все записи, где есть синий цвет, id=1, id=5 и id=6 не выводятся..(есть скрин таблицы, файл прикрепил)
Проблема бы решилась, если значения в массиве sql ставились бы автоматически при их выборе из формы :( Может я неправильно написал в коде... | |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 17:17)
| |
$sql = array("green='$green'", "red='$red'", "blue='$blue'");
if ($green)
$sql[] = "green='$green'";
if ($red)
$sql[] = "red='$red'";
if ($blue)
$sql[] = "blue='$blue'";
if(sizeof($sql)) {
$connect = mysql_connect("localhost","php","12345");
mysql_select_db("colorbd", $connect);
$result = mysql_query("SELECT * FROM colors WHERE ".implode(" AND ",@$sql));
$myrow = mysql_fetch_array($result);
do
{
printf("<div style='border-bottom:2px solid #424242; width:200px; margin:0 auto;'><img src='%s'></div><br>", $myrow['img']);
}
while ($myrow = mysql_fetch_array($result));
}
else
echo "not select";
|
| |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 17:17)
| | Нет-нет, не нужно убирать все if-блоки, пусть они останутся, но в меньшем количестве, сколько галок - столько и if-блоков. Я имею в виду следующую схему
<?php
...
$sql = array();
// Динамически формируем массив $sql в зависимости
// от выбора пользователя
if(!isset($blue)) $sql[] = "blue='$blue'";
if(!isset($green)) $sql[] = "green='$green'";
if(!isset($red)) $sql[] = "red='$red'";
// Если отмечена галка хотя бы одна галка
if(!empty($sql))
{
$connect = mysql_connect("localhost","php","12345");
mysql_select_db("colorbd", $connect);
$result = mysql_query("SELECT * FROM colors WHERE ".implode(" AND ", $sql));
if(!$result) echo "Ошибка выполнения SQL-запроса ".mysql_error();
if(mysql_num_rows($result))
{
while ($myrow = mysql_fetch_array($result));
{
printf("<div style='border-bottom:2px solid #424242; width:200px; margin:0 auto;'><img src='%s'></div><br>", $myrow['img']);
}
}
}
// Не отмечена ни одна галка
else
{
echo "А ничего не выбрано...";
}
...
?>
|
PS Кстати, не у вас одного я наблюдаю интересную привязанность к циклу do {...} while(), в ситуациях, когда лучше всего подходит while() - откуда она? | |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 17:35)
| | изучал php по урокам одного автора... они все одинаковые, просто я привык к do-while :)
Ваш код проверял, все равно результат один..
ошибку выходит(переменные неопределены), если отправлять незаполненую форму или полузаполненную
$sql = array();
// Динамически формируем массив $sql в зависимости
// от выбора пользователя
if(!isset($blue)) $sql[] = "blue='$blue'";
if(!isset($green)) $sql[] = "green='$green'";
if(!isset($red)) $sql[] = "red='$red'";
|
Пользователь выбирает что-то одно, а в массив попадает сразу все 3 значения и из базы пытается вытащить не по 1 значению, а сразу по всем...
пока не получается добиться того же самого как здесь http://forma.anapa-kurort.net/index.php (мой вариант)
Ну если другой пример привести, то мне нужно примерно следущее:
В базе есть 30 записей с авто и в каждой записи по 10 колонок(пробег, год авто, цвет, стоимость, кожаный салон, 4 двери и тд). И по нажатию галочки или галок нужно отсортировать или показать все автомобили, в которых есть эти значения.
Прописывая одни условия if(как в моем варианте), голову сломаешь :)
а если через implode(" AND ", $sql),все будет тип-топ, только если все переменые будут определены, иначе одни ошибки... Увидел у товарища Lotanaen следущее
if ($green)
$sql[] = "green='$green'";
if ($red)
$sql[] = "red='$red'";
if ($blue)
$sql[] = "blue='$blue'";
|
не знаете как с помощью условий if(isset($red/$blue/$green)) занести их в массив $sql = array(); ? Если существует переменная $blue=1, то заносим в $sql = array(); значение "blue='$blue'", а если нет, то ничего не делаем, как-то вот так.
может я не догоняю как правильно сделать :)
Посмотрите пожалуйста, вот что я хочу чтобы получилось http://forma.anapa-kurort.net/index.php Тут в моем примере вытаскиваются все картинки из таблички, в которых есть заданные значения из формы | |
|
|
|
|
|
|
|
для: ladan
(18.11.2011 в 19:14)
| | Подразумевается, что у вас работает вот этот код
if(isset($_GET['blue'])) {$blue = $_GET['blue'];}
if(isset($_GET['green'])) {$green = $_GET['green'];}
if(isset($_GET['red'])) {$red = $_GET['red'];}
|
или можно напрямую писать
<?php
$sql = array();
// Динамически формируем массив $sql в зависимости
// от выбора пользователя
if(!empty($_GET['blue'])) $sql[] = "blue='$blue'";
if(!empty($_GET['green'])) $sql[] = "green='$green'";
if(!empty($_GET['red'])) $sql[] = "red='$red'";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(18.11.2011 в 19:28)
| | Ребята, спасибо за ответы, посидел еще три часа, в итоге вот какой код должен быть
<?
if(isset($_GET['blue'])) {$blue = $_GET['blue'];}
if(isset($_GET['green'])) {$green = $_GET['green'];}
if(isset($_GET['red'])) {$red = $_GET['red'];}
if(isset($_GET['black'])) {$black = $_GET['black'];}
if(isset($blue) or isset($red) or isset($green) or isset($black))
{
if (isset($blue))
{
$sql[] = "blue='$blue'";
}
if (isset($red))
{
$sql[] = "red='$red'";
}
if (isset($black))
{
$sql[] = "black='$black'";
}
if (isset($green))
{
$sql[] = "green='$green'";
}
$connect = mysql_connect("localhost","php","12345");
mysql_select_db("colorbd", $connect);
$result = mysql_query("SELECT img FROM colors WHERE ".implode(" AND ", $sql));
$myrow = mysql_fetch_array($result);
do
{
printf("<div style='border-bottom:2px solid #424242; width:200px; margin:0 auto;'><img src='%s'></div><br>\n", $myrow['img']);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
echo "Ничего не выбрано";
}
?>
|
Доволен как краб :)) Можете посмотреть результат http://forma.anapa-kurort.net/index.php
Самая главная проблема решена!!! Классный форум, сам до этого бы сам не дошел :) Рек и уважуха :) | |
|
|
|
|
|
|
|
для: ladan
(19.11.2011 в 00:29)
| | Вот только как галочки заставить быть отмечеными после отправки данных? После отправки данных они тут же слетают гады :) | |
|
|
|
|
|
|
|
для: ladan
(19.11.2011 в 00:32)
| | При перезагрузке страницы галочки следует явно выставлять в зависимости от содержимого массива $_POST. | |
|
|
|
|
|
|
|
для: cheops
(19.11.2011 в 03:31)
| | как просто оказывается, спасибо, еще одна проблема решена :) | |
|
|
|
|