文章插图
php 5.5 版本之前,我们有用于访问 MySQL 数据库的 mysql_ 命令,但由于安全性不足,它们最终被弃用 。mysql_ 的弃用带来了访问数据库的两种主要方法:mysqli 和 PDO 库 。大约 80% 的 Web 应用程序由 PHP 提供支持 。类似地,SQL 也是如此 。PHP 5.5 版本之前,我们有用于访问 MySQL 数据库的 mysql_ 命令,但由于安全性不足,它们最终被弃用 。
-- Rishabh Kandari(作者)
弃用这件事是发生在 2013 年的 PHP 5.5 上,我写这篇文章的时间是 2018 年,PHP 版本为 7.2 。mysql_ 的弃用带来了访问数据库的两种主要方法:mysqli 和 PDO 库 。
虽然 mysqli 库是官方指定的,但由于 mysqli 只能支持 mysql 数据库,而 PDO 可以支持 12 种不同类型的数据库驱动程序,因此 PDO 获得了更多的赞誉 。此外,PDO 还有其它一些特性,使其成为大多数开发人员的更好选择 。你可以在下表中看到一些特性比较:
PDOMySQLi数据库支持12 种驱动只有 MySQL范例OOP过程 + OOP预处理语句(客户端侧)YesNo1命名参数YesNo
现在我想对于大多数开发人员来说,PDO 是首选的原因已经很清楚了 。所以让我们深入研究它,并希望在本文中尽量涵盖关于 PDO 你需要的了解的 。
连接第一步是连接到数据库,由于 PDO 是完全面向对象的,所以我们将使用 PDO 类的实例 。
我们要做的第一件事是定义主机、数据库名称、用户名、密码和数据库字符集 。
$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 查询 。
$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 来获取对象数组 。
推荐阅读
- 华为交换机配置ssh远程登录,就这么简单,通俗易懂
- PHP AES/DES加解密方法,使用了base64和16进制加解密串
- JavaScript获取json中key所对应的value值的简单方法
- 一款简单的内网穿透工具,无需安装即可使用
- 想吃披萨不用出门买,自己在家做简单,又香又解馋,全家人吃嗨了
- 从洗澡看他如何对待感情
- 真假红酒最简单的辨别技巧,一分钟教你鉴别真假葡萄酒
- php使用百度API实现人脸识别
- PHP运算符优先级的一个例外
- PHP实现SESSION共享