【问题标题】:PHP & MYSQL: How can i neglect empty variables from selectPHP & MYSQL:我如何忽略选择中的空变量
【发布时间】:2011-07-09 04:17:05
【问题描述】:

如果我有 4 个变量并且我想从数据库中选择 DISTINCT 值

<?php
$var1 = ""; //this variable can be blank
$var2 = ""; //this variable can be blank
$var3 = ""; //this variable can be blank
$var4 = ""; //this variable can be blank

$result = mysql_query("SELECT DISTINCT title,description FROM table WHERE **keywords ='$var1' OR author='$var2' OR date='$var3' OR forums='$var4'** ");

?>

注意:部分或所有变量 ($var1,$var2,$var3,$var4) 可以为空

我想要什么: 我想忽略空白字段

假设 $var1 (keywords) 为空,它将选择所有空文件,但我希望 $var1 为空,结果会是这样的

$result = mysql_query("SELECT DISTINCT title,description FROM table WHERE author='$var2' OR date='$var3' OR forums='$var4' ");

如果 $var2 为空,结果会是这样的

$result = mysql_query("SELECT DISTINCT title,description FROM table WHERE keywords ='$var1' OR date='$var3' OR forums='$var4' ");

如果 $var1 和 $var2 为空,结果会是这样的

$result = mysql_query("SELECT DISTINCT title,description FROM table WHERE date='$var3' OR forums='$var4' ");

等等

【问题讨论】:

标签: php mysql


【解决方案1】:

试试这个。


$vars = array(
  'keywords' => '', // instead of var1
  'author' => '',  // instead of var2
  'date' => '', // instead of var3
  'forums' => '', // instead of var4
);

$where = array();
foreach ($vars as $varname => $varvalue) {
  if (trim($varvalue) != '') $where[] = "`$varname` = '" . mysql_real_escape_string($varvalue) . "'";
}
$result = mysql_query("SELECT DISTINCT title, description FROM table WHERE " . join(" OR ", $where));

【讨论】:

  • 抱歉,没有 +1,因为 $$ 语法很糟糕,是设计选择不当造成的。
  • 谢谢 Dimitry Z .. 但你忘了 [)] 在最后一行我试过了,但它让我的本地主机崩溃了两次
【解决方案2】:

非常感谢每一个人experimentX ..您的回答帮助我获得了正确的功能p>

$vars = array(
        (!empty($_GET["var1"]))? " keyword = '". $_GET["var1"] ."' ": null, 
        (!empty($_GET["var2"]))? " author  = '". $_GET["var2"] ."' ": null,
        (!empty($_GET["var3"]))? " date    = '". $_GET["var3"] ."' ": null,
        (!empty($_GET["var4"]))? " forums  = '". $_GET["var4"] ."' ": null
    );


function myfilterarray($var)
{
    return !empty($var)?$var: null;
}

$newvars = array_filter($vars, 'myfilterarray');

$where = join(" OR ", $newvars);

$sql = "SELECT DISTINCT title, description FROM table ".(($where)?"WHERE ".$where: null);

echo $sql;

如果有空变量,这个函数会被忽略

再次感谢大家的有益建议

【讨论】:

    【解决方案3】:

    在调用 mysql_query(...) 之前创建您的 select 语句字符串,因此请按照以下内容执行操作:

    $queryString = "Select DISTINCT title, description FROM table WHERE";
    if(!empty($var1))
       $queryString .= " keywords = $var1";
    

    等等所有变量。您还可以实现一个 for 循环并循环通过您的 $var1 - $var# 并检查 !empty($var#)

    【讨论】:

    • 我认为有一个简单的方法,问题将出在 (OR) 上,如果我有很多变量,这将无效
    【解决方案4】:

    为什么不简单地构建一个 if else 结构? 喜欢

    if ($var1!="" && $var2!="" && $var3!="" && $var4!=""){
       $result = mysql_query("SELECT DISTINCT title,description FROM table WHERE keywords ='$var1' OR author='$var2' OR date='$var3' OR forums='$var4' ")
    } else if ($var2!="" && $var3!="" && $var4!=""){
       $result = mysql_query("SELECT DISTINCT title,description FROM table WHERE author='$var2' OR date='$var3' OR forums='$var4' ");
    } else if {
    ...
    }
    

    【讨论】:

    • 所以基本上你在复制大量代码,并且有 2^4 = 16 种可能的组合。如果有 5 个变量,则有 32 个组合,依此类推。
    • 是的,我刚刚意识到需要检查所有可能的情况。
    • 我正在使用这种方式,我发现这将是一种有效的方式,我需要编写糊状案例让我们举个例子 1 - 当 $var1 为空而其他不为空时 2 - 当 $var2 为空时和其他不为空 3 - 当 $var3 为空且其他不为空 4 - 当 $var4 为空且其他不为空 5 - 当 $var1 和 $var2 为空且其他不为空 6 - 当 $var1 和 $var3 为空且其他不为空等。
    • 我的意思是(这不是一个有效的方法)
    【解决方案5】:

    (我刚刚在他的重复帖子中发布了以下内容,所以我在这里重新发布以下内容)

    如果有任何问题,请原谅我,现在已经很晚了,我只是在 Windows 上的记事本中输入了这个,没有测试环境。 * 谨慎使用 * :)

    $vars = array(
    'blah1' => '',
    'blah2' => '',
    'blah3' => '',
    );
    
     $sql_statement = "SELECT first, last FROM names WHERE";
    
     $clause = "";
     foreach($vars as $k=$v)
    {
    $k = trim($k);
    if(!empty($k))
    {
        $clause .= " `$k` = '$v' OR";
    }
    }
    $clause = rtrim($clause, "OR");
    
    // $clause should have what you want.
    

    【讨论】:

      【解决方案6】:

      嗯,有很多方法可以做到这一点,但我发现最短的方法是创建以下形式的数组

      $vars = array(
              (isset($_GET["var1"]))? " keyword = '". $_GET["var1"] ."' ": null, 
              (isset($_GET["var2"]))? " author  = '". $_GET["var2"] ."' ": null,
              (isset($_GET["var3"]))? " date    = '". $_GET["var3"] ."' ": null,
              (isset($_GET["var4"]))? " forums  = '". $_GET["var4"] ."' ": null
          );
      
      function myfilterarray($var)
      {
          return !empty($var)?$var: null;
      }
      
      $newvars = array_filter($vars, 'myfilterarray');
      
      $where = join(" OR ", $newvars);
      
      $sql = "SELECT DISTINCT title, description FROM table ".(($where)?"WHERE ".$where: null);
      
      echo $sql;
      

      http://localhost/?var1=sadfsadf&amp;var2=sadfasdf&amp;var3=asdfasdf 的结果

       SELECT DISTINCT title, description FROM table WHERE keyword = 
       'sadfsadf' OR author = 'sadfasdf' OR date = 'asdfasdf' 
      

      http://localhost/? 的结果

      SELECT DISTINCT title, description FROM table 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 2021-08-21
        • 2019-10-09
        • 1970-01-01
        • 2017-05-13
        • 2023-01-12
        • 1970-01-01
        相关资源
        最近更新 更多