tl/dr
总是。100%的时间,使用它。总是;即使您不需要使用它。仍然使用它。
mysql_*
函数已弃用。(注意到大红色方框了吗?)
警告此扩展在 PHP 5.5.0 中被弃用,在 PHP 7.0.0 中被删除。相反,应使用 MySQLi 或 PDO_MySQL 扩展。有关更多信息,另请参阅MySQL:选择API指南和相关常见问题解答。此功能的替代方法包括:
你最好使用PDO
或MySQLi
。使用预准备语句时,这 2 个
中的任何一个都足以作为兼容的库。
在没有准备好的陈述/消毒的情况下信任用户输入就像把你的车留在一个糟糕的街区,解锁,钥匙在点火中。你基本上是在说,来吧,拿走我的好东西
你永远不应该,我的意思是永远不要相信用户输入。除非你想要这个:
在引用数据并存储数据时,如注释中所述,您永远不能也不应该信任任何与用户相关的输入。除非你 101% 确定用于操作所述数据库/值的数据已硬编码到你的应用中,否则你必须使用预准备语句。
现在来看看为什么应该使用预准备语句。这很简单。防止SQL注入,但以最直接的方式。预准备语句的工作方式很简单,它将查询和数据一起发送,但分开(如果这有意义,哈哈) - 我的意思是:
Prepared Statements
Query: SELECT foo FROM bar WHERE foo = ?
Data: [? = 'a value here']
与它的前身相比,在前身中,您用数据截断了查询,将其作为一个整体发送 - 反过来,这意味着它是作为单个事务执行的 - 导致SQL注入漏洞。
下面是一个伪示例,向您展示预准备语句/绑定的简单性。PHP PDO
$dbh = PDO(....); // dsn in there mmm yeahh
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
摘自 PHP 手册,用于 PDO 预准备语句
更多阅读