Php 当mysql WHERE子句为空时,返回所有行

Php 当mysql WHERE子句为空时,返回所有行,php,mysql,where,Php,Mysql,Where,现在,如果$randomvariable为空(无),我希望它返回所有行。当前,如果为空,则不会返回任何内容,因为它基本上不会从所有行中搜索任何内容。另一种方法: $randomvariable=$_GET['randomvariable']; $search="SELECT * from objects WHERE transactiontype='$randomvariable' order by id DESC"; 尝试如下 if ($_GET['r

现在,如果
$randomvariable
为空(无),我希望它返回所有行。当前,如果为空,则不会返回任何内容,因为它基本上不会从所有行中搜索任何内容。

另一种方法:

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

if ($_GET['randomvariable'] != "") {
   $where = "transactiontype = " . $randomvariable;
} else {
   $where = "1";
}

$search = "SELECT * from objects WHERE " . $where . " ORDER BY id DESC";
将其拆分为两个查询:

$randomvariable=mysql_real_escape_string($_GET['randomvariable']);

$where = '';
if($randomvariable){
 $where .= "WHERE transactiontype='{$randomvariable}'";
}

$search="SELECT * from objects ".$where." order by id DESC";
其中
ESCAPE\u MYSQL\u STRING
是用于为您正在使用的任何MYSQL驱动程序转义字符串的相关函数

另一种更模块化的方式:

$randomvariable = ESACPE_MYSQL_STRING($_GET['randomvariable']);
$search =
    "SELECT * FROM objects " .
    (empty($randomvariable) ? "" : "WHERE transactiontype='$randomvariable' ") .
    "ORDER BY id DESC";
这样做的好处是,您可以轻松地为任何情况添加、删除或更改查询,并且可以轻松访问查询的任何部分


您也可以在SQL中执行此操作,但这有点麻烦,您也不应该期望有好的性能:

$search = array(
    "select" => "SELECT * FROM objects",
    "where" => "WHERE transactiontype='$randomvariable'",
    "order" => "ORDER BY id DESC"
);

if (empty($randomvariable)) {
    unset($search["where"]);
}

$search = implode(' ', $search);

如果您确实需要使用SQL而不是您的语言执行此操作,您可以执行以下操作:

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

但是,这不会很好地执行,最好使用您的语言中的IF/ELSE。

添加一个简单的IF语句,检查$randomvariable是否为null。如果是,则更改查询以返回所有行。

这里有一些很好的答案。对于一个简单的解决方案,我要添加一个

当我不需要WHERE子句时,我有时会遇到这个问题,因为构建WHERE子句的条件都不满足。我喜欢使用的一个简单技巧如下:

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

这样,您就不需要任何复杂的逻辑或字符串操作,因为在WHERE子句中1始终等于1,并且您可以保持循环字符串concats的格式相同。显然,您可以扩展此概念来做更多的事情,但就本问题而言,此psuedocode只是实现此目标的一种简单方法。

您可以使用IN运算符来指示WHERE子句的许多值,并将transactiontype的所有可能值作为默认参数

您可以在phpyes中使用if-else,但我如何将其集成到我的查询中?您的代码容易受到
sql注入
attackIt攻击。这并不重要,因为所有mysql信息对用户都是可见的。没有管理面板。我将不得不使用大约100个where子句。这将是非常痛苦的。将带有if-then的查询放在函数中,并使用sql和VAR调用它。这很好,但是如果存在多个条件,那么如何放置and将出现问题
$search="SELECT * from objects WHERE ("" = '$randomvariable' or transactiontype='$randomvariable') order by id DESC";
$sql_statement = "SELECT * FROM ".$table_names." WHERE 1 = 1 ";
if ($array) {
   foreach ($array as $key => $value){  
       $sql_statement .= " AND ".$key." = '".$value."' ";
   }
}