Как реализовать динамический запрос на выбор определённых данных? К примеру есть таблица members Получаем переменные с формы Get/Post методом. $look - число(пусть будет 1 либо 2) 1 = man, 2 = woman $city - число (пусть будет до 50 городов) $photo_only - true либо false (checkbox) Вобщем имеем 3 переменных, $look = 2, $city = 5, $photo_only = true. Делаем запрос - выбираем всех пользователей где поле city = 5, look = 2, photo = true. А если скажем переменных не 3 а 20 и половина из них пустых, как тогда при таких условиях составить динамический запрос?
PHP: <?php $query = array(); $str = null; $look = isset($_POST['look'])?(int)$_POST['look']:0; $city = isset($_POST['city'])?(int)$_POST['city']:0; $photo_only = isset($_POST['photo_only'])?1:0; //далее расширяемый блок на нужное кол-во условий if($look > 0) $query[] = "`look` = ".$look; if($city > 0) $query[] = "`city` = ".$city; if($photo_only) $query[] = "`photo_only` = 1";//хранить в базе 1 - для тру, 0 - для фалсе. //Тут если 0 - то в запрос ниче не добавляем $num = count($query); for($i = 0; $i < $num; $i++)//вот тут надо поиграться и сделать чтоб в конце не добавляло лишний AND { $str .= $query[$i]; if($i < $num - 1) $str .= " AND "; } if($num > 0)//тут можно по-разному проверять { $str = "WHERE ".$str; } $temp = mysql_query("SELECT * FROM `table1`".$str); вобщем, суть должна быть ясна. Написал без редактора, так что гдето может синтаксическая быть.
PHP: <?php function getSelect($arr, $tab=null, $where=null, $numUnion=0){ if (is_array($arr)){ if (empty($tab) || !is_string($tab)) throw new FormatException("Не задана таблица для выбора","Неверный тип данных"); $fields=""; foreach($arr as $val){ $fields .=escapeKeys($val).","; } $fields=trim($fields,","); $expr=getWhere($where); $sql="select $fields from $tab ".$expr; //Создаем запрос } else{ $sql=trim($arr.""); } checkQuery($sql, $numUnion); return $sql; } function getWhere($where){ if (is_array($where)) return " where ".getAssignmentString($where, " and"); if (is_int($where)) return " where id=".$where; if (!empty($where)) return " where ".$where; return''; } function getAssignmentString($arr, $delim){ $rez=""; foreach($arr as $key=>$val){ $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim; } $rez=substr($rez,0,-strlen($delim)); return $rez; } function escapeString($str){ if (is_array($str)){ foreach($str as $key=>$val){ $str[$key]=escapeString($val); } return $str; } if ($str==null) return "NULL"; if (is_string($str)) return "'".escape($str)."'"; return $str; } function escapeKeys($key){ if ($key==="*") return "*"; return LKS.$key.RKS; } /*где LKS - left key string RKS - right key string В случае MySQL они равны "`" */ Апельсин implode вместо цикла, не?
Мой код универсальнее, потому сложнее: 1) Твой код надо ручками дописывать на нужное количество полей. Моему коду можно скормить запрос, части запроса, массивы и т.д. 2)Твой код заточен на цифры. Мой код может работать и со строками и с null значениями.
Volt(220) не ну епти, что просят то и делаем но по-моему 5 функций для этого много. Нерационально так сказать. Разве что такой вот поиск будет в нескольких страницах юзаться
Volt(220) PHP: function getAssignmentString($arr, $delim){ $rez=""; foreach($arr as $key=>$val){ $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim; } $rez=substr($rez,0,-strlen($delim)); return $rez; } Что за переменная $delim ?
delimiter - разделитель. Какой строкой разделять $key=$val. Для блока where это "and", а для блока update это ", ".