2014-11-25 4 views
-1

나는 교육적인 목적으로 집에서 간단한 웹 사이트를 만들고 있으며 PHP와 MySql을 사용하고 있습니다. wifi-wifi-wifi-wifi-networks가있는 데이터베이스가 있고 데이터베이스에서 SSID-name을 검색하고 네트워크가 내 데이터베이스에 있는지 확인할 수 있습니다. 하지만 검색 결과에서 %%%를 입력하면 데이터베이스의 모든 결과를 얻습니다. 어떻게 멈출 수 있습니까?블록 %%% in MySql 쿼리

내 코드입니다

다음 mysql 문서에서

<form method="post" action=""> 
    <input type="search" name="query" placeholder="Sök efter ditt SSID"/> 
    <input type="submit" name="submit" value="Sök" /> 
    </form> 
    <?php 

    include $_SERVER["DOCUMENT_ROOT"] . "/includes/connect.php"; 

    if(isset($_POST['submit'])){ 

    $db_tb_name="database"; 
    $db_tb_atr_name="ssid"; 

    $query = str_replace('%', '\%', mysql_real_escape_string($_POST['query'])); 

    //If search is longer than x characters... 
    if(strlen($query) >= 3) 
     { 
     //Do mysql query for results 
     $query_for_result=mysql_query("SELECT * FROM $db_tb_name WHERE $db_tb_atr_name like '%".$query."%'"); 

     //If query finds nothing, search is not in databse, echo... 
     if (mysql_num_rows($query_for_result) < 1) 
      { 
      echo "<br /><h3>Ditt SSID finns inte med i databasen</h3>"; 
      } 
     //Else echo table and populate with results 
     else 
      { 
      echo "<br>"; 
      $num_result = mysql_num_rows($query_for_result); 
      echo "<h3>Resultat av sökningen - $num_result träffar</h3>"; 
      echo "<table> 
      <thead> 
      <tr> 
       <th>SSID</th> 
       <th>MAC</th> 
       <th>Kanal</th> 
       <th>Kryptering</th> 
       <th>Algoritm</th> 
       <th>Autentisering</th> 
       <th>Signalstyrka</th> 
       <th>Tillverkare</th> 
      </tr> 
      </thead>"; 

      while($data_fetch=mysql_fetch_array($query_for_result)) 
       { 
       echo "<tr>"; 
        echo "<td>" . substr($data_fetch[ssid], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[mac], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[channel], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[privacy], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[ciper], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[auth], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[power], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[manuf], 0,32) . "</td>"; 
       echo "</tr>"; 
       } 
      echo "</table>"; 
      }    
     } 
    //If search is shorter than x characters, echo... 
    else 
     { 
     echo "<br /><h3>Sökningen måste innehålla minst 3 tecken</h3>"; 
     } 
    } 
    include $_SERVER["DOCUMENT_ROOT"] . "/includes/close_connection.php";   
    ?> 
+0

기본적으로 $ query 특수 문자를 해당 HTML 엔터티 –

+0

str_replace ('%', '\ %', $ query)'로 변환합니다. %는 m_r_e_s()에 의해 이스케이프되지 않습니다. –

+1

거룩한 모든 것에 대한 사랑을 위해서, mysql_ * 함수 대신에 mysqli 또는'PDO'를 사용하십시오. 다음 PHP 버전에서 제거 될 것입니다. –

답변

3

을 (민감한 물건을 제거하려면이 게시물에 대한 약간의 수정) : 당신이 그들을 탈출해야합니다

Character Description 
% Matches any number of characters, even zero characters 
_ Matches exactly one character 

그 때문에 당신의 $ 쿼리 변수.

$query = str_replace(array('%', '_'), array('\%', '\_'), mysql_real_escape_string($_GET['query'])); 

그러나 아직 PHP 5.5.0부터는 mysql_ * 함수를 사용하지 않는 것이 좋습니다. mysql_ * 함수는 더 이상 사용되지 않습니다. 그 때문에 mysqli 또는 pdo을 대신 사용해 보시기 바랍니다.

나는 교육적인 목적으로 언급 했으므로 이미 알고 있을지 모르지만 나는 아직도 지적하고 싶다.

+1

니스,이 작품! 예. 더 많이 읽었습니다. "오래된 방법"이 더 이상 사용하기가 좋지 않음을 알기 시작했습니다. 곧이를 바꿀 계획입니다. 동일한 페이지로만 쿼리를 보내는 중입니다. 여전히 문제가 있습니까? – Frigol33t

+0

당신의 종류가 $ _GET [ 'query']라고 가정 된 완전한 쿼리였습니다. 그래서 그렇게 큰 문제는 아닙니다. 그러나, 나는 당신이 폼의 메소드 대신 POST를 사용하도록 조언하고 싶다. 궁극적으로 귀하의 URL을 통해 암호를 보내는 것을 원하지 않습니다. – Seunhaab

+0

이제 POST로 변경되었습니다. %%%를 더 이상 검색 할 수 없지만 세 가지 _ 대신 모든 결과를 제공하십시오./ – Frigol33t