详解PHP PDO简单教程


Posted in PHP onMay 28, 2019

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

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

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

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

现在我想对于大多数开发人员来说,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 来获取对象数组。

$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 介绍,我们很快就会制作一个高级教程。如果你在理解本教程的任何部分时遇到任何困难,请在评论部分告诉我,我会在那你为你解答。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP注释实例技巧
Oct 03 PHP
PHP 分页类(模仿google)-面试题目解答
Sep 13 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
php如何实现只替换一次或N次
Oct 29 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 PHP
CI框架文件上传类及图像处理类用法分析
May 18 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
laravel实现简单用户权限的示例代码
May 28 #PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 #PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 #PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 #PHP
Yii2框架操作数据库的方法分析【以mysql为例】
May 27 #PHP
php session_decode函数用法讲解
May 26 #PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 #PHP
You might like
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php多任务程序实例解析
2014/07/19 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
使用angular写一个hello world
2015/01/23 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
vue无限轮播插件代码实例
2019/05/10 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
python之mock模块基本使用方法详解
2019/06/27 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
竞选班长自荐书范文
2014/03/09 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
廉政教育的心得体会
2014/09/01 职场文书
逃课检讨书
2015/01/26 职场文书
校园新闻稿范文
2015/07/18 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
Go语言 详解net的tcp服务
2022/04/14 Golang