2013-07-17 49 views
-1

我使用MySQL像這樣執行刪除查詢潛在的不良數據:如何從PHP和MySQL的PDO

public function query($query, $params = array(), $format = array()) { 

    if (!is_array($params)) return false; 

    $dbh = parent::$dbh; 

    if (empty($dbh)) return false; 

    $stmt = $dbh->prepare($query); 

    if (!empty($format)) { 
     $values = array_values($params); 
     foreach ($format as $key => $bind) { 
      switch ($bind) { 
       case '%d': 
        $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_INT); 
        break; 
       case '%s': 
        $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_STR); 
        break; 
       default: 
        $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_STR); 
        break; 
      } 

     } 
    } 

    $stmt->execute($params); 

    return $stmt; 

} 

我怎樣才能安全地使用LIKE搜索中刪除無效字符:

例如:

$filter = "filter's"; 

if (isset($filter)) { 
    $search_filter = 'content LIKE \'%'.$filter.'%\''; 

    $sql = "SELECT $search_filter FROM messages"; 

    $stmt = $this->query($sql); 
} 
+0

你可以'$ search_filter ='content like'。$ dbh-> quote(「%」。$ filter。「%」);' – Orangepill

+0

@Orangepill恐怕你沒有得到這個問題。 –

+0

http://stackoverflow.com/questions/3683746/escaping-mysql-wild-cards – bitWorking

回答

1

最簡單的方法是使用PDO ::報價

變化$ search_field

$search_filter = 'content like '.$dbh->quote("%".$filter."%"); 

如果你想要移動到參數化查詢任務,你會做

$sql = "select * from messages where content like ?"; 
$params = "%".$filter."%"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute($params); 
+0

使用'$ dbh-> quote()'應該是最後的手段。參數化查詢是要走的路。 – tadman

2

我不知道我下面你的複雜的代碼,但這樣的事情

$filter = "filter's"; 

$params = array(); 
$sql = "SELECT * FROM messages"; 
if (isset($filter)) { 
    $sql .= ' WHERE content LIKE ?'; 
    $params[] = "%$filter%"; 
} 
$stmt = $this->query($sql, $params); 

這個想法是動態創建帶佔位符的查詢,但保留所有可變部分僅通過佔位符。