PHP MYSQL \\预处理语句(PHP\\MYSQL prepared statements)

2019-08-31 09:39发布

我是新来的MySQL和PHP,并想澄清编写的语句的东西。

我见过的所有示例只添加实际数据PARAMS在表中,这是不好的做法,paramaterise所有的字段,以便有较少的语句? 例如

UPDATE ? SET ?=? WHERE ID=?  

谢谢

Answer 1:

不能参数标识。 您只能参数数据 。 否则,参数化的要点, 声明结构数据之间的分离,是很没有实际意义。 记者了解到,参数不只是看中复制和粘贴,这是确保数据库具有静态部分之间的明确分离(它会从它的指令)和动态部分(它会当作数据的技术和只有数据)。


个人而言,我真的不明白,为什么每个人都试图尽可能减少SQL,不想写任何。 在现实世界中的应用程序有SQL查询,应用程序将发送给数据库的定义,数量有限 。 还有的将是一个查询找到用户名的用户,一个计算FOOS的数量在酒吧桌等等,等等,一旦写这些查询,长手。 有一个方法findUserByName()其中包含查询,发现在SQL写出名的用户的地方。 你并不需要动态地凑齐每一个查询,你只需要编写一次。 这也为您提供了所有可能的数据库交互的一个很好的“库存”,并允许手工的调整必要。 </rant>


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



Answer 2:

虽然优秀的deceze的回答涵盖了您的问题从字面上看,有别的东西就更不用说了。

如果你看看任何重大freamework,你会发现它工作得同样的方式功能...更新():

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

因此,该方法是在一般颇为流行。
然而,这是错误的误导的为好。

最初被僵化,它很快变得无法使用:

  • 一旦你需要一个字段名比传统的ID等,
  • 一旦你需要一个更复杂的情况下,
  • 一旦你需要一个连接为基础的更新,
  • 一旦你需要使用一个SQL函数(!)来处理一些数据

所有这些情况将开始小和整洁的功能为臃肿的怪物。

不过补救办法很简单。
真正需要的是一个可以被添加到查询的每个数据类型占位符 。 所以,欢迎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,无需取舍喜欢学习一些查询生成新的语言,它仅仅是一个SQL方言用PHP编写的。



Answer 3:

是的,显然是因为它是无法读取。 即使有价值观,我认为最好是在关键的形式占位符。 例如

UPDATE mytable SET `name`=:fullname WHERE ID=:id


文章来源: PHP\\MYSQL prepared statements