2014-02-08 99 views
0

我是比较新的PHP/MySQL组合。我已经看过这个问题很多次,但找不到能帮助我的答案。 我有这样一个表:使用php的多个条件搜索

"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); 

所以我的基本想法是,从所有字段保存值到一个数组中,然后检查哪些字段是空的。空场是我正在寻找和其他人是我的标准。我现在的问题是,我不知道从数据库中得到多少字段/值,也不知道那些字段是什么。现在,对于'多少',我可以使用一个计数器并将所有数据放入一个矩阵中,而不是找出将每个数据放到“显示数据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'; 

但后来我问有更多的数据比我的实际需要。我希望这里澄清一下这个问题。

所以再次,我只是在处理像这样的高级搜索时询问您的想法/个人经验。它不一定是实际的程序代码。

+0

让我们看看我是否得到它:例如,如果用户填充一个或多个字段,则您有4个字段,您希望从数据库填充其余字段。是对的吗? –

+0

不完全。我需要从数据库中提取符合条件的所有记录并显示它们,同时保持“搜索表单”可供用户用新条件进行搜索。 – user3286006

+0

什么是您的最终查询添加它在这里给更多的清晰度 – Sundar

回答

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 
    } 
    } 

我测试了这个,它的工作原理。当然,我仍然需要在我的'显示数据div'上形成这个,HTML最后只是检查我的代码是否工作。

您可以在这些注释行我有一行代码,我不知道为什么我不得不把在看。

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

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

再次...我仍然希望在处理高级搜索时看到其他想法,所以如果您以其他方式执行此操作,请分享它与我。

Regards,Coding_for_fun。