我只是想知道是否有一种方法可以在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准备好的语句与数组