准备好的陈述是否是正常查询的浪费?(PHP)

Xeo*_*oss 11 php mysql database prepared-statement

如今,"准备好的语句"似乎是任何人建议向数据库发送查询的唯一方式.我甚至看到了为存储过程使用预准备语句的建议.然而,这样做的额外查询预处理语句需要 - 他们持续很短的时间 - 我相信,他们只负责线路INSERT/UPDATE查询有用.

我希望有人可以纠正我,但这似乎是整个"桌子是邪恶的"CSS事件的重复.如果用于布局,表格只是邪恶的 - 而不是表格数据.将DIV用于表格数据是违反WC3的风格.

同样明智的,纯SQL(或从AR生成的)似乎对80%的查询更有用,在大多数站点上都是单个SELECT,不再重复页面加载(我说的是脚本语言)像这里的PHP).为什么我会让我过度征税的数据库准备一个声明,它只能在删除之前运行一次?

MySQL的:

准备好的语句特定于创建它的会话.如果在不释放先前准备的语句的情况下终止会话,则服务器会自动解除分配.

因此,在脚本结束时,PHP将自动关闭连接,您将丢失准备好的语句,只是为了让您的脚本在下次加载时重新创建它.

我错过了什么或者这只是一种降低性能的方法吗?

:更新时间:

我突然意识到我正在为每个脚本假设新的连接.我认为如果使用持久连接,那么这些问题就会消失.它是否正确?

:UPDATE2:

似乎即使持久连接是解决方案 - 它们对于大多数Web来说也不是一个非常好的选择 - 特别是如果你使用事务.所以我回到原点,只有下面的基准才能继续......

:UPDATE3:

大多数人只是重复"准备语句防止SQL注入"这一短语,但并没有完全解释这个问题.为每个DB库提供的"转义"方法也可以防止SQL注入.但它不止于此:

以正常方式发送查询时,客户端(脚本)将数据转换为字符串,然后传递给数据库服务器.然后,DB服务器使用CPU电源将它们转换回正确的二进制数据类型.然后,数据库引擎解析该语句并查找语法错误.

使用预准备语句时...数据以本机二进制形式发送,这样可以节省转换CPU使用率,并使数据传输更加高效.显然,如果客户端与DB服务器不在同一位置,这也会减少带宽使用.

...变量类型是预定义的,因此MySQL会考虑这些字符,并且不需要对它们进行转义.

http://www.webdesignforums.net/showthread.php?t=18762

感谢OIS最终在这个问题上设置了我.

lon*_*eck 6

与CSS表辩论不同,准备好的陈述有明显的安全隐患.

如果您使用预准备语句作为将用户提供的数据放入查询的唯一方法,那么它们在SQL注入时绝对是防弹的.

  • 准备不进行清理.获得该计划.它将数据作为数据传输,而不是字符串.没有引用.__WHY__准备好的语句是_100%safe_,引用的字符串是__NOT__. (4认同)
  • 除非将这些值传递到不准备语句的存储过程(或以其他方式清理其输入) (2认同)