Конструкция SQL и PHP - PullRequest
       14

Конструкция SQL и PHP

1 голос
/ 14 декабря 2011

Я уверен, что это простой вопрос.

Если вы хотите создать SQL с php для поискового запроса.Итак, у вас есть 5 критериев, которые являются необязательными и могут быть введены или не введены пользователем.Вы не можете гарантировать ни один из них.

Когда речь идет о создании SQL в php, вы можете использовать:

Так что, если они существуют, вы можете использовать AND для 4 последних критериев.

Но для первого критерия, если у вас есть это как WHERE, если этот не выбран, тогда SQL просто является списком AND с без начального WHERE.

Есть липростой ответ?

Код, который я написал:

$sql = "
SELECT *
FROM Request, Rooms
WHERE Day = ".$Day." ";

if($ModCode != ''){
$sql .="AND ModCode = ".$ModCode." ";
}
if($StartTime != ''){
$sql .="AND StartTime = ".$StartTime." ";
}
if($Length != ''){
$sql .="AND Length = ".$Length." ";
}
if($Room != ''){
$sql .="AND Request.RoomID = Rooms.RoomID ";
$sql .='AND Rooms.RoomName = "'.$Room.'" ';
}
if($Room == '' && $Park != ''){
$sql .="AND Request.RoomID = Rooms.RoomID ";
$sql .='AND Rooms.Park = "'.$Park.'" ';
}

А теперь я хочу, чтобы бит WHERE Day = $Day был необязательным, как и другие.

Ура

Ответы [ 6 ]

3 голосов
/ 14 декабря 2011

Вы можете сохранить все критерии в массиве и затем установить между ними AND:

if(!empty($array)) {
   $where_part = "WHERE " . implode(" AND ", $array);
}

Обновление:

$cond = array();

if($ModCode != ''){
$cond[] = "ModCode = ".$ModCode;
}
if($StartTime != ''){
$cond[] = "StartTime = ".$StartTime;
}
if($Length != ''){
$cond[] = "Length = ".$Length;
}
if($Room != ''){
$cond[] = "Request.RoomID = Rooms.RoomID";
$cond[] = 'Rooms.RoomName = "'.$Room.'"';
}
if($Room == '' && $Park != ''){
$cond[] = "Request.RoomID = Rooms.RoomID";
$cond[] = 'Rooms.Park = "'.$Park.'"';
}

if(!empty($cond)) {
    sql .= "WHERE " . implode(" AND ", $cond);
}
1 голос
/ 14 декабря 2011

Не думаю, что это сработает.

Для этого типа JOIN всегда требуется оператор WHERE с условием соединения.
И после его добавления вопрос больше не будет иметь смысла.

Однако, если вам нужно как условное СОЕДИНЕНИЕ, так и условное ГДЕ, вы должны указать это в вопросе.
Во всяком случае, метод довольно похож.

0 голосов
/ 14 декабря 2011

В MySQL у вас есть МАТЧ ... ПРОТИВ

Вроде так:

SELECT id, header, message FROM table WHERE MATCH(header,message) AGAINST ('".mysql_real_escape_string($search)."' IN BOOLEAN MODE)

Вы можете комбинировать MATCH .. ПРОТИВ с любым другим предложением WHERE, например:

WHERE id > 1000 AND MATCH (...) AGAINST ('searchstring' IN BOOLEAN MODE) AND date < NOW()

Однако для этого необходим поиск FULLTEXT, поэтому, насколько я знаю, он не очень полезен для TEXT-столбцов в InnoDB-таблицах. Но это идеальное решение для поиска в таблицах MyISAM, и вы можете использовать его в столбцах VARCHAR ().

0 голосов
/ 14 декабря 2011
where 1 = 1
  and (name = ?            or ? is null)
  and (age = ?             or ? is null)

вопросительные знаки являются просто заполнителями значений.Вы поняли.используйте подготовленные операторы и связанные параметры. В любом случае

каждое из условий предиката, заключенных в скобки, будет иметь значение true, если значение заполнителя равно нулю.убедитесь, что вы различаете ключевое слово sql null и значения "empty" или "false", такие как 0 или пустая строка.Выше требуется тип null.

0 голосов
/ 14 декабря 2011

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

Примерно так:

$where = array();

//build up your where's in an array
$where[] = "searchField1='blah'";
$where[] = "searchField2='foo'";

//make your query and on the where only implode the array if its not empty else return null
$sqlQuery = " 
Select
  *
FROM
  yourTable
".(empty($where)==false ? " WHERE ".implode(" AND ", $where) : null)."
ORDER BY x
";
0 голосов
/ 14 декабря 2011

Мне кажется, я понимаю, что вы имеете в виду.Вы можете разделить запрос следующим образом.

$sql = "SELECT * FROM `table` WHERE ";
$sql .= ($val1 == 1) ? "`field` = 'value' " : "1 = 1 ";
$sql .= ($val2 == 2) ? "AND `field` = 'value'" : "AND 1 = 1";

Редактировать: Быстрое решение проблемы - добавить предложение, которое всегда будет истинным.

...