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会考虑这些字符,并且不需要对它们进行转义.
感谢OIS最终在这个问题上设置了我.
与CSS表辩论不同,准备好的陈述有明显的安全隐患.
如果您使用预准备语句作为将用户提供的数据放入查询的唯一方法,那么它们在SQL注入时绝对是防弹的.
| 归档时间: |
|
| 查看次数: |
2938 次 |
| 最近记录: |