【问题标题】:How can I insert/update using arrays in PDO?如何在 PDO 中使用数组插入/更新?
【发布时间】:2014-10-24 16:26:32
【问题描述】:

我是 PDO 的新手,不完全确定我是否在正确的地方/方式寻找我想要的用途。

PDO 看起来很不错,但我发现这种代码很长,不想在我运行的每个查询中都使用它:

$sth = $database->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));

我宁愿使用这样的东西:

$array = 
 'calories' => $calories,
 'colour' => $colour
);
$db->insert("fruit", $array);

(同样我想进行更新调用,并且我希望它适用于每个插入/更新,以便将键名作为表中的字段,并将值作为插入/更新的值)。

我看重的是:

  • 在我自己的脚本中使用最少的代码,仅使用数组并在其他地方处理 PDO 语句(包括错误捕获)。
  • 仍然利用 PDO 附带的预准备语句和面向对象编程。

我找到了很多答案,但他们提出了许多不同类型的解决方案,包括:

总而言之,似乎有很多选择,但我不知道最推荐的方法是什么,甚至具体的区别是什么。

请照亮我:我应该在这里寻找什么以及在哪里寻找?!

【问题讨论】:

  • PDO 是一个原始的 SQL 驱动程序接口。它统一提供的唯一便利是绑定参数。所以是的,辅助函数或抽象是要走的路。就像没有人再使用纯粹的 JavaScript 一样,您不应该编写乏味的 PDO 咒语。然而,没有一种万能的。 ORM 和查询构建器通常被描述为 SQL 训练轮,而 Active Record 或 CRUD 包装器简化了-&gt;insert 用例。根据您的数据库结构,自定义实用程序函数(至少对于数组绑定或更简单的参数绑定)可能会更有效率。
  • @mario 谢谢,这就是我正在寻找的答案!你能把这个作为答案吗?如果您可以提供一些示例或关于如何在不同选项之间进行选择的建议,这将使其更加有用!
  • “ORM 和查询构建器通常被描述为 SQL 训练轮” 这真是一种糟糕的表达方式。它们绝不是“训练轮”。当你信任它发出正确的查询时,你使用 ORM,当你不能时,你绕过它或自定义它。 95% 的情况下,一个好的 ORM 会做正确的事情,而且代码和错误风险比手工操作要少得多。
  • @tadman 我想说这在很大程度上取决于您的应用程序类型。一个最简单的 CRUD 应用程序可能在大多数情况下都可以使用 ORM。如果您有一些复杂的数据结构,尽管具有高度的数据库规范化和/或您正在使用抽象 ORM 不支持的特定数据库的特殊功能,那么配置 ORM 并使其行为可能需要更多的工作而不是手动编写查询。如果你发现绕过 ORM 的时间超过一半,那可能就不值得了。
  • @deceze 大多数人不会编写这类应用程序,即使是那些应用程序,也可以使用常规 ORM 处理大部分查询。仅仅因为您有一些边缘情况并不意味着您需要让自己承受手工编写每个查询的痛苦世界。

标签: php mysql pdo


【解决方案1】:

有许多系统可以消除常规查询并将其替换为更高级别的代码。

一种是使用像PropelDoctrine 这样的ORM。

更好的是使用完整的development framework,如Laravel,它不仅可以帮助您进行数据库查询,还可以帮助您解决更多问题。大多数应用程序需要考虑 HTML 转义、XSS 保护、URL 映射、身份验证、会话管理等。自己编写这些内容既困难又容易出错。

【讨论】:

    【解决方案2】:

    正如在其他答案中提到的那样,做这件事的温和方法是在你的情况下使用一些 orm,它也支持 pdo。

    例如教义。它非常复杂和强大。如果您想使用一些轻量级但功能齐全的 orm,可以选择。

    例如 db.php (http:\dbphp.net) 并查看该框架的最简单用法演示 https://github.com/hazardland/db.php/blob/master/samples/001.showcase.php

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2021-05-23
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多