【问题标题】:Why is it stupid to create custom PDO query handlers? [closed]为什么创建自定义 PDO 查询处理程序很愚蠢? [关闭]
【发布时间】:2014-01-21 17:41:04
【问题描述】:

根据这个帖子:https://codereview.stackexchange.com/questions/29362/very-simple-php-pdo-class 人们通常说创建自定义 PDO 查询处理程序很愚蠢,我觉得很难理解。

例如,在我的项目中,我更喜欢有一个类/函数来做我一直在做的事情,对我来说更快。

例如,当您需要在表中执行简单的更新时,我创建了这个函数,我一直使用它:

function UpdateData($table, $data, $where, $params=array()) {
    $sql = 'UPDATE `' . tbl_prefix.$table . '` SET ';
        foreach($data as $name => $value) {
            $params[':' . $name] = $value;
            $runs++;
            $sql .= "`$name` = :" . $name;

            if(end($data) !== $value) // if not last run
                $sql .= ',';
        }

    if(!is_array($where)) {
        $sql .= ' ' . $where; // insert where clause
    } else {
        // Array format can be used
        $sql .= ' WHERE';

        foreach($where as $argument => $value) {
            $params[':where_'.$argument] = $value;

            $num++;
            $sql .= " `" . $argument . "` = :where_" . $argument . " ";

            if(end($where) !== $value)
                $sql .= ' AND';
        }
    }

    $query = doQuery($sql, $params); // do the update

    if($query)
        return true;
}

还有doQuery(我在查询数据库时也会用到):

function doQuery($query, $params=array()) {
    global $db;
    try {
        $result = $this->$db->prepare($query);
        $result->execute($params);
        $result->setFetchMode(PDO::FETCH_ASSOC);

        return $result;
    } catch(PDOException $ex) {
        $real_query = $query;
        foreach($params as $name => $value) {
            $real_query = str_replace($name, '\''.$value.'\'', $real_query);
        }

        SystemLog($ex->GetMessage(), array('real_query' => $real_query, 'query' => $query), 1); // log error
    }

    return false;
}

这有什么问题吗?我觉得它非常有用。

部分代码已从脚本中提取出来以简化代码

【问题讨论】:

  • 如果它对你有用,那就去吧。您已经创建了一个在项目中重用的实用程序,因此否定了已接受答案关于可重用性的论点。虽然我明白他在说什么,但他可能指的是创建一个大型抽象类或其他东西,而不仅仅是几个辅助方法。无论哪种方式,您的项目都应该满足您的需求。如果您对这些东西有足够的了解,甚至制作了上述 2 个助手,那么您可能可以安全地使用它们。

标签: php mysql sql pdo


【解决方案1】:

我认为你正在做的很好。该线程中的主要论点是您错过了 Prepared 语句:我从 1984 年左右开始使用 SQL,而 DBMS 已经足够好,以至于自 1994 年以来使用 Prepared 语句并没有真正的区别。我没有使用过20 多年了,我的系统运行良好。

不过,每个人都有自己的看法。我做过很多次你做的事情,从来没有遇到过问题。现在我使用 ORM,这意味着我也不必这样做。

【讨论】:

  • 我相信,大多数 PHP 开发人员使用准备好的语句是因为更高的安全性,我错了吗?
  • 这与安全无关!准备好的语句是“预编译的”。回到过去,编译——制定查询计划——是一个相当大的开销,所以你可以做一次,而不必再次忍受它。现在情况并非如此。不使用 Prepared 语句也可以解决数据分布偏斜的问题,其中 where 子句中的实际值可能会使不同的计划更好。
  • 实际上,使用 PHP 和 PDO 我收回了这一点。似乎需要使用 MySQL Prepare 来绑定参数(在快速查看文档之后),并且它使用的参数可以增加针对 SQL 注入的安全性。对于那个很抱歉! (其他 DBMS 不需要)
【解决方案2】:

在我之前的项目中,我设置了几个使用 PDO 发出 SQL 请求的函数。它们将涵盖大多数情况:基本插入、基本更新、基本删除等。

如果你实现得足够好,使用 PDO、prepared statements 和 catch Exceptions,那么你应该没问题,并且你会得到两全其美,PDOprepared statements 的简单用法和更高的安全性。

我从来没有遇到过问题。不过,您只需要确保完美地实现它。

【讨论】:

    【解决方案3】:

    只有我能发现增加价值的事情是 PDO 适合处理通过 javascript/php 网站传递的大数据(不适用于 MySqli!)和一些额外的选项/方法。就像在任何新语言中你都需要做笔记一样,不要认为所有的大程序员都在从头开始运行多语言项目。我也不认为它比 MySqli 更安全……我实际上认为它比 mysqli 更不安全。 (编辑)并且在处理大数据的几个 das 之后,我发现安全问题与 PDO 一起工作得更好。. 仍然在用户无法直接访问修改 mysqli 的地方,使用它可能很好。我想我们会在未来找到答案。

    【讨论】:

    • PDO 和 MySQLi 如果你正确地实现每一个,它们是可以互换的。 PDO 可以做的事情非常非常少,而 MySQLi 不能 做。在 PDO 上更简单。
    • Mysqli 和我的 Isam 在处理大数据时要快得多,然后 PDO 是有原因的,你错过了我的观点。 PDO 可以结合 html5 好东西更好地处理大数据,以创建响应式感觉,如果你问我,这就是它的全部。这是我自己的经验。
    • HTML5 与数据库交互无关。您可能指的是 AJAX 请求?
    • 彼得,你已经回答了一个 6 年前提出的问题,并且得到了回答。然而,您的答案并不能很好地解释自己,并且(根据我的看法)您的 cmets 是模糊的概括和“我比你更了解”的态度,而不是试图实际教授或传授任何实际的知识 .很高兴您对自己的工作了解这么多,但我建议您真正努力在更开放和更自然的庄园中传达丰富的信息,以使您的回答有价值。谢谢。
    • 只有我一个人,还是“PDO 适合处理大数据”与“Mysqli 和我的 Isam 处理大数据的速度更快”相反?无论哪种方式,这种意识流都很难算作答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多