我只是想知道是否有一種方法可以在MySQL中使用某種形式的預準備語句,所以我不必逃避所有輸入,也不必從MySQL切換所有文件到MySQLi。我真的不相信轉義函數,因此,如果有任何替代方法在常規MySQL中工作,那就太棒了。MySQL準備好的語句
1
A
回答
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?
0
如果您不想處理轉義輸入,那麼您可以隨時調整它的匹配方式,然後發送預寫的語句。如果你可能執行的語句相對較少,這實在是值得的。
相關問題
- 1. PHP和MySQL準備好的語句
- 2. 準備好了mysql語句和數組
- 3. MySQLi準備好的語句?
- 4. 準備好的MySQLi語句
- 5. PHP MySQL準備好的語句中的語句
- 6. PHP在準備好的語句中準備了語句
- 7. 準備好的語句語法錯誤
- 8. MySQL準備語句nvarchar
- 9. mysql永久準備語句
- 10. mysql準備了語句IFNULL
- 11. MYSQL-PDO準備語句
- 12. JDBC準備好的語句/參考準備在另一個準備好的語句
- 13. 已準備好的語句中的SQLITE_MISUSE
- 14. 已準備好的語句的函數
- 15. 準備好的語句嵌套在另一個準備的語句
- 16. real_escape_string與準備好的語句
- 17. 瞭解PHP準備好的語句
- 18. 準備好的語句更新問題
- 19. 在事務中準備好的語句
- 20. 準備好的語句幫助
- 21. 準備好的語句加入Java
- 22. 使用LIKE與準備好的語句
- 23. MySQLi準備好的語句和事務
- 24. mysqli_real_escape_string AND準備好的語句?
- 25. 創建雄辯準備好的語句
- 26. PHP準備好的語句返回-1
- 27. 如何使用準備好的語句
- 28. 準備好的語句和SQL注入
- 29. SQLite3中的「預先準備好」語句?
- 30. PHP準備好的語句與數組