Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从mysql#u查询转换';准备好的报表(mysqli/PDO)有哪些?必要吗?_Php_Mysql_Pdo_Mysqli_Sql Injection - Fatal编程技术网

Php 从mysql#u查询转换';准备好的报表(mysqli/PDO)有哪些?必要吗?

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(); } …再也不行了。我在代码中经常使用类似的东西。我也读了很多关于准备好的陈述如何更好地防止注射

在过去的几周里,我一直在学习PHP和MySQL,现在我刚刚听说了一些准备好的语句和PDO/mysqli。我读了一些书,人们说:

$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呢?可能是的重复项