[英]PHP\MYSQL prepared statements
我是mysql和php的新手,并且想澄清准备语句中的内容。
我见过的所有示例都只为表中的实际数据添加了参数,对所有字段进行参数化以减少语句数量是否是一种不好的做法? 例如
UPDATE ? SET ?=? WHERE ID=?
谢谢
您不能参数化标识符。 您只能参数化数据 。 否则,参数化的要点,即语句结构和数据之间的分离是没有意义的。 理解参数化不仅仅是花哨的复制和粘贴,它是一种技术,可确保数据库在静态部分(它将从中获取指令)和动态部分(将其视为数据和仅数据)。
我个人并不真正理解为什么每个人都试图尽量减少SQL并且不想编写任何代码。 在实际的应用程序中,有一个定义的有限数量的SQL查询,应用程序将这些查询发送到数据库。 还有的将是一个查询找到用户名的用户,一个计算FOOS的数量在酒吧桌等等,等等,一旦写这些查询,长手。 在某处有一个方法findUserByName()
,该方法包含查询以按SQL写出的名称查找用户。 您无需将每个查询动态地拼凑在一起,只需要编写一次即可。 这还为您提供了所有可能的数据库交互的良好“清单”,并允许在必要时进行手动操作。 </rant>
所以,这既是不可能的和误导性的。
尽管出色的deceze答案从字面上涵盖了您的问题,但还有其他事情需要提及。
如果您看一下任何主要的框架,您会发现一个函数... update()的工作方式大致相同:
function update($table, $data, $id) {
因此,该方法通常很受欢迎。
但是,这也是错误的和误导的。
最初不灵活,很快就无法使用:
所有这些情况将使起初的小巧功能变成function肿的怪物。
但是补救措施很简单。
您真正需要的是一个可以添加到查询中的每种数据类型的占位符 。 因此,欢迎使用SafeMysql-一个将实现您梦想的库:
$db->query("UPDATE ?n SET ?u WHERE id=?i", $table, $data, $id);
它确实在做您想要的,但是却以正确的方式做。 甚至如此复杂的查询也不会造成任何麻烦:
$data = array('field'=>$value,'field2'=>$value);
$ids = array(1,2,4);
$sql = "UPDATE t SET ts=unix_timestamp(), ip=inet_aton(?s),?u WHERE id IN(?a)";
$db->query($sql, $ip, $data, $ids);
尽管这样做的目的不是要减少"less [SQL] statements"
,而是要减少编写PHP代码并确保查询安全 ,同时保持对常规SQL的熟悉,而无需像学习某些Query Builder的新语言那样权衡取舍用PHP编写的方言。
是的,显然是因为它不可读。 即使具有价值观,我也会主张以关键形式使用占位符会更好。 例如
UPDATE mytable SET `name`=:fullname WHERE ID=:id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.