1

我有一个 html 表单,我的用户可以使用它来搜索我的 MYSQL 数据库中的表。默认情况下,如果您只是点击 go,它将显示整个表格,但是我希望他们能够选择某些字段和我的 php 表单以通过填写的字段进行搜索。

如果不为所有 11 个输入以它们可以输入的不同组合编写单独的查询,我似乎无法找到一种方法,总共有 76 个查询。

如果有人有办法简化这一点,我会喜欢任何建议。

我曾尝试使用 AND 运算符运行查询,但这不起作用,因为某些变量可以为空并且不会返回任何结果,不确定这是否是应该发生的,但这就是正在发生的事情。

我的html和php:

http://jsbin.com/oquwid/1/edit

PHP

$sql = "SELECT * FROM  ".$tbl_name." 
WHERE fname='".$fname."' 
and lname='".$lname."' 
and city='".$city."'
and phone='".$pohne."'
and interest_inet='".$internet."'
and interest_tv='".$television."'
and interest_voice='".$voice."'
and submission_ip='".$ip."'
and inquiry_handled='".$handled."'";
$result = mysql_query($sql);

echo "<table border='1'>";
echo "<tr>";
$i = 0;

while ($i < mysql_num_fields($result))
{
    $meta = mysql_fetch_field($result, $i);   
    echo "<th>".$meta->name."</th>";
    $i++;
}

while ($row = mysql_fetch_row($result))
{
    echo '<tr>';

foreach($row as $item)
{
    echo "<td>".$item."</td>";
}

echo '</tr>';
echo $row;
}

echo "</table>";
4

4 回答 4

2

您可以根据填写的内容将部分附加到查询中:

if(!empty($fname) || !empty($lname) || !empty($city) || etc.etc.) {
   $sql = "SELECT * FROM  $tbl_name WHERE ";

   $queryParts = array();
   if($fname  != "") { 
      $queryParts[] = " fname='$fname'";
   }
   if($lname != "") {
      $queryParts[] = " lname='$lname'";
   }
   etc.etc.

   $sql .= implode(" AND ", $queryParts);

   // do query, etc.
}
else {
   // Don't do query if no parameters are specified
}

您还需要确保在使用所有查询参数之前对其进行转义,否则可能会有人破坏您的数据。

以下使用循环来避免重复代码:

$fieldIsSpecified = false;
$queryFields = array('fname' => $fname, 'lname' => $lname, 'city' => $city, etc...);
foreach($queryFields as $column => $value) {
    if(!empty($value){
         $fieldIsSpecified = true;
         break;
    }
}
if($fieldIsSpecified) {
   $sql = "SELECT * FROM  $tbl_name WHERE ";

   $queryParts = array();
   foreach($queryFields as $column => $value) {
      if(!empty($value)) {
          $queryParts[] = " $column = '$value'";
      }
   }

   $sql .= implode(" AND ", $queryParts);

   // do query, etc.
}
else {
   // Don't do query if no parameters are specified
}
于 2013-01-06T22:20:01.430 回答
1

如果未填写值,则查询无效的原因可能是因为查询结果为(假设名字为空)

SELECT * FROM $tbl_name WHERE fname=''

并且可能没有没有名字的用户。

此外,您考虑为每个请求的信息添加一个标志,并在此基础上向查询的选择部分添加或删除所需的部分?

例如,

$sql = "SELECT * FROM $tbl_name WHERE "; 
$queryChanged = false;
if (isset($fname)){
    if (!empty($fname)){
        $sql .= "fname='$fname' ";
        $queryChanged=true;
    }
}
if (isset($lname)){
    if (!empty($lname)){
        $sql .= ($queryChanged) ?  " AND lname='$lname'" : "lname='$lname'";
        $queryChanged = true;
    }
}
... //Continue the logic

我建议你阅读这篇关于 select * 的文章以及关于用户输入和如何处理它的文章

于 2013-01-06T22:19:37.847 回答
0

这就是我必须这样做的方式

php:`

//if just lname is set
if(empty($start_date) && empty($end_date) && empty($fname) && isset($lname) && empty($city) &&
 empty($internet) && empty($television) && empty($voice) && empty($phone) && empty($ip) && 
 empty($handled) && empty($not_handled)){ 
$sql = "SELECT * FROM  ".$tbl_name."
WHERE lname='".$lname."'";
$result = mysql_query($sql);
echo "<table border='1'>";
echo "<tr>";
$i = 0;
while ($i < mysql_num_fields($result))
{
$meta = mysql_fetch_field($result, $i);   
echo "<th>".$meta->name."</th>";
$i++;
}
while ($row = mysql_fetch_row($result))
{
echo '<tr>';
foreach($row as $item)
{
    echo "<td>".$item."</td>";
}   
echo '</tr>';
}
echo "</table>";
exit();
}


//if just city is selected
if(empty($start_date) && empty($end_date) && empty($fname) && empty($lname) && isset($city) &&
 empty($internet) && empty($television) && empty($voice) && empty($phone) && empty($ip) && 
 empty($handled) && empty($not_handled)){ 
$sql = "SELECT * FROM  ".$tbl_name."
WHERE city='".$city."'";
$result = mysql_query($sql);
echo "<table border='1'>";
echo "<tr>";
$i = 0;
while ($i < mysql_num_fields($result))
{
    $meta = mysql_fetch_field($result, $i);   
    echo "<th>".$meta->name."</th>";
$i++;
}
while ($row = mysql_fetch_row($result))
{
    echo '<tr>';
foreach($row as $item)
{
    echo "<td>".$item."</td>";
}   
echo '</tr>';
}
echo "</table>";
exit();
}

等等......我将不得不重复这个过程,直到我涵盖所有,我相信 76 个可能性。thnkfully 它只是大量的复制粘贴。谢谢大家的帮助

于 2013-01-07T03:01:00.340 回答
-1

首先不要使用 MYSQL_ *。使用 PDO

其次,使用您的代码,您需要填写所有字段。

如果你不想这样做,那就这样吧:

您可以使用 WHERE 1=1 ,但不推荐!!!!

 $sql = "SELECT * FROM  ".$tbl_name." WHERE confirm = '0' ";

 $sql .= "AND fname = ".$fname."";
 $sql .= "AND lname = ".$lname."";
 $sql .= "AND city = ".$city."";
 $sql .= "AND phone = ".$pohne."";
 $sql .= "ORDER BY date DESC";
 $result = mysql_query($sql);

 echo "<table border='1'>";
 echo "<tr>";
 $i = 0;

 while ($i < mysql_num_fields($result))
 {
 $meta = mysql_fetch_field($result, $i);   
 echo "<th>".$meta->name."</th>";
 $i++;
 }

 while ($row = mysql_fetch_row($result))
  {
  echo '<tr>';

  foreach($row as $item)
  {
  echo "<td>".$item."</td>";
   }

   echo '</tr>';
   echo $row;
     }

   echo "</table>";
于 2013-01-06T22:23:13.473 回答