繁体   English   中英

PHP \\ MYSQL预备语句

[英]PHP\MYSQL prepared statements

我是mysql和php的新手,并且想澄清准备语句中的内容。

我见过的所有示例都只为表中的实际数据添加了参数,对所有字段进行参数化以减少语句数量是否是一种不好的做法? 例如

UPDATE ? SET ?=? WHERE ID=?  

谢谢

不能参数化标识符。 您只能参数化数据 否则,参数化的要点,即语句结构数据之间的分离是没有意义的。 理解参数化不仅仅是花哨的复制和粘贴,它是一种技术,可确保数据库在静态部分(它将从中获取指令)和动态部分(将其视为数据和仅数据)。


我个人并不真正理解为什么每个人都试图尽量减少SQL并且不想编写任何代码。 在实际的应用程序中,有一个定义的有限数量的SQL查询,应用程序将这些查询发送到数据库。 还有的将是一个查询找到用户名的用户,一个计算FOOS的数量在酒吧桌等等,等等,一旦写这些查询,长手。 在某处有一个方法findUserByName() ,该方法包含查询以按SQL写出的名称查找用户。 您无需将每个查询动态地拼凑在一起,只需要编写一次即可。 这还为您提供了所有可能的数据库交互的良好“清单”,并允许在必要时进行手动操作。 </rant>


所以,这既是不可能的误导性的。

尽管出色的deceze答案从字面上涵盖了您的问题,但还有其他事情需要提及。

如果您看一下任何主要的框架,您会发现一个函数... update()的工作方式大致相同:

function update($table, $data, $id) {

因此,该方法通常很受欢迎。
但是,这也是错误的误导的。

最初不灵活,很快就无法使用:

  • 一旦您需要除常规ID以外的其他字段名称,
  • 一旦您需要更复杂的条件,
  • 一旦您需要基于JOIN的更新,
  • 一旦您需要使用SQL函数(!)处理一些数据

所有这些情况将使起初的小巧功能变成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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM