【问题标题】:What is PDO & why should I use it?什么是 PDO 以及我为什么要使用它?
【发布时间】:2011-10-22 06:54:07
【问题描述】:

人们不断提到我在处理 MySQL 时应该在我的 PHP 中使用 PDO,我以前从未听说过。

什么是 PDO?它是如何使用的,有什么优缺点?

谢谢,

【问题讨论】:

标签: php pdo


【解决方案1】:

PDO 是什么?

PDO 代表 PHP 数据对象。这是一个允许 PHP 脚本通过 SQL 查询来查询数据库的接口。

PDO 是添加到 PHP 中的一个扩展,因此它的各种功能都可以在该语言中使用。它构成了数据库的一个抽象接口,也就是说,它的所有功能都可以用于执行任何 DBMS 的 SQL 查询。也就是说,如果web应用是基于MySQL DBMS的,我们可以在不修改源代码的情况下迁移到PostgreSQL DBMS(需要做一些小的修改)。

与访问它们的旧方法相比,数据库的抽象是一个优势。而且,它构成了PDO的最终优势,而不是唯一的优势。

PDO 的正常运行取决于数据库驱动程序的可用性。必须支持此功能才能查询所需的 DBMS。

例如,要声明 SBGD MySQL 驱动程序,请转到 php.ini 文件并添加以下行(如果尚未声明):extension = php_pdo_mysql.dll 请注意,还必须出现以下行:extension = php_pdo .dll 对于低于 5.3 的 PHP 版本,此步骤是必需的。使用 PDO (Connection to a database) 对象为了简化解释,我将使用一个示例:

假设数据库服务器是本地服务器(localhost),我们要查询的数据库(MySQL)叫做“mabase”。为了能够查询这个数据库,我们将使用用户名“user”和密码“1234”。当然,用户“user”只有足够的权限通过 PHP 脚本查询数据库。

现在假设在“mabase”数据库中,已经创建了一个名为“users”的表,其结构如下:

CREATE TABLE `utilisateurs` (
   `id` int(10) unsigned NOT NULL auto_increment,
   `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
   `nom` varchar(40) NOT NULL,
   `prenom` varchar(40) NOT NULL,
   `login` varchar(40) NOT NULL,
   `pass` varchar(40) NOT NULL,
   PRIMARY KEY (`id`)
);

我猜你对 SQL 语言很熟悉。否则,只需通过服务器上的 PHPMyAdmin 工具运行此代码。

现在我们数据库的所有设置都在那里了。我们将看到如何通过 PDO 对象使用 PHP 来查询它。数据库连接字符串(PDO 实例) 连接字符串是安装在服务器上的数据库连接信息的文本表示。在这种情况下声明连接字符串就像创建这样的 PDO 实例:

<?php
   $pdo = new PDO("mysql:host=localhost;dbname=mabase","user","1234");
?>

【讨论】:

    【解决方案2】:

    将 PDO 视为与 PHP 一起打包的内置类,以便您更轻松地与数据库交互。在开发 PHP 应用程序时,您需要处理很多事情,例如建立连接、创建查询、获取结果、将资源转换为数组、使用mysql_real_escape_string() 逃避 MySQL 注入现在有很多事情需要注意的,至少但不是最后考虑一种情况,即您想从 mysql 跳转到 mysqli 或 MSSQL,因为您需要遍历每个函数并更改每一行代码以满足需要。 PDO 通过提供一个集中的类来根除所有这些问题。

    要详细说明,请看下面的代码。

    使用 PDO 建立与 MySQL 的连接:

    $dbh = new PDO('mysql:host='.HOST.';dbname='.DATABASE,USERNAME,PASSWORD); 
    

    就是这样,连接已建立,您可以重用 $dbh 来执行查询,例如从表用户那里获取结果,您只需要两行代码。

    $sth = $dbh->query('SELECT id,name,email FROM users');
    $user = $sth->fetch(PDO::FETCH_ASSOC);
    

    现在$user 将获取所有值作为关联数组。

    要将值插入数据库,您需要执行以下操作。

    $sth = $dbh->prepare('INSERT INTO users(name,email) VALUES(:name, :email)');
    $sth->bindParam(':name', 'My Name');
    $sth->bindParam(':email', 'email@email.com');
    $sth->execute();
    

    上面的代码使用了命名占位符,这样 PDO 可以保护你免受许多漏洞的影响,因为它可以让你远离 MySQL 注入。让你开始看看 netttus 的这个教程,他们已经很好地解释了,这篇文章将解释你关于 PDO 的所有困境

    http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

    【讨论】:

    • 易卜拉欣,你知道 $sth 代表什么吗?冒号是干什么用的?示例::name, :emai。我也不明白这个 bindParam。谢谢!
    • $sth 是一个变量,用于引用 statement handle 进行 PDO 查询,:name, :email 等是占位符,在上面的示例中 bindParam 将 :name 替换为 My name。您应该阅读上面提到的文章,作者提出了一些非常好的观点,可以帮助您理解这个概念
    • 我阅读了整篇文章。这个 PDO 似乎是非常先进和安全的做法,但我不明白占位符如何保护 MySQL 并防止注入。它们看起来像常规变量吗?
    • 当您将占位符传递给方法 bindParam 时,在执行 SQL 查询之前,PDO 将在每个占位符上调用 mysql_escape_string() 以逃避恶意脚本 注意:我不确定PDO 在内部做了什么来安全地执行查询,提到 mysql_escape_string() 只是一个例子,不一定是真的。
    【解决方案3】:

    PDO 是一个面向对象的类,用于编写和执行 MySQL 查询。这似乎增加了一层复杂性,但 PDO 实际上允许您在 php 中更简单地编写查询,并以编程方式编写查询(其他代码为您构建查询的不同行)。

    PDO 还负责处理许多安全问题,例如转义您的 sql 查询。如果您不使用像 PDO 这样的数据库抽象层,您将永远不会做任何这些事情,即使您尝试这样做,也很容易忘记,或者做错了。

    如果您不关心安全性(例如SQL injection)并且您能够编写所需的自然 MySQL 查询,那么您无需担心它。当您在使用框架的更结构化的项目中工作时,学习它可能会让事情变得更容易。

    【讨论】:

      【解决方案4】:

      http://php.net/manual/en/book.pdo.php

      PHP 数据对象 (PDO) 扩展定义了一个轻量级的、一致的 PHP中访问数据库的接口。

      PDO 提供了一个数据访问抽象层,这意味着, 无论您使用哪个数据库,都使用相同的功能 发出查询和获取数据。 PDO 不提供数据库 抽象;它不会重写 SQL 或模拟缺失的功能。你 如果您需要该工具,则应使用成熟的抽象层。

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 1970-01-01
        • 2020-10-25
        • 2015-09-08
        • 2022-01-22
        • 2011-06-18
        • 1970-01-01
        • 2012-04-26
        相关资源
        最近更新 更多