【问题标题】:PHP: mysql v mysqli v pdo [closed]PHP:mysql v mysqli v pdo [关闭]
【发布时间】:2012-08-19 07:12:37
【问题描述】:

我一直在阅读一些关于在 php 中使用 mysqli 与 pdo 来使用 mysql 的问题。

我见过诸如mysqli or PDO - what are the pros and cons?Moving from mysql to mysqli or pdo? 之类的问题,它们都专门处理mysqli v pdo。我对这两种方法中哪一种更好不感兴趣。

我想知道为什么应该避免使用 mysql_ 函数。当然,根据 PHP 的文档 http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated,它们正在被弃用,线程 PHP PDO and MySQLi 表明 PDO 和 MySQLi 更强大,线程 What is the difference between MySQL, MySQLi and PDO? 暗示这些新方法更安全。

总的来说,我想知道 mysql_ 方法的最大弱点是什么,以及避免它的原因是什么(我想更具体地说,不仅仅是因为它已被弃用)。我计划更新我受影响的脚本,并对为什么不推荐使用这种旧方法感到好奇。

谢谢!

【问题讨论】:

  • “当然,根据 PHP 的文档,它们正在被弃用” 你真的需要更多吗? PHP 正在杀死他们。他们快死了。不是你是否应该停止使用它们,你必须停止使用它们,因为它们根本不存在。有一百万个其他资源会告诉你为什么在 mysqli_* 函数上使用 PDO 很重要,但这与 Stack Overflow 无关。
  • 我问为什么 PHP 会杀死他们。不知道使用它们是否是个好主意。
  • mysql_query 是一个如此糟糕的功能,我很惊讶没有针对 Zend 的支持而提起集体诉讼。

标签: php mysql pdo mysqli


【解决方案1】:

首先,如果您没有正确手动清理输入,mysql 函数极容易受到 SQL 注入的影响。 mysqli 和 pdo 具有参数化的 sql 语句选项,避免了这种风险。在我看来,它们通常也有更好的编码风格。

【讨论】:

    【解决方案2】:

    mysql_query 函数的设计是这样的,你必须小心地逃避你注入的每一个数据,如果你错过了一个,你的整个应用程序可能会被一个automatic SQL vulnerability exploit tool.

    mysqli 和 PDO 都支持必需的占位符,以确保您的查询不受 SQL 注入错误的影响。对所有事情都调用mysql_real_escape_string 不仅乏味,而且容易出错,这就是问题出现的地方。

    mysql 函数是 PHP 早期的产物,与 mysqli 提供的新的面向对象功能相比,它们的局限性要大得多,也可以选择设计为 PDO。

    使用这两个新接口之一有很多很好的理由,但最重要的是 mysql_query 函数在生产代码中使用起来太危险了。有了它,您将永远远离一些非常严重的问题。

    充满密码和信用卡号码的数据库不断出现是有原因的。拥有一个明显的 SQL 注入点几乎可以很容易地完全接管一个网站。

    【讨论】:

    • 不错的答案。请提供更多示例和解释,这样就不需要在每个点上进一步搜索。
    • 这个答案没有实际意义,因为 mysql_query 最终在版本 7 中从 PHP 中删除。使用 PDO,甚至更好,像 DoctrinePropelEloquent 这样的 ORM .
    【解决方案3】:

    来自选择MySSQL API @ PHP.net

    // mysqli
    $mysqli = new mysqli("example.com", "user", "password", "database");
    $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $result->fetch_assoc();
    echo htmlentities($row['_message']);
    
    // PDO
    $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
    $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $statement->fetch(PDO::FETCH_ASSOC);
    echo htmlentities($row['_message']);
    
    // mysql
    $c = mysql_connect("example.com", "user", "password");
    mysql_select_db("database");
    $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = mysql_fetch_assoc($result);
    echo htmlentities($row['_message']);
    

    创建一个对象,就像 mysqli 和 PDO 一样,是编写任何现代软件的推荐方式。 mysql 库是为 PHP 2.0 版发布的,从那时起就没有进行过重大的重写。 PHP 2.0 于 1997 年发布,这应该足以解释为什么不使用它。

    【讨论】:

    • 这个例子只是作弊,因为它没有使用准备好的语句
    • 说实话,我没有批评代码,因为它直接取自 PHP 手册,但我不认为这是作弊;它只显示基本部分,既不涉及准备好的语句,也不涉及真正的转义字符串。
    • 真正的转义字符串不等同于准备好的语句
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2018-04-23
    • 2019-09-26
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多