2012-06-19 83 views
0

我想知道MySQL PREPARE/EXECUTE子句和PHP mysqli prepare/execute方法是否有区别?在预防注射方面是好还是坏?MySQL准备vs PHP mysqli准备

我很好奇,因为我写了几个数据库存储过程和一个表和属性不知道汇编。我可以以静态方式写入数据,但是查询有点复杂,并且会使用很多控制逻辑来扩大程序。这让我想到了这一点,但我只是想知道,如果当我只需要一个简单的声明时,我会用动态SQL编写一个简短的过程,或者只是准备并绑定到PHP,是否会更好。

而且我道歉,如果这是一个重复,并当然会欢迎一个链接到一个已经回答SO问题。但是,我总体上看起来像谷歌,并没有真正找到一个具体答案的方式。

+0

[概述 - PHP手册](http://de3.php.net/manual/en/mysqli.overview.php) – adatapost

+0

您是否试过[MySQL手册](http://dev.mysql.com/ DOC/refman/5.0/EN/SQL语法制备-statements.html)?它清楚地表明'PREPARE' /'EXECUTE'语句是一个与相同准备机制的接口,但比应用程序准备的语句效率低。 – lanzz

+0

PHP手册并没有真正回答我注射的问题,MySQL手册也没有。 – Perley

回答

3

PHP的mysqli是一个层,在PHP,围绕MySQL的准备/执行功能。

双方会从用户进来一切都塞进一个绑定变量,只要保证你的安全,从SQL注入。

预处理语句,处理任何一种方式,让更高效的大容量操作了。在MySQL中,与Oracle这样的高价位DBMS相比,效率增益并不高,但仍然值得每一点麻烦。

如果你需要有表名作为您的应用程序“变量”,那也行,你不能把表名作为绑定变量虽然。所以你需要完全偏执于导致这些表名构建的任何用户输入。

+0

好吧,这是有道理的。因此,由于mysqli层只是常规MySQL的封装,所以它们基本上采用相同的方式。谢谢!我不直接使用表名,因为它们对于用户来说不是很合乎逻辑的输入。相反,我使用了一些更清晰的用户,比如“Table Name”,然后我解析了表名实际上被命名为“tableName”(因为我喜欢我的CamalCase)。 – Perley

+0

对。只要确保你的友好的本地用户不能给你一个像“; DROP TABLES”这样的表名! –

+0

嗯,我认为从更进一步的阅读来看,这将是无效的权利?我记得一个文档或常见问题解答说执行(无论是哪种情况)只适用于一个语句。用“drop tables - ”,这会把查询变成两个语句,因此不应该按照我的理解执行。 – Perley