【问题标题】:PHP- MySQL Search CriteriaPHP- MySQL 搜索条件
【发布时间】:2012-02-06 06:07:33
【问题描述】:

我开发了一个包含多个字段的数据库——大约 65 个字段。我希望为我的用户提供多个搜索条件,即通过在下拉菜单中选择各种字段名称。我无法通过使用简单的 IF-ELSEIF-ELSE 语句来执行它。它只给出第一个 IF 语句的结果,而忽略其余的。

下面是html页面:

<form name="frm" action="search_plants.php" method="get">
            <table>
                <tr>
                    <td width="155" height="24">Select Scientific Name:</td>
      <td width="275">
                        <select name="spnm" size="1">       
                        <option value="0">  All</option>    
                        <option value="Abrus precatorius">  Abrus precatorius</option>  
                        <option value="Abutilon indicum">  Abutilon indicum</option>                    
                        <option value="Abutilon theophrasti"> Abutilon theophrasti</option>                 



                        </select>
                        </td>
              </tr>
                <tr>
                    <td>Select Family Name:</td>
                    <td>
                        <select name="fmnm" size="1">   
                        <option value="0">  All</option>
                        <option value="Fabaceae">Fabaceae</option>
                        <option value="Malvaceae">Malvaceae</option>
                        <option value="Mimosaceae">Mimosaceae</option>                      

                        </select>
                    </td>
                </tr>
                <tr>
                    <td>Select Geographic Location:</td>
                    <td>
                        <select name="znm" size="1">                    
                        <option value="0">  All</option>
                        <option value="North Gujarat">North Gujarat</option>
                        <option value="South Gujarat">South Gujarat</option>
                        <option value="South East Gujarat">South East Gujarat</option>      
                        <option value="Central Gujarat">Central Gujarat</option>
                        <option value="Kachchh">Kachchh</option>
                        <option value="Saurashtra">Saurashtra</option>

                        </select>
                    </td>
                </tr>
                <tr>
                <tr>
                    <td>Select Marker:</td>
                    <td>
                        <select name="pnm" size="1">                    
                        <option value="0">  All</option>
                        <option value="rbcL">rbcL</option>      
                        <option value="psbA-trnH">psbA-trnH</option>    
                        <option value="matK">matK</option>  
                        <option value="rpoC1">rpoC1</option>    
                        <option value="ITS2">ITS2</option>  
                        <option value="ycf5">ycf5</option>      

                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" value="Go" name="action">
                        <label>
                        <input type="reset" name="Reset" id="button" value="Reset">
                        </label>                        </td>
                </tr>
            </table>
        </form>

而表单动作页面如下,只描绘了整个编码的一部分。我想给用户一个选择任何/所有字段的选项,并能够通过从数据库中进行选择性搜索来显示它。请帮帮我。

if (($species == 0) || ($family == 0) || ($zones ==0 ) || ($marker == 0))   
    {
        if(($species==0) && ($family==0) && ($zones==0))
        {
            $sql="SELECT * FROM `ncbi_bold_ plants` WHERE Marker LIKE '$marker%'" ;
        }

        elseif($species==0 &&  $family==0 &&  $marker==0)
        {
        $sql="SELECT * FROM `ncbi_bold_ plants` WHERE Zones LIKE '%$zones%'";
        }

        elseif($family==0 &&  $zones==0 &&  $marker==0)
        {
        $sql="select * from `ncbi_bold_ plants` where Speciesname like '$species%'";

        }

        elseif($species==0 &&  $zones==0 &&  $marker==0)
        {
            $sql="select * from `ncbi_bold_ plants` where Family like '$family%'";

        }
    /*
    elseif($species==0 && $marker==0)
    {
        $sql="select * from `ncbi_bold_ plants` where Family like '$family%' AND Zones like '%$zones%'";
        $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");
    }       
    elseif($family==0 && $zones==0 && $marker==0)
    {
        $sql="select * from `ncbi_bold_ plants` where Speciesname like '$species%'";
        $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");
    }
    elseif($species==0 && $family==0)
    {
        $sql="select * from `ncbi_bold_ plants` where Zones like '%$zones%' AND marker like '$marker%'";
        $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");
    }
    elseif($species==0 && $zones==0)
    {
        $sql="select * from `ncbi_bold_ plants` where Family like '$family%' AND marker like '$marker%'";
        $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");
    }
    elseif($species==0 && $marker==0)
    {
        $sql="select * from `ncbi_bold_ plants` where Family like '$family%' AND Zones like '%$zones%'";
        $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");
    }
    */          
        else
        {
        $sql="SELECT * FROM `ncbi_bold_ plants` " ;
        }

    }

    else 
    {
        $sql="select * from `ncbi_bold_ plants` where Speciesname like '$species%' and Family like '$family%' and Zones like '%$zones%' and Marker like '$marker%'";


    }

    $search_sql=mysql_query($sql) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$sql}");

请帮助我。我在 if 语句中找不到缺陷。

【问题讨论】:

  • 您能否尝试手动输入一些$species$family$zones$marker 并打印出结果$sql?例如(0,1,1,1) (将给出 "SELECT * FROM nci_bold_ 植物"), (0,0,0,1), (0,1,0,0), ...
  • 实际上我已经通过下拉菜单给出了这些值,通过在下拉菜单中获取这些 0,1 等值-->“选项”值。
  • 然后尝试在if 语句之前打印出您的$species$family 等,并带有相应的输出$sql,这样您就可以验证是否确实发生了错误(错误不符合句法的最难追踪)。
  • 我确实尝试过,它准确地打印了特定的物种名称。我认为是 IF 语句本身存在一些问题。
  • 你能用这些测试的输出编辑你的问题吗?这样我们也可以验证? (与相应的 $sql)。

标签: php mysql search


【解决方案1】:

试试这个简单的功能:

function create_query($p_species, $p_family, $p_zones, $p_marker) {
  $options = array(
    'Speciesname' => $p_species,
    'Family' => $p_family,
    'Zones' => $p_zones,
    'Marker' => $p_marker
    );
  $cond = '';
  $noopt = true;
  foreach ($options as $column => $value) {
    if ($value !== 0) {
      $noopt = false;
      if ($cond != '') $cond .= ' AND ';
      $cond .= "$column LIKE '%$value%'";
      }
    }
  return $noopt ? false : "SELECT * FROM ncbi_bold_ plants WHERE $cond;";
  }

如果所有参数都为零,此函数返回false,否则返回查询字符串。

示例 #1:

$species = 'spectest';
$family = 0;
$zones = 'zonestest';
$marker = 0;

echo create_query($species, $family, $zones, $marker);

输出:

SELECT * FROM ncbi_bold_ plants WHERE Speciesname LIKE '%spectest%' AND Zones LIKE '%zonestest%';

示例 #2:

$species = 0;
$family = 0;
$zones = 0;
$marker = 0;

var_dump(create_query($species, $family, $zones, $marker));

输出:

bool(false)

或者,如果您想返回不带条件的查询字符串而不是 false,只需将函数中的 return 行替换为:

return $noopt ? "SELECT * FROM ncbi_bold_ plants;" : "SELECT * FROM ncbi_bold_ plants WHERE $cond;";


现在,如果您想使用大量 IF、ELSEIF 和 ELSE 语句以您的方式执行此操作,则有以下解决方案:

没有功能的解决方案

(它的工作方式与上面的函数相同):

  if ($species == 0 && $family == 0 && $zones == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants";
    }
  elseif ($species == 0 && $family == 0 && $zones == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Marker LIKE '$marker%'";
    }
  elseif ($species == 0 && $family == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Zones LIKE '$zones%'";
    }
  elseif ($species == 0 && $zones == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Family LIKE '$family%'";
    }
  elseif ($family == 0 && $zones == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%'";
    }
  elseif ($species == 0 && $family == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Zones LIKE '$zones%' AND Marker LIKE '$marker%'";
    }
  elseif ($species == 0 && $zones == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Family LIKE '$family%' AND Marker LIKE '$marker%'";
    }
  elseif ($species == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Family LIKE '$family%' AND Zones LIKE '$zones%'";
    }
  elseif ($family == 0 && $zones == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Marker LIKE '$marker%'";
    }
  elseif ($family == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Zones LIKE '$zones%'";
    }
  elseif ($zones == 0 && $marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Family LIKE '$family%'";
    }
  elseif ($species == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Family LIKE '$family%' AND Zones LIKE '$zones%' AND Marker LIKE '$marker%'";
    }
  elseif ($family == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Zones LIKE '$zones%' AND Marker LIKE '$marker%'";
    }
  elseif ($zones == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Family LIKE '$family%' AND Marker LIKE '$marker%'";
    }
  elseif ($marker == 0) {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Family LIKE '$family%' AND Zones LIKE '$zones%'";
    }
  else {
    $sql = "SELECT * FROM ncbi_bold_plants WHERE Speciesname LIKE '$species%' AND Family LIKE '$family%' AND Zones LIKE '$zones%' AND Marker LIKE '$marker%'";
    }

  // here you have your $sql ... now do whatever you want with your query
  echo $sql;

此代码已针对所有可能的情况进行了测试,因此如果仍然无法正常工作,则说明您的问题不在您上面发布的 PHP 示例中。我不推荐这种方式,因为这是完全错误的方法,即使对于初学者也是如此。

如果您仍想使用 IF/ELSE/ELSEIF 进行设置,请考虑条件检查 IF 变量不等于零。你会得到更少的代码和更容易的实现。像这样的:

不同的方法

$species = 0;
$family = 0;
$zones = 0;
$marker = 0;

// default query w/out conditions
$sql = "SELECT * FROM ncbi_bold_plants";

// conditions array
$conditions = array();

// adding condition to array for every parameter <> 0
if ($species != 0) $conditions[] = "Speciesname LIKE '$species%'";
if ($family != 0) $conditions[] = "Family LIKE '$family%'";
if ($zones != 0) $conditions[] = "Zones LIKE '$zones%'";
if ($marker != 0) $conditions[] = "Marker LIKE '$marker%'";

// all we need now is to concatenate array elements with " AND " glue
$sql_cond = join(" AND ", $conditions);

// last thing, adding condition(s) to the main query (if there's any)
if ($sql_cond != '') $sql .= " WHERE $sql_cond";

// let see what we have now
echo $sql;

前 4 行仅用于测试。现在,我们的解决方案与之前的解决方案相同,但代码更少(仅 8 行)。

希望这会有所帮助。

【讨论】:

  • thnx ,但我仍然无法通过.. :( 有什么方法可以简单地修改我的 IF 语句?我已经编辑了我的代码,请给我进一步的指导.
  • @Snids,您必须重新编写代码,因为此示例中有很多逻辑错误。第一个 IF 几乎适用于所有条件,这就是它跳过其余代码的原因。您的第一个(初始 IF)检查 4 个语句中的任何一个是否为 0,这没关系,但请查看以下 IF。如果 $species、$family 和 $zones 为 0 并且不检查 $marker 变量的状态,if(($species==0) &amp;&amp; ($family==0) &amp;&amp; ($zones==0)) 会为您提供结果查询。所以每次你有任何作为 $marker 的值时它都会触发。你把它弄得如此复杂,没有人喜欢阅读数英里的代码。
  • 另外,如果你想用 IF、ELSE、ELSEIF 来实现,你应该从最大可能的条件开始(其中所有 4 个变量都是 0,而不是检查 3 的组合,而不是检查对,并且在结束检查单个值。这是这样做的唯一方法。你的方法完全错误,所以我建议使用函数来使你的代码尽可能短。
  • 嘿,我非常感谢您的努力,但我不知道哪里出了问题。我也尝试了该功能,但没有给出预期的结果。我检查了 IF 编码,逻辑上它绝对正确,但是在处理时,它以某种方式跳过了其余的 IF 语句,并且只使用了第一个,(也在函数中).. 有什么帮助吗?请。!
  • 你最后的方法我发现最准确,但仍然只需要无条件语句:(
【解决方案2】:

为什么不从字段中创建动态下拉菜单?例如。 (我在我自己的页面上使用它,您必须相应地编辑 SQL 语法/查询

echo "\n\t<select name='cat'>";
echo "\n\t\t<option value=''>Search all...</option>";
$connect = mysql_connect( <connection settings> );
$ctgTableCmd = "SELECT name FROM offliner.ctgtable ORDER BY name ASC";
$getCtg = mysql_query( $ctgTableCmd );
while( $ctgTable = mysql_fetch_array( $getCtg ) )
{
    $ctgVal = $ctgTable[0];
    echo "\n\t\t<option value=$ctgTable[0]>" . ucfirst( $ctgTable[0] ) . "</option>";
}

【讨论】:

  • 问题是我不希望它只用于一个字段,一次搜索 4 个字段,即:物种、属、区域和标记。请详细一点,因为我对此很陌生。
【解决方案3】:
try using following approach

if($species)
{
  $colum='Species';
  $val=$family;
}
else
if($family)
{
  $colum='Family';
  $val=$family;
}
else
if($zones)
{
  $colum='Zones';
  $val=$zones;
}
else
if($marker)
{
  $colum='Marker';
  $val=$marker;
}
else
{
$column='';
$val='';

}

$sql="SELECT * FROM `ncbi_bold_ plants` WHERE $column LIKE '%".$val."%'" ;

【讨论】:

  • 字段“$colum='Zones';”和其他人对特定区域进行了特定搜索。我在其他 html 页面中提供了一个下拉菜单,用于选择特定字段
【解决方案4】:

你可以这样做。首先为自己定制:

<?php
$where = '';
if(isset($_POST))
{
    foreach($_POST as $k=>$v)
    {
        $q[] = $k.' LIKE \'%'.$v.'%\'';
    }
    $where = implode(' AND ',$q);
}
if(!empty($where))
    $sql = 'SELECT * FROM `ncbi_bold_ plants` WHERE '.$where;
else
    $sql = 'SELECT * FROM `ncbi_bold_ plants`"; 
    ......
    ......

【讨论】:

  • 嗯,我是个新手,不太明白你想说什么。此代码对多个搜索条件有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
相关资源
最近更新 更多