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

Форум MySQL

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

 

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

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

тема: Динамическое WHERE-условие из нескольких условий
 
 автор: st.Ass   (16.10.2006 в 21:13)   письмо автору
 
 

Задача -
Предоставляем пользователю форму для выборки -
Он может ввести какие-то данные, например - id | name | pet | date_1 - date_2

Имена переменных соответствуют столбцам в таблице.

Далее введенные данные пробрасываем в обработчик и выполняем запрос вида


<?
if(!isset($id or $name or $pet or $date_1 or $date_2))  {$query "SELECT * FROM main";}
if(isset(
$id or $name or $pet or $date_1 or $date_2))   {$query.="WHERE";
if(isset(
$id))           {$query.="id LIKE %".$id."%";}
if(isset(
$name))     {$query.="name LIKE %".$name."%";}
if(isset(
$pet))         {$query.="pet LIKE %".$pet."%";}
if(isset(
$date_1))   {$query.="date_1 >".$date_1;}
if(isset(
$date_2))  {$query.="date_2 <".$date_2;}
}
?>


Далее выполняем этот запрос и выводим, то что у нас получилось...

Вопрос в том как правильно написать этот код?
Я знаю, что проспустил в этом коде все операторы "AND",
но просто - каким боком его сюда можно приспособить - не понимаю:(

Возможно это можно как-то реализовать по-другому?

   
 
 автор: cheops   (16.10.2006 в 23:13)   письмо автору
 
   для: st.Ass   (16.10.2006 в 21:13)
 

Обычно поступают следующим образом
<? 
if(!isset($id or $name or $pet or $date_1 or $date_2))  {$query "SELECT * FROM main";} 
if(isset(
$id or $name or $pet or $date_1 or $date_2))   {$query.="WHERE"
if(isset(
$id))           $where[] ="id LIKE %".$id."%"
if(isset(
$name))     $where[] ="name LIKE %".$name."%";
if(isset(
$pet))         $where[] ="pet LIKE %".$pet."%"
if(isset(
$date_1))  $where[] ="date_1 >".$date_1
if(isset(
$date_2))  where[] ="date_2 <".$date_2
$query .= implode("AND"$where); 
?>

   
 
 автор: st.Ass   (16.10.2006 в 23:40)   письмо автору
 
   для: cheops   (16.10.2006 в 23:13)
 

но тогда в строке


<?
if(isset($id))           $where[] ="id LIKE %".$id."%";  
?>


После WHERE сразу вставляется AND....

И + еще сервер выдает ошибку - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE %2%' at line 1

   
 
 автор: slonik   (17.10.2006 в 01:05)   письмо автору
 
   для: st.Ass   (16.10.2006 в 23:40)
 

Мож глупость сморожу, а разве не легче сократить этот код..и всё тогда станет проще?

   
 
 автор: st.Ass   (17.10.2006 в 01:35)   письмо автору
 
   для: slonik   (17.10.2006 в 01:05)
 

каким образом?

   
 
 автор: cheops   (17.10.2006 в 13:57)   письмо автору
 
   для: st.Ass   (16.10.2006 в 23:40)
 

Да, необходимо отредактировать код примерно так
<?  
if(!isset($id or $name or $pet or $date_1 or $date_2))  {$query "SELECT * FROM main";}  
if(isset(
$id or $name or $pet or $date_1 or $date_2))   {$query.="WHERE ";  
if(isset(
$id))           $where[] ="id LIKE '%".$id."%'";  
if(isset(
$name))     $where[] ="name LIKE '%".$name."%'"
if(isset(
$pet))         $where[] ="pet LIKE '%".$pet."%'";  
if(isset(
$date_1))  $where[] ="date_1 >".$date_1;  
if(isset(
$date_2))  where[] ="date_2 <".$date_2;  
$query .= implode(" AND "$where);  
?>

   
 
 автор: st.Ass   (18.10.2006 в 14:46)   письмо автору
 
   для: cheops   (17.10.2006 в 13:57)
 

Попробовал запрос выполнить так -

<?
$query
="SELECT * FROM main  WHERE id_terminal LIKE '%".$id."%' ";
?>

Все получается.

Когда пробую -

<?
$query  
"SELECT * FROM main";
$query .="WHERE "
$query .="id LIKE '%".$id."%'";
?>

Не получается - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE '%2%'' at line 1

Конструкцию

<?
$query
.="WHERE "
$where[] ="id LIKE '%".$id."%'";   
$query .= implode(" AND "$where); 
....
?>

Тоже выходит - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE '%2%'' at line 1

Может быть это связано с какими-либо настройками php?

   
 
 автор: cheops   (18.10.2006 в 15:52)   письмо автору
 
   для: st.Ass   (18.10.2006 в 14:46)
 

Отсутствует пробел между main и WHERE
<? 
$query  
"SELECT * FROM main "
$query .="WHERE " 
$query .="id LIKE '%".$id."%'"
?>

   
 
 автор: st.Ass   (18.10.2006 в 16:17)   письмо автору
 
   для: cheops   (18.10.2006 в 15:52)
 

cheops, спасибо Вам огромное, заработало:)

А как быть с тем, что AND будет вставляться сразу после WHERE?

<? 
if(!isset($id or $name or $pet or $date_1 or $date_2))  {$query "SELECT * FROM main ";} 
if(isset(
$id or $name or $pet or $date_1 or $date_2))   {$query.="WHERE "
if(isset(
$id))           $where[] ="id LIKE %".$id."%"
if(isset(
$name))     $where[] ="name LIKE %".$name."%";
if(isset(
$pet))         $where[] ="pet LIKE %".$pet."%"
if(isset(
$date_1))  $where[] ="date_1 >".$date_1
if(isset(
$date_2))  where[] ="date_2 <".$date_2
$query .= implode("AND"$where); 
?> 

   
 
 автор: cheops   (18.10.2006 в 16:43)   письмо автору
 
   для: st.Ass   (18.10.2006 в 16:17)
 

Фукнция implode() вставляет AND между элементами массива $where, только добавьте пробелы до и после AND
<?  
if(!isset($id or $name or $pet or $date_1 or $date_2))  {$query "SELECT * FROM main ";}  
if(isset(
$id or $name or $pet or $date_1 or $date_2))   {$query.="WHERE ";  
if(isset(
$id))           $where[] ="id LIKE %".$id."%";  
if(isset(
$name))     $where[] ="name LIKE %".$name."%"
if(isset(
$pet))         $where[] ="pet LIKE %".$pet."%";  
if(isset(
$date_1))  $where[] ="date_1 >".$date_1;  
if(isset(
$date_2))  where[] ="date_2 <".$date_2;  
$query .= implode(" AND "$where);  
?> 

   
 
 автор: st.Ass   (21.10.2006 в 21:26)   письмо автору
 
   для: cheops   (18.10.2006 в 16:43)
 

Реализовал немного по-другому -

<?   
if(!isset($id) or !isset($name) or !isset($pet) or !isset($date_1) or !isset($date_2))  
$query "SELECT * FROM main ";
   
if(isset(
$id) or isset($name) or isset($pet) or isset($date_1) or isset($date_2))  
{
$query.=" WHERE 1=1  ";   //всегда верно
if(isset($id)) $query. =" AND id LIKE %".$id."%";   
if(isset(
$name)) $query. =" AND name LIKE %".$name."%";  
if(isset(
$pet)) $query. =" AND pet LIKE %".$pet."%";   
if(isset(
$date_1)) $query. =" AND date_1 >".$date_1;   
if(isset(
$date_2)) $query. =" AND date_2 <".$date_2;   
}
$query.=" ORDER by id ";
?>  

   
Rambler's Top100
вверх

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