Народ привет! Подскажите такую вещь: 1.Есть таблица mytab с данными. 2.Есть форма запроса с 2-мя параметрами, значение каждого из которых может не существовать. 3.Как сделать грамотный запрос, который бы учитывал отсутствие того или иного параметра... Паример SELECT * FROM mytab WHERE [param1 LIKE param_num1] OR [param2 LIKE param_num2]; скобочками [] - я указал, что может отсутствовать параметры param1 или param2. Большое спасибо!
А чем текущий не подходит? Можно так: PHP: <?php if (!empty($_POST["param_num1"]) and !empty($_POST["param_num2"])) { $like = 'param1 LIKE "%'. mysql_real_escape_string(strtr($_POST["param_num1"], Array("_" => " ", "%" => " "))).'%" AND param2 LIKE "%'.mysql_real_escape_string(strtr($_POST["param_num2"], Array("_" => " ", "%" => " "))).'%"'; } if (!empty($_POST["param_num1"]) and empty($_POST["param_num2"])) { $like = 'param1 LIKE "%'. mysql_real_escape_string(strtr($_POST["param_num1"], Array("_" => " ", "%" => " "))).'%"'; } if (empty($_POST["param_num1"]) and !empty($_POST["param_num2"])) { $like = 'param2 LIKE "%'.mysql_real_escape_string(strtr($_POST["param_num2"], Array("_" => " ", "%" => " "))).'%"'; } $sql = 'SELECT * FROM mytab WHERE .'$like; ?>
Ага понятно, а почему нет все-таки универсального запроса, если param1 и param2 не существуют, то выражение в цитате не проканает...
PHP: <?php //объявляем переменную для хранения условий запроса $like = ''; //проверяем, переданы ли параметры if($param1){ //первый параметр передан, проверяем, заполнена ли переменная условий еще какими-то значениями if(!$like){ //не заполнена, заполняем $like = "%{$param1}%"; } else { //заполнена, объединяем с прежним значением $like .= " AND %{$param1}%"; } } //итого: $like либо корректное условие, либо null ?> хотя, вложенный IF у меня написан короче=)
Не... вообще на первый взгляд подход должен быть такой: PHP: <?php $s_query="SELECT * FROM mytab "; if ( $_POST['param01]'] || $_POST['param02']){ $s_query=$s_query." WHERE "; } if ($_POST['param01']){ $s_query=$s_query." param01 LIKE '".$_POST['param01']." ' } if ($_POST['param02']){ if ($_POST['param02']){ $s_query=$s_query." AND "; } $s_query=$s_query." param02 LIKE '".$_POST['param02']." ' } ну и т.д... ?> Кто-нить, предложите что-нибудь пооптимизированней, а то все равно гемморойнойное количество условий появляется...
А можно примерчик... Насколько я понимаю - логично сделать некий простой класс, скажем позволяющий "распозновать" до 10 элементов и скажем работать на одно условие AND. Соответствено - на выходе будет строка запроса...
Ну что-то вроде такого: PHP: <?php $q = array(); if (!empty ($param1)) $q[] = 'param1 = "'. mysql_real_escape_string ($param1) .'"'; if (!empty ($param2)) $q[] = 'param2 = "'. mysql_real_escape_string ($param2) .'"'; if (!empty ($param3)) $q[] = 'param3 = "'. mysql_real_escape_string ($param3) .'"'; if ($q) $sql = 'SELECT * FROM table WHERE '. implode( $q, ' AND ' );
PHP: <? $where = ''; foreach (array('param1', 'param2', 'param3') as $var) { if (!empty ($$var)) { $where .= $where ? ' AND ' : ' WHERE '; $where .= $var.' = '.$db->quote($$var); } } $sql = 'SELECT * FROM table'.$where; P.S.: юзать ORM (например, doctrine) гораздо приятней чем писать конструкторы запросов
DarkElf PHP: <?php $sql = 'SELECT * FROM table WHERE '. ($q ? implode( $q, ' AND ' ) : 1); Блин, это ж не готовый рабочий скрипт. Просто пример. Думаю, автор топика способен разобраться с if