无法从sql表中提取数据

时间:2013-01-06 22:02:41

标签: php html mysql sql

我有一个html表单,我的用户可以使用它来搜索我的MYSQL数据库中的表。 默认情况下,如果你只是点击它将显示整个表,但我希望他们能够选择某些字段和我的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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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

我建议您阅读this post about select *以及this about user input and how to handle it

答案 2 :(得分: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我相信,可能性。它只是很多复制粘贴。感谢大家的帮助

答案 3 :(得分:-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>";