PHP之PDO

PDO

  • PDO是PHP数据对象(PHP Data Object)的缩写
  • PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,无论使用什么数据库,都可以通过一致的函数(方法)来执行查询和获取数据。
  • PDO是一个数据库访问抽象层,作用是统一各种数据库的访问接口,与MYSQL和MSSQL函数库相比,PDO让跨数据库的使用更具亲和力,与ADODB和MDB2相比,PDO更高效.
  • 有了PDO,您不必再使用mysql_*函数、oci_*函数或者mssql_*函数,也不必再为它们封装数据库操作类,只需要使用PDO接口中的方法就可以对各种数据库进行操作。在选择不同的数据库时,只修改PDO的DSN即可。

开启PDO扩展,修改php.ini文件

extension=php_pdo_mysql.dll

exec方法

  • 描述:执行一条 SQL 语句,并返回受影响的行数
  • 语法:int PDO::exec ( string $sql)
  • 参数:$sql要被预处理和执行的 SQL 语句。

    • 注意:不会从SELECT语句返回结果。
  • 返回: 返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则返回 0
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 插入一条数据
$sql = "INSERT INTO student VALUES(1,'taoy',19)";
$r = $pdo->exec($sql);
echo $r;     // 输出 1 

查看数据库内容:

mysql> select * from taoy.student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | taoy |   19 |
+----+------+------+
1 row in set (0.00 sec)

query方法

  • 描述:执行一条SQL语句,返回一个结果集对象( PDOStatement )。
  • 语法:public PDOStatement PDO::query( string $statement )
  • 提示:主要用于SELECT、SHOW语句。
  • 返回:执行成功返回PDOstatement对象,执行失败返回FALSE。

现在taoy数据库student表中添加多个记录

mysql> INSERT INTO student VALUES(2,'bob',18);
ERROR 1146 (42S02): Table 'pentest.student' doesn't exist
mysql> INSERT INTO taoy.student VALUES(2,'bob',18);
Query OK, 1 row affected (0.00 sec)

mysql> select * from taoy.student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | taoy |   19 |
|  2 | bob  |   18 |
+----+------+------+
2 rows in set (0.00 sec)
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$result = $pdo->query($sql);
// 遍历对象
foreach($result as $arr){
    print_r($arr);
}

代码输出:

Array ( [id] => 1 [0] => 1 [name] => taoy [1] => taoy [age] => 19 [2] => 19 ) Array ( [id] => 2 [0] => 2 [name] => bob [1] => bob [age] => 18 [2] => 18 )

lastInsertId方法

  • 描述:返回最后插入行的ID或序列值
  • 语法:string PDO::lastInsertId([ string $name = NULL ])
  • 返回:返回最后插入行的ID,或者是一个序列对象最后的值,取决于底层的驱动。

getAttribute方法

  • 描述:取回一个数据库连接的属性。
  • 语法:mixed PDO::getAttribute( int $attribute )
  • 参数:PDO::ATTR_* 常量中的一个。下列为应用到数据库连接中的常量:

    • PDO::ATTR_CASE
    • PDO::ATTR_ERRMODE
    • PDO::ATTR_PREFETCH
    • PDO::ATTR_SERVER_INFO
    • PDO::ATTR_SERVER_VERSION
    • PDO::ATTR_TIMEOUT
  • 返回:成功调用则返回请求的 PDO 属性值。不成功则返回 null。
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// 获取数据库版本 constant() 函数返回一个常量的值
echo $pdo->getAttribute(constant("PDO::ATTR_SERVER_VERSION")); //输出 5.5.53
?>

setAttribute方法

  • 描述:设置数据库句柄属性
  • 语法:bool PDO::setAttribute( int $attribute , mixed $value )
  • 提示:PDO内置了一些可用的通用属性(详细见手册)

    • PDO::ATTR_CASE:强制列名为指定的大小写。
    • PDO::ATTR_ERRMODE:错误报告
    • PDO::ATTR_ORACLE_NULLS: 转换 NULL 和空字符串。
    • PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。
    • PDO::ATTR_TIMEOUT: 指定超时的秒数。
    • PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式。
  • 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

fetch 方法

  • 描述:从结果集中获取下一行
  • 语法:mixed PDOStatement::fetch ([ int $fetch_style] )
  • 参数:$fetch_style,控制下一行如何返回给调用者。

    • PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
    • PDO::FETCH_BOTH(默认),返回一个索引为结果集列名和以0开始的列号的数组
    • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
  • 返回:此函数(方法)成功时返回的值依赖于提取类型。在所有情况下,失败都返回 FALSE
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$q = $pdo->query($sql);
$r = $q->fetch(PDO::FETCH_ASSOC);
var_dump($r); // array(3) { ["id"]=> string(1) "1" ["name"]=> string(4) "taoy" ["age"]=> string(2) "19" }
?>

fetchAll 方法

  • 描述:返回一个包含结果集中所有行的数组
  • 语法:array PDOStatement::fetchAll([ int $ fetch_style ] )
  • 参数:$fetch_style,控制下一行如何返回给调用者。

    • PDO::FETCH_ASSOC,返回一个索引为结果集列名的数组
    • PDO::FETCH_BOTH(默认),返回一个索引的数组
    • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$q = $pdo->query($sql);
$arr = $q->fetchAll(PDO::FETCH_ASSOC);
var_dump($arr);
?>

程序输出;

array(2) { [0]=> array(3) { ["id"]=> string(1) "1" ["name"]=> string(4) "taoy" ["age"]=> string(2) "19" } [1]=> array(3) { ["id"]=> string(1) "2" ["name"]=> string(3) "bob" ["age"]=> string(2) "18" } }

fetchColumn方法

  • 描述:从结果集中的下一行返回单独的一列
  • 语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )
  • 参数:$column_number你想从行里取回的列的索引数字(以0开始的索引)。如果没有提供值,则 PDOStatement::fetchColumn() 获取第一列。
  • 返回:从结果集中的下一行返回单独的一列,如果没有了,则返回 FALSE 。
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$q = $pdo->query($sql);
echo $q->fetchColumn(0); // 第1行第1列
echo $q->fetchColumn(1); // 第2行第2列 
// 输出:1bob
?>

rowCount方法

  • 描述:返回受上一个 SQL 语句影响的行数
  • 语法:int PDOStatement::rowCount ( void )
  • 返回:返回上一个由对应的 PDOStatement 对象执行SELECT、DELETE、 INSERT、或 UPDATE 语句受影响的行数。
  • 提示:要想使用该函数,必须使用 $pdo->query() 返回 PDOStatement 对象
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$q = $pdo->query($sql);
echo $q->rowCount(); //    输出:2
?>

columnCount方法

  • 描述:返回结果集中的列数
  • 语法:int PDOStatement::columnCount ( void )
  • 返回:返回由 PDOStatement 对象代表的结果集中的列数。如果没有结果集,则 PDOStatement::columnCount() 返回 0。
  • 提示:如果是由 PDO::query() 返回的 PDOStatement 对象,则列数计算立即可用
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student";
$q = $pdo->query($sql);
echo $q->columnCount();     // 输出
?>

PDO 错误处理

PDO支持三种错误模式

  • 静默模式(Silent):错误发生后,不会主动报错,是默认的模式;
  • 警告模式(Warning):错误发生后,通过PHP标准来报告错误;
  • 异常模式(Exception):错误发生后,抛出异常,需要捕捉和处理;
  • 提示:可以通过 PDO::setAttribute 更改错误模式。

静默模式

  • 在静默模式下,当有错误发生时,不会显示在页面上;
  • 此时,可以通过PDO的两个方法,来获取错误信息;

    • PDO::errorCode()
    • PDO::errorInfo()
<?php
header("Content-Type: text/html;charset=utf-8");
// 数据库配置信息
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=taoy;charset=utf8";
$username = 'root';
$password = 'root';
// 创建 PDO 类对象
$pdo = new PDO($dsn, $username, $password);

// taoy数据库-> student表-> 查询数据
$sql = "SELECT * FROM student where id = 10"; // 不存在的值
$q = $pdo->query($sql);
echo "错误状态码:".$q->errorCode();
echo "<br>错误信息:";
print_r($q->errorInfo());
?>

输出:

错误状态码:00000
错误信息:Array ( [0] => 00000 [1] => [2] => )

PHP异常处理

参考: https://www.w3school.com.cn/php/php_exception.asp

https://www.cnblogs.com/limingxishuai666/p/7260305.html

本文链接:

https://www.betao.cn/archives/phpreview07.html
1 + 6 =
1 评论
    CaiChrome 75Windows 10
    9月18日 回复

    给力!