1

我是 mysql 和 php 的新手,想澄清一些关于准备好的陈述。

我看到的所有示例都只为表中的实际数据添加参数,将所有字段参数化以减少语句是不好的做法吗?例如

UPDATE ? SET ?=? WHERE ID=?  

谢谢

4

3 回答 3

4

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


就我个人而言,我真的不明白为什么每个人都试图尽可能减少 SQL 并且不想写任何东西。在现实世界的应用程序中,应用程序将发送到数据库的 SQL 查询数量有限。将有一个查询来通过用户名查找用户,一个来计算条形表中的 foos 数量等。等等。将这些查询写一次,长手。在某处有一个方法findUserByName(),其中包含查询以按 SQL 写出的名称查找用户。您不需要动态地将每个查询拼凑在一起,只需编写一次。这也为您提供了所有可能的数据库交互的良好“清单”,并允许在必要时进行手动调整。</rant>


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

于 2013-04-17T10:18:21.440 回答
1

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

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

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

因此,该方法总体上很受欢迎。
然而,它也是错误的被误导的。

由于最初不灵活,它很快变得无法使用:

  • 一旦您需要常规 id 以外的字段名称,
  • 一旦你需要更复杂的条件,
  • 一旦您需要基于 JOIN 的更新,
  • 一旦你需要使用 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,而不是像学习一些 Query Builder 的新语言这样的权衡,这只是用 PHP 编写的一种 SQL 方言。

于 2013-04-17T11:27:32.407 回答
0

是的,显然是因为它不可读。即使有值,我也认为最好以键的形式使用占位符。例如

UPDATE mytable SET `name`=:fullname WHERE ID=:id
于 2013-04-17T10:13:22.110 回答