Когда предложение mysql WHERE пустое, верните все строки

$randomvariable=$_GET['randomvariable']; $search="SELECT * from objects WHERE transactiontype='$randomvariable' order by id DESC"; 

Теперь, если $randomvariable пуст (ничего), я хотел бы, чтобы он возвращал все строки. В настоящее время, если он пуст, он ничего не возвращает, потому что он в основном не ищет ничего из всех строк.

 $randomvariable = ESACPE_MYSQL_STRING($_GET['randomvariable']); $search = "SELECT * FROM objects " . (empty($randomvariable) ? "" : "WHERE transactiontype='$randomvariable' ") . "ORDER BY id DESC"; 

Где ESCAPE_MYSQL_STRING – соответствующая функция для экранирования строк для любого используемого вами драйвера MySQL.

Другой, более модульный способ:

 $search = array( "select" => "SELECT * FROM objects", "where" => "WHERE transactiontype='$randomvariable'", "order" => "ORDER BY id DESC" ); if (empty($randomvariable)) { unset($search["where"]); } $search = implode(' ', $search); с $search = array( "select" => "SELECT * FROM objects", "where" => "WHERE transactiontype='$randomvariable'", "order" => "ORDER BY id DESC" ); if (empty($randomvariable)) { unset($search["where"]); } $search = implode(' ', $search); 

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


Вы также можете сделать это с помощью CASE() в SQL, но это несколько громоздко, и вы не должны ожидать хорошей производительности:

 SELECT * FROM objects WHERE transactiontype LIKE CASE WHEN '$randomvariable' = '' THEN '%' ELSE '$randomvariable' END CASE ORDER BY id DESC 

Другой подход:

 if ($_GET['randomvariable'] != "") { $where = "transactiontype = " . $randomvariable; } else { $where = "1"; } $search = "SELECT * from objects WHERE " . $where . " ORDER BY id DESC"; 

Здесь есть несколько отличных ответов. У меня есть один для простого решения.

Я иногда сталкиваюсь с этой проблемой, когда мне не нужно предложение WHERE, так как ни одно из моих условий для построения моего предложения WHERE не выполняется. Простой трюк, который мне нравится использовать, примерно такой:

 $sql_statement = "SELECT * FROM ".$table_names." WHERE 1 = 1 "; if ($array) { foreach ($array as $key => $value){ $sql_statement .= " AND ".$key." = '".$value."' "; } } 

Таким образом, вам не нужна какая-то сложная логика или манипуляция с строкой, потому что 1 всегда равно 1 в вашем предложении WHERE, и вы можете сохранить свою замкнутую строку в том же формате. Вы можете явно расширить эту концепцию, чтобы сделать больше, но для целей этого вопроса этот psuedocode – это просто простой способ достижения цели.

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

Разделите его на 2 запроса:

 $randomvariable = $_GET['randomvariable']; if($randomvariable) $search="SELECT * from objects WHERE transactiontype='$randomvariable' order by id DESC"; else $search="SELECT * from objects order by id DESC"; 

Если вам действительно нужно сделать это в SQL, а не на своем языке, вы можете сделать это:

 $search="SELECT * from objects WHERE ("" = '$randomvariable' or transactiontype='$randomvariable') order by id DESC"; 

Однако это не будет работать, и предпочтительнее использовать IF / ELSE на вашем языке.

Добавьте простой оператор if, если $ randomvariable имеет значение null. Если он затем изменит запрос, чтобы вернуть все строки.

Попробуйте как ниже

 $randomvariable=mysql_real_escape_string($_GET['randomvariable']); $where = ''; if($randomvariable){ $where .= "WHERE transactiontype='{$randomvariable}'"; } $search="SELECT * from objects ".$where." order by id DESC";