使用php进行多项标准搜索

时间:2014-02-08 03:10:32

标签: php mysql

我对php / mysql组合比较新。我已经看过这个问题被多次发布但是找不到可以帮助我的答案。 我有一张这样的桌子:

    "CREATE TABLE sample_table (
     id_sample smallint(6) NOT NULL auto_increment, 
     sample1 varchar(20) NOT NULL,
     sample2 varchar(20) default NULL,
     sample3 varchar(20) default NULL,
     sample4 enum('x1','x2','x3') NOT NULL default 'x1',
     ..
     ..
     samplexx varchar(20) default NULL,
     sample_last varchar(20) default NULL, 
     PRIMARY KEY  (`id_sample`)
     );"

是否有用户填写所有必填字段的注册表单。现在我需要做一个“用户搜索”表单,管理员可以通过一个或多个字段搜索用户。

    <form id="sample" name="sample" action="sample.php" method="post">
    <p> Sample1: </p><input type="text" name="sample_f1" id="sample_f1"/> 
    <p> Sample2: </p><input type="text" name="sample_f2" id="sample_f2"/>
    ..
    ..
    <p> Samplexx: </p><input type="text" id="sample_fxx" name="sample_fxx"/>
    <input id="search" name="search" type="submit" value="Search">
    </form>

我不确定我是否正在使用正确的方法解决这个问题,但这是我开始使用php的方式:

    include_once('common.php');
    $dbLink=dbConnect();
    if (isset($_POST['sample']))
    {
      $v[0] = $_POST['sample_f1'];
      $v[1] = $_POST['sample_f2'];
      ..
      ..
      $v[xx] = $_POST['sample_fxx'];
      $temp = "";
      $temp2 = "";
      $counter = 0;
      for ($i=0;$i<xx;$i++)
      {
        if($v[$i] == "" || $v[$i] == "NULL")
        {
          switch ($i)
          {
                case "0":
                $temp = $temp ."sample1,";
                break;
                case "1":
                $temp = $temp ."sample2,";
                break;
                ..
                ..
                case "xx":
                $temp = $temp ."samplexx,";
                break;
           }
         }
         else
         {
           $counter++;
           switch ($i)
           {
                 case "0":
                 $temp2 = $temp2 ."sample1='" .$v[$i] ."'*";
                 break;
                 case "1":
                 $temp2 = $temp2 ."sample2='" .$v[$i] ."'*";
                 break;
                 ..
                 ..
                 case "xx":
                 $temp2 = $temp2 ."samplexx='" .$v[$i] ."'*";
                 break;
           }
         }
       }
       $pieces = explode("*", $temp2);
       $some_var = $pieces[0];
       if($counter>1)
       {
         for ($i=1;$i<$counter;$i++)
         {
           $some_var = $some_var . " AND " .$pieces[$i] ;
         }
       }
       $query = "SELECT " .$temp ."sample_last FROM sample_table WHERE " .$some_var .";";
       $result = mysql_query($query, $dbLink);
       $result_count = mysql_num_rows($result);

所以我的基本想法是将所有字段中的值保存到一个数组中,然后检查哪些字段为空。空场是我正在寻找的,其他是我的标准。我现在的问题是,我不知道我从数据库获得了多少字段/值,也不知道那些字段是什么。现在,对于'多少',我可以使用计数器并将所有数据放入矩阵中,而不是找出将每个数据放在我的'display data div'上的正确位置的方法。

所以我的问题是:

可以通过这种方式完成“多重标准搜索”吗? 要么 你如何做'多标准搜索'?

任何想法,个人经验和/或示例(不一定是实际的程序代码)都非常受欢迎。

此致 Coding_for_fun

我发现你并没有得到我所要求的东西,所以这里有更多的解释(不能发布图片,因为我是新用户)。假设我有七个字段可供我搜索。如果我尝试搜索db中包含字段sample1 = some_value以及字段sample7 = some_value2的所有记录。我的查询不是:

    SELECT sample2,sample3,sample4,sample5,sample6,sample_last FROM sample_table WHERE sample1='some_value' AND sample7='some_value2';

我可以使用

    SELECT * FROM sample_table WHERE sample1='some_value' AND sample7='some_value2';

然后我要求的数据比实际需要的多得多。我希望这有点澄清这个问题。

再一次,我只是在处理这样的高级搜索时,只是询问你的想法/个人经验。它不一定是真正的程序代码。

1 个答案:

答案 0 :(得分:0)

我看到没有人回答这个问题所以我会解决这个问题(我还是希望看到其他想法)。

我在想:如果我能够将所有变量名称和值放入一个数组中以将其作为SQL查询发送,那么必须有一种方法可以将它们从该数组恢复到原始状态。这就是我所做的:(继续前PHP)

  if ($result_count > 0)
  {
    for ($i=0;$i<$result_count;$i++)
    {
        $result_set[$i]=mysql_fetch_row($result);
    }
    $variable_name = explode(",", $temp);
    $new_counter = 7 - $counter; // 7 because I had 7 fields by which user can search
    $variable_name_searched_temp = "";
    $variable_value_searched_temp = "";
    foreach ($pieces as &$piece) 
    {
        $temp = explode("=", $piece);
        $variable_name_searched_temp .= $temp[0] ."*";
    }
    $pieces = array_slice($pieces, 0, -1); //for some reason I had to do this before asking for second part ([1]) of that array
    //if you know why I needed that line of code please give me an explanation in a comment below
    foreach ($pieces as &$piece) 
    {
        $temp = explode("'", $piece);
        $variable_value_searched_temp .= $temp[1] ."*";
    }
    $variable_name_searched = explode("*", $variable_name_searched_temp);
    $variable_value_searched = explode("*", $variable_value_searched_temp);
    for ($i=0;$i<$result_count;$i++)
    {
        for ($j=0;$j<$counter;$j++)
        {
          switch ($variable_name_searched[$j])
          {
            case "sample1":
            $sample1 = $variable_value_searched[$j];
            break;
            case "sample2":
            $sample2 = $variable_value_searched[$j];
            break;
            ..
            ..
            case "samplexx":
            $samplexx = $variable_value_searched[$j];
            break;
          }
        }   
        for ($j=0;$j<$new_counter;$j++)
        {
          switch ($variable_name[$j])
          {
            case "sample1":
            $sample1 = $result_set[$i][$j];
            break;
            case "sample2":
            $sample2 = $result_set[$i][$j];
            break;
            ..
            ..
            case "samplexx":
            $samplexx = $result_set[$i][$j];
            break;
          }
          $sample_last = $result_set[$i][$j+1]; 
        }
        ?>
          <br><p> Sample1:  <?php echo $sample1; ?></p>
          <br><p> Sample2: <?php echo $sample2; ?></p>
          ..
          ..
          <br><p> Samplexx: <?php echo $samplexx; ?></p>
          <br><p> Sample_last: <?php echo $sample_last; ?></p>
        <?php 
    }
  }

我测试了这个并且它有效。当然我仍然需要在我的'display data div'上形成这个,最后的HTML只是检查我的代码是否有效。

你可以在那些评论的行上看到我有一行代码,我不知道为什么要放入。

    $pieces = array_slice($pieces, 0, -1);

正如我所说,我对PHP / MySQL相对较新,所以有人可以向我解释为什么需要它? (如果我评论那行代码我得到错误:未定义的偏移量:1)

再一次......在处理高级搜索时,我仍然希望看到其他想法,所以如果你这样做,请与我分享。

问候,Coding_for_fun。