2011-06-16 169 views
1

我只是想知道是否有一種方法可以在MySQL中使用某種形式的預準備語句,所以我不必逃避所有輸入,也不必從MySQL切換所有文件到MySQLi。我真的不相信轉義函數,因此,如果有任何替代方法在常規MySQL中工作,那就太棒了。MySQL準備好的語句

回答

7

使用PDO (PHP Data Objects)連接到您的MySQL數據庫。此方法將確保所有數據庫輸入始終被視爲文本字符串,並且您將永遠不必執行任何手動轉義。

這結合正確使用html_entities()來顯示數據您的數據庫是一個可靠的方法來保護您的網頁免受注入。我總是使用PDO來處理我的項目中的所有數據庫連接。

創建數據庫對象(在這種情況下執行特定的字符編碼):

try { 
    $db = new PDO("mysql:host=[hostname];dbname=[database]",'[username]','[password]'); 
    $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8"); 
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
    $db->exec('SET NAMES utf8'); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

然後使用它像這樣:

$id = 1; 
$q = $db->prepare('SELECT * FROM Table WHERE id = ?'); 
$q->execute(array($id)); 
$row = $q->fetch(); 
echo $row['Column_1']; 

$q = $db->prepare('UPDATE Table SET Column_1 = ?, Column_2 = ? WHERE id = ?'); 
$q->execute(array('Value for Column_1','Value for Column_2',$id)); 

,並用通配符:

$search = 'John'; 
$q = $db->prepare('SELECT * FROM Table WHERE Column_1 LIKE ?'); 
$q->execute(array('%'.$search.'%')); 
$num = $q->rowCount(); 
if ($num > 0) { 
    while ($row = $q->fetch()) { 
    echo $row['Column_1']; 
    } 
} else { 
    echo "No hits!"; 
} 

瞭解更多:

How can I prevent SQL injection in PHP?

When *not* to use prepared statements?

how safe are PDO prepared statements

http://php.net/manual/en/book.pdo.php

0

如果您不想處理轉義輸入,那麼您可以隨時調整它的匹配方式,然後發送預寫的語句。如果你可能執行的語句相對較少,這實在是值得的。