|
|
|
| Задача -
Предоставляем пользователю форму для выборки -
Он может ввести какие-то данные, например - 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",
но просто - каким боком его сюда можно приспособить - не понимаю:(
Возможно это можно как-то реализовать по-другому? | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: st.Ass
(16.10.2006 в 23:40)
| | Мож глупость сморожу, а разве не легче сократить этот код..и всё тогда станет проще? | |
|
|
|
|
|
|
|
для: slonik
(17.10.2006 в 01:05)
| | каким образом? | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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? | |
|
|
|
|
|
|
|
для: st.Ass
(18.10.2006 в 14:46)
| | Отсутствует пробел между main и WHERE
<?
$query = "SELECT * FROM main ";
$query .="WHERE "
$query .="id LIKE '%".$id."%'";
?>
|
| |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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 ";
?>
|
| |
|
|
|