Php 从mysql#u查询转换';准备好的报表(mysqli/PDO)有哪些?必要吗?
在过去的几周里,我一直在学习PHP和MySQL,现在我刚刚听说了一些准备好的语句和PDO/mysqli。我读了一些书,人们说:Php 从mysql#u查询转换';准备好的报表(mysqli/PDO)有哪些?必要吗?,php,mysql,pdo,mysqli,sql-injection,Php,Mysql,Pdo,Mysqli,Sql Injection,在过去的几周里,我一直在学习PHP和MySQL,现在我刚刚听说了一些准备好的语句和PDO/mysqli。我读了一些书,人们说: $getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'"); while($row = mysql_fetch_assoc($getFromDatabase)){ stuff(); } …再也不行了。我在代码中经常使用类似的东西。我也读了很多关于准备好的陈述如何更好地防止注射
$getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'");
while($row = mysql_fetch_assoc($getFromDatabase)){
stuff();
}
…再也不行了。我在代码中经常使用类似的东西。我也读了很多关于准备好的陈述如何更好地防止注射的文章。我已经完全理解了它是如何变得更好的,但是它是不是比mysql\u real\u escape\u string()好得多,值得换掉它呢?是否需要切换到Mysqli或PDO?在什么情况下,mysql\u real\u escape\u string()可以在准备好的语句无法绕过的情况下被绕过?这是必要的,因为用软件术语来说,mysql\u query是一个古老的工件。它是MySQL数据库接口的最新版本,笨重、不可靠,如果不完全按照您应该的方式使用,则会非常危险。如果你不够小心,你会犯错误,如果有人在你的网站上使用,即使是一个很小的错误也不会被忽视 基本上,你是在借用mysql\u query的时间 如果您使用
mysqli
或PDO,并且努力使用占位符,那么发生SQL注入错误的风险非常低。可能需要大约半个小时才能弄清楚如何将旧代码转换为这些新方法,实际上没有陡峭的学习曲线,这些知识将在将来为您节省很多麻烦。如果您使用mysqli
和基本占位符,转换现有代码通常不是什么大问题。我敢打赌你在修补东西的时候甚至会发现一些严重的错误
就好处而言,您不需要进行任何mysql\u real\u escape\u string
调用,只需使用bind\u param
,您就不必担心在某个变量上丢失转义。从长远来看,这实际上要少得多
此外,使用?
或像:id
这样的命名占位符可以使查询更易于阅读、调试和维护。此外,您可以重复使用同一语句,并将不同的值绑定到该语句,最终提高应用程序的速度
可以使用
mysql\u query
编写安全代码,但为什么要这样做?该接口被列为已弃用,这是将其从PHP中完全删除的初步阶段。如果您想要一个经得起未来考验的应用程序,最好使用其中一个受支持的接口。它现在可以工作了。。。mysql_*()
函数将面临未来的弃用。建议开始远离它们。准备语句优于mysql\u real\u escape\u string()
的主要原因是您。你可以,而且在某个时候,你会忘记给它打电话。我们都这样做了。$id
周围不应有单引号。这是一个数字,不是字符串文字。您不能引用数字。@DanGrossman那么如果ID是GUID呢?可能是的重复项