php – (double)$user_input和bind_param(‘d’,$user_input)之
让我们说我要执行这样一个准备好的声明:
$qry->prepare('UPDATE table_name SET column1 = ? string_column = ? WHERE column3 = ? AND column4 = ?'); $qry->bind_param('sbid',$string,$blob,$int,$double); $int = 'non int value'; /* gives 0 in the database */ $blob = 'some string'; $string = 'another string'; $double = $double; $qry->execute(); $qry->close(); 我只想说我只想执行一次查询,我只是在安全名称中使用了预处理语句.从我一直在阅读的内容来看,只使用一次准备好的查询会产生更多的开销,这相当于降低了安全性方面的性能.话虽如此 – 一次这样做同样的查询会有什么性能/安全性差异. $int = (int) $int; $blob = "'" .mysql_real_escape_string($blob) ."'"; $string = "'" .mysql_real_escape_string($blob) ."'"; $double = (double) $double; $db->query("UPDATE SET column1 = $int,column2 = $blob WHERE column3 = $string AND column4 = $double "); PS.我对Prepared语句如何改进性能以及单个查询的安全性和速度差异感兴趣. 解决方法
这有很多.一些随机点
>如果MySQL服务器存在大量连接,则单次使用预处理语句会产生(超过理论上)性能损失,这会更高. (想一想:上下文切换) 要么: >有一些(甚至很多)案例,其中准备好的语句不提供安全性好处 – 有很多业务逻辑,其中不涉及用户生成的数据(想想:Jointables,只携带ID)或者用户生成的数据必须事先通过其他原因进行验证(思考:价格计算,memcached查找,……) 经常被忽视: >准备好的查询有时会使与RDBMS无关的内容变得更加困难 我的最爱: >通常建议只使用准备好的查询 因此,风格的选择通常必须根据具体情况进行.我们采用了封装所有数据库访问的方式,包括标准化库中的参数管理,简单地是require()ed,因此您可以直接替换准备好的查询,转义或任何您想要的和您的RDBMS支持. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |