2013-04-07 131 views
0

我有一個關於涉及搜索表單用PHP/MySQL的擺脫MySQL的搜索字符串PHP

考慮以下最佳實踐的問題:

  • 一個搜索表單搜索書名
  • 這個jQuery/AJAX請求以「自動建議」標題
  • 需要逃脫以及如何?

它連接到數據庫MySQL的用戶只有此刻的SELECT特權,但我可能會添加在將來INSERT特權(因此注射潛力)。

搜索表單很簡單,如這樣的:

<form id="search" method="GET" action="/search/"> 
    <input type="text" value="" id="s" name="s" /> 
</form> 

的形式通過GET發送到search.php?s=Search Query。一旦出現,PHP文件是類似如下:

<?php 

    $s = $_GET['s']; // the search request 

    $search = new Search($s); // creates new search object and sends the $s query 

    echo $search->output; // returns results 

?> 

我的搜索類有以下幾點:

class Search { 

    // Database stuff omitted 

$stmt->bindParam(':search', $this->query, PDO::PARAM_STR) 
$stmt->execute; 
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 
$this->output = $res; 

} 

我的SQL查詢是這樣的:SELECT booktitle FROM books WHERE booktitle LIKE '%:search%'

我可能會得到什麼樣的問題進?你有什麼需要逃避和在哪裏的建議?你看到我的設置有潛在的問題嗎?諸如sql注入等問題?

回答

2

參數在準備好的PDO語句中自動轉義,你做得對。

只是注意到,你並不需要在您的查詢報價:

$stmt = $myPDO->prepare("SELECT booktitle FROM books WHERE booktitle LIKE :search"); 
$stmt->bindParam(':search', "%".$this->query."%", PDO::PARAM_STR); 
$stmt->execute(); 

或者更簡單:

$stmt = $myPDO->prepare("SELECT booktitle FROM books WHERE booktitle LIKE ?"); 
$stmt->execute(array("%".$this->query."%")); 

更多信息:Are PDO statements automatically escaped?

+0

感謝您的回覆,你的想法。 – 2013-04-07 17:24:20