Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Форма с расширенным поиском по критериям
 
 автор: ladan   (18.11.2011 в 15:39)   письмо автору
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 и следовательно сколько вариантов нужно составлять, это же жесть :)

Чувствую что на таких сайтах как здесь использовали другой метод. Буду очень благодарен, если подскажите как правильно это делается ! :)

  Ответить  
 
 автор: cheops   (18.11.2011 в 15:57)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: ladan   (18.11.2011 в 16:03)   письмо автору
 
   для: cheops   (18.11.2011 в 15:57)
 

Спасибо!!!, сейчас попробую :)

  Ответить  
 
 автор: ladan   (18.11.2011 в 16:51)   письмо автору
 
   для: ladan   (18.11.2011 в 16:03)
 

Обалдеть, сделал как вы сказали, все работает, правда если что-то не выбрано, вылазиет ошибка что переменная не определена, но исправил это значком @ присвоив к массиву sql. Попробую усложнить задачу и напишу попозже :)

  Ответить  
 
 автор: ladan   (18.11.2011 в 17:17)   письмо автору
 
   для: 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 ставились бы автоматически при их выборе из формы :( Может я неправильно написал в коде...

  Ответить  
 
 автор: Lotanaen   (18.11.2011 в 17:23)   письмо автору
 
   для: 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";

  Ответить  
 
 автор: cheops   (18.11.2011 в 17:35)   письмо автору
 
   для: 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() - откуда она?

  Ответить  
 
 автор: ladan   (18.11.2011 в 19:14)   письмо автору
 
   для: 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 Тут в моем примере вытаскиваются все картинки из таблички, в которых есть заданные значения из формы

  Ответить  
 
 автор: cheops   (18.11.2011 в 19:28)   письмо автору
 
   для: 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'";
?>

  Ответить  
 
 автор: ladan   (19.11.2011 в 00:29)   письмо автору
 
   для: 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:32)   письмо автору
 
   для: ladan   (19.11.2011 в 00:29)
 

Вот только как галочки заставить быть отмечеными после отправки данных? После отправки данных они тут же слетают гады :)

  Ответить  
 
 автор: cheops   (19.11.2011 в 03:31)   письмо автору
 
   для: ladan   (19.11.2011 в 00:32)
 

При перезагрузке страницы галочки следует явно выставлять в зависимости от содержимого массива $_POST.

  Ответить  
 
 автор: ladan   (19.11.2011 в 04:23)   письмо автору
 
   для: cheops   (19.11.2011 в 03:31)
 

как просто оказывается, спасибо, еще одна проблема решена :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования