1

ユーザーがMYSQLデータベースのテーブルを検索するために使用できるhtmlフォームがあります。デフォルトでは、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();
}

など...可能性のあるすべてをカバーするまで、このプロセスを繰り返す必要があります。ありがたいことに、コピー&ペーストがたくさんあります。みんな助けてくれてありがとう

于 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 に答える