WHERE子句仅在设置变量时

时间:2014-04-22 00:43:40

标签: mysql where isset

index.php

中的输入和脚本
<input type="text" class="filter" id="frClientName" name="cl_name">

<script>
    $(".filter").on('change keydown keyup', function(){
        var clname;
        clname = document.getElementById("frClientName").value;
        $("#spravaContent").load("php/search_results/sprava.php?cl_name=" + clname;
    });
</script>

的PHP / search_results / sprava.php

$clname = '';
if ( isset ( $_GET['cl_name'] ) ) {
    $clname = $_GET['cl_name'];
}

$sql = ("
    SELECT * FROM `db`.`table`
    WHERE cl_full_name LIKE  '%".$_GET['cl_name']."%'
");

如何正确使用WHERE子句,并且仅当变量不为空时? 谢谢你的指导。

修改

$sql = ("
    SELECT * FROM `db`.`table`
    ORDER BY {$oby} {$ohow}
    WHERE cl_full_name LIKE '%".$_GET['cl_name']."%'
    OR '' = '".$_GET['cl_name']."'
    LIMIT $start_sprava,$per_page_sprava
");

2 个答案:

答案 0 :(得分:2)

有点hacky,但我用CASE语句处理了这样的情况。你评估你的论点,如果它不符合你需要的条件,你使用一个明显真实的语句,如1=1,其结果是保持WHERE子句的一部分参与过滤结果集。

SELECT * 
  FROM `db`.`table`
 WHERE CASE WHEN TRIM('".$_GET['cl_name']."') IS NOT NULL THEN cl_full_name LIKE  '%".$_GET['cl_name']."%'
            ELSE 1=1
       END
 ORDER BY {$oby} {$ohow}
 LIMIT {$start_sprava}, {$per_page_sprava}
;

不要忘记警告你的输入,这样你就不会遇到Little Bobby Tables问题。此外,ORDER BYLIMIT条款通常位于WHERE子句之后。

答案 1 :(得分:1)

无论是否设置,使where子句起作用。

如果未设置变量,假设您的应用语言返回文本“null”:

"SELECT * FROM `db`.`table`
WHERE cl_full_name LIKE '%".$_GET['cl_name']."%'
OR 'null' = '".$_GET['cl_name']."'"