PHP PDO 简单教程

大约 80% 的 Web 应用程序由 PHP 提供支持。相似地,SQL 也是如此。PHP 5.5 版本以前,咱们有用于访问 MySQL 数据库的 mysql_ 命令,但因为安全性不足,它们最终被弃用。mysql

弃用这件事是发生在 2013 年的 PHP 5.5 上,我写这篇文章的时间是 2018 年,PHP 版本为 7.2。mysql_ 的弃用带来了访问数据库的两种主要方法:mysqli 和 PDO 库。linux

虽然 mysqli 库是官方指定的,但因为 mysqli 只能支持 mysql 数据库,而 PDO 能够支持 12 种不一样类型的数据库驱动程序,所以 PDO 得到了更多的赞誉。此外,PDO 还有其它一些特性,使其成为大多数开发人员的更好选择。你能够在下表中看到一些特性比较:git

PDO MySQLi
数据库支持 12 种驱动 只有 MySQL
范例 OOP 过程 + OOP
预处理语句(客户端侧) Yes No
1命名参数 Yes No

如今我想对于大多数开发人员来讲,PDO 是首选的缘由已经很清楚了。因此让咱们深刻研究它,并但愿在本文中尽可能涵盖关于 PDO 你须要的了解的。github

链接

第一步是链接到数据库,因为 PDO 是彻底面向对象的,因此咱们将使用 PDO 类的实例。sql

咱们要作的第一件事是定义主机、数据库名称、用户名、密码和数据库字符集。数据库

$host = 'localhost';
$db   = 'theitstuff';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$conn = new PDO($dsn, $user, $pass);
复制代码

以后,正如你在上面的代码中看到的,咱们建立了 DSN 变量,DSN 变量只是一个保存数据库信息的变量。对于一些在外部服务器上运行 MySQL 的人,你还能够经过提供一个 port=$port_number 来调整端口号。数组

最后,你能够建立一个 PDO 类的实例,我使用了 $conn 变量,并提供了 $dsn$user$pass 参数。若是你遵循这些步骤,你如今应该有一个名为 $conn 的对象,它是 PDO 链接类的一个实例。如今是时候进入数据库并运行一些查询。安全

一个简单的 SQL 查询

如今让咱们运行一个简单的 SQL 查询。bash

$tis = $conn->query('SELECT name, age FROM students');
while ($row = $tis->fetch())
{
  echo $row['name']."\t";
  echo $row['age'];
  echo "<br>";
}
复制代码

这是使用 PDO 运行查询的最简单形式。咱们首先建立了一个名为 tis(TheITStuff 的缩写 )的变量,而后你能够看到咱们使用了建立的 $conn 对象中的查询函数。服务器

而后咱们运行一个 while 循环并建立了一个 $row 变量来从 $tis 对象中获取内容,最后经过调用列名来显示每一行。

很简单,不是吗?如今让咱们来看看预处理语句。

预处理语句

预处理语句是人们开始使用 PDO 的主要缘由之一,由于它提供了能够阻止 SQL 注入的语句。

有两种基本方法可供使用,你能够使用位置参数或命名参数。

位置参数

让咱们看一个使用位置参数的查询示例。

$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(?, ?)");
$tis->bindValue(1,'mike');
$tis->bindValue(2,22);
$tis->execute();
复制代码

在上面的例子中,咱们放置了两个问号,而后使用 bindValue() 函数将值映射到查询中。这些值绑定到语句问号中的位置。

我还能够使用变量而不是直接提供值,经过使用 bindParam() 函数相同例子以下:

$name='Rishabh'; $age=20;
$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(?, ?)");
$tis->bindParam(1,$name);
$tis->bindParam(2,$age);
$tis->execute();
复制代码

命名参数

命名参数也是预处理语句,它将值/变量映射到查询中的命名位置。因为没有位置绑定,所以在屡次使用相同变量的查询中很是有效。

$name='Rishabh'; $age=20;
$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(:name, :age)");
$tis->bindParam(':name', $name);
$tis->bindParam(':age', $age);
$tis->execute();
复制代码

你能够注意到,惟一的变化是我使用 :name:age 做为占位符,而后将变量映射到它们。冒号在参数以前使用,让 PDO 知道该位置是一个变量,这很是重要。

你也能够相似地使用 bindValue() 来使用命名参数直接映射值。

获取数据

PDO 在获取数据时很是丰富,它实际上提供了许多格式来从数据库中获取数据。

你能够使用 PDO::FETCH_ASSOC 来获取关联数组,PDO::FETCH_NUM 来获取数字数组,使用 PDO::FETCH_OBJ 来获取对象数组。

$tis = $conn->prepare("SELECT * FROM STUDENTS");
$tis->execute();
$result = $tis->fetchAll(PDO::FETCH_ASSOC);
复制代码

你能够看到我使用了 fetchAll,由于我想要全部匹配的记录。若是只须要一行,你能够简单地使用 fetch

如今咱们已经获取了数据,如今是时候循环它了,这很是简单。

foreach ($result as $lnu){
  echo $lnu['name'];
  echo $lnu['age']."<br>";
}
复制代码

你能够看到,由于我请求了关联数组,因此我正在按名称访问各个成员。

虽然在定义但愿如何传输递数据方面没有要求,但在定义 $conn 变量自己时,实际上能够将其设置为默认值。

你须要作的就是建立一个 $options 数组,你能够在其中放入全部默认配置,只需在 $conn 变量中传递数组便可。

$options = [
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$conn = new PDO($dsn, $user, $pass, $options);
复制代码

这是一个很是简短和快速的 PDO 介绍,咱们很快就会制做一个高级教程。若是你在理解本教程的任何部分时遇到任何困难,请在评论部分告诉我,我会在那你为你解答。


via: www.theitstuff.com/easiest-pdo…

做者:Rishabh Kandari 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索