【问题标题】:SQL statements where value could be nothing (empty)值可以为空(空)的 SQL 语句
【发布时间】:2012-08-22 14:14:50
【问题描述】:

我有一些搜索功能,它允许用户从下拉列表中选择一个名字,或者在搜索字段中输入一个人名或其中的一部分(通配符功能)。

我遇到的问题是,如果使用下拉选项,则搜索字段将不会出现,反之亦然。

我尝试了一些 SQL 如下(请注意变量代表通过表单发送的数据):

SELECT id, name, age FROM player
    WHERE player.id = '$id'
        OR player.name LIKE '%$text%'

当使用上述通配符功能时,可以正常工作。

但是,如果您从下拉列表中选择一个玩家,则会返回所有玩家。这是因为$text 的值是空的(空),而 LIKE '%%' 表示选择所有内容,因此它会选择所有名称。

然后我尝试了以下方法:

SELECT id, name, age FROM player
    WHERE player.id = '$id'
        AND player.name LIKE '%$text%'

现在下拉功能按预期工作,但通配符搜索不起作用。这是因为我假设 AND 要求两个语句都为真,并且因为 $id 在仅指定通配符条目时什么都不是(空),条件永远不会为真。

谁能帮我用一些 sql 来确保下拉列表和通配符搜索彼此隔离?

提前感谢您的时间和帮助。

【问题讨论】:

  • 如果您通过 PHP 生成 SQL,为什么不添加一个 if 语句来检查并查看选择了哪些参数,然后将适当的文本添加到 WHERE 子句?
  • 我认为 $id 如果下拉,则通过 $text 如果文本输入?
  • 以防万一您使用mysql_* 函数(根据您的代码,它看起来像您):它可能无助于回答您的问题,但您应该停止使用mysql_* 函数。它们正在被弃用。请改用PDO(PHP 5.1 起支持)或mysqli(PHP 4.1 起支持)。如果您不确定使用哪一个,read this article
  • @matt 不,我正在使用 PDO,所以不用担心
  • 然后使用代码 $text="%".$text."%"; SELECT id, name, age FROM player WHERE player.id = '$id' OR player.name LIKE '%$text%'

标签: php sql


【解决方案1】:
$params = ''

if($id !== ''){
  $params = "player.id = '$id'";
} else if($text !== ''){
  $params = "player.name LIKE '%$text%'";
}

$sql = "SELECT id,name,age FROM player WHERE {$params}";

mysql_query($sql);  //if using mysql_ 

【讨论】:

    【解决方案2】:

    有条件地需要id

    $idCondition = "";
    if ($id) {
        $idCondition = "player.id = '$id' AND ";
    }
    
    $query = "SELECT id, name, age FROM player WHERE {$idCondition}player.name LIKE '%$text%'";
    

    【讨论】:

      【解决方案3】:
      "SELECT id, name, age FROM player
      WHERE (player.id = '$id' AND '$id' <> '')
          OR (player.name LIKE '%$text%' AND '$text' <>'')"
      

      【讨论】:

        猜你喜欢
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多