2012-02-16 11 views
5

ユーザーがデータベースを検索できるフォームを作成しました。結果はユーザーがフォームに入力する方法によって異なります。
たとえば、名前、住所、市区町村、州、および郵便番号のフィールドがあり、ユーザーが名前と都市のフィールドを入力すると、入力結果が反映されます。フォームが送信されると、すべてのレコードが表示されます。 はこのために私はこれを書く: フォーム内に複数のフィールドを持つMySQLデータベースを検索する

if(isset($_POST['submit'])) { 
     $sql = mysql_query("SELECT * FROM table WHERE name LIKE '%" . $_POST['name'] . "%' 
        OR address LIKE '%" . $_POST['address'] . "%' 
        OR city LIKE '%" . $_POST['city'] . "%' 
        OR state LIKE '%" . $_POST['state'] . "%' 
        OR zip LIKE '%" . $_POST['zip'] . "%'"); 
    } 


     <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>"> 
      <tr> 
       <td>Name:</td> 
       <td><input type="text" name="name" /></td> 
      </tr> 
      <tr> 
       <td>Address:</td> 
       <td><input type="text" name="address" /></td> 
      </tr> 
      <tr> 
       <td>City:</td> 
       <td><input type="text" name="city" /></td> 
      </tr> 
      <tr> 
       <td>State:</td> 
       <td><input type="text" name="state" /></td> 
      </tr> 
      <tr> 
       <td>Zip:</td> 
       <td><input type="text" name="zip" /></td> 
      </tr> 
      <tr> 
       <td>&nbsp;</td> 
       <td><input type="submit" name="submit" value="Search" /></td> 
      </tr> 
     </form> 
    </table> 

    <?php 
     if(isset($_POST['submit'])) { 
      while($row = mysql_fetch_array($sql)) { 
       echo $row['name'] . "<br />"; 
      } 
     } 
    ?> 

しかし、この場合には、ユーザは、フィールドを空白のままにしておくことが

+0

を。 http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-phpを読んでください。 –

答えて

12

このお試しください:ここでのコーディングは、悪意のあるユーザーに対して安全ではありません

if(isset($_POST['submit'])) { 
    // define the list of fields 
    $fields = array('name', 'address', 'city', 'state', 'zip'); 
    $conditions = array(); 

    // loop through the defined fields 
    foreach($fields as $field){ 
     // if the field is set and not empty 
     if(isset($_POST[$field]) && $_POST[$field] != '') { 
      // create a new condition while escaping the value inputed by the user (SQL Injection) 
      $conditions[] = "`$field` LIKE '%" . mysql_real_escape_string($_POST[$field]) . "%'"; 
     } 
    } 

    // builds the query 
    $query = "SELECT * FROM TABLE "; 
    // if there are conditions defined 
    if(count($conditions) > 0) { 
     // append the conditions 
     $query .= "WHERE " . implode (' AND ', $conditions); // you can change to 'OR', but I suggest to apply the filters cumulative 
    } 

    $result = mysql_query($query); 
+0

はい。それは正しい方法です! –

+0

ここのコードは悪意のあるユーザーに対して安全ではありません。 http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-phpを読んでください。 –

+1

私はこの回答が最高と評価されていると評価されていますが、$ _POST ['field']は9行目で$ _POST [$ field]ではないはずですか?私は熟練したphp-erではないので編集したくないし、なぜそれが書かれているのかも知っている。今私はそれを変更しましたが、私はセキュリティホールを開いています(投稿入力は消されています)。 – digitaltoast

関連する問題