赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > 数据库抽象层PDO
数据库抽象层PDO

PDO是PHP数据对象(PHP Data Object)的简称,与PHP5.1一起发行,目前支持Firebird、FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite和Sybase等,只需要使用PDO接口中的方法就可以对不同的数据库进行操作,在选择不同的数据库时只需要修改PDO的数据源名称DSN即可。PHP6中默认使用PDO连接数据库。
Linux环境下,要使用MySQL数据库可以在configure命令中添加:
--with-pdo-mysql=/path/to/mysql/installation
Windows环境下启用PDO需要php.ini文件中配置:
extention=php_pdo.dll
extension=php_pdo_mysql.dll

1.PDO连接数据库:

在PDO中,要建立与数据库的连接需要实例化PDO构造函数。PDO构造函数语法为:
__construct(string $dsn[, string $username[, string $password[, array $driver_options]]])
其中:
·dsn:数据源名称,包括主机端口号和数据库名称
·username:连接数据库的用户名
·password:连接数据库的密码
·driver_option:连接数据库的其他选项
示例:
$dbms='mysql';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   echo "PDO连接MySQL成功";
} catch (Exception $e) {
   echo $e->getMessage()."<br />";
}
DSN是数据源名称(Data Source Name)的缩写,提供连接数据库需要的信息。PDO的DSN包括3部分:PDO驱动名称(如mysql、sqlite或pgsql)、冒号和驱动器特定的语法。每种数据库都有特定的驱动语法。
数据库服务器与Web服务器可能不在一台计算机上,此时需要在通过PDO连接数据库时修改DSN中的主机名称。
由于数据库服务器只在特定的端口上监听连接请求,每种数据库服务器具有一个默认的端口号,如MySQL为3306,但是数据库管理员可以对端口号进行修改,因此有可能PHP找不到数据库的端口,此时就要在DSN中包含端口号。由于一个数据库服务器中可能同时拥有多个数据库,所以在通过DSN连接数据库时,通常都包括数据库名称。

2.PDO中执行SQL语句:

PDO中有3种方法来执行SQL语句:

1)exec()方法:

exec()方法返回执行SQL语句后受影响的行数。语法为:
int PDO::exrc(string statement);
其中,参数statement是要执行的SQL语句。该方法通常用于INSERT、DELETE和UPDATE语句中。

2)query()方法:

query()方法通常用于返回执行查询后的结果集。语法为:
PDOStatement PDO::query(string statement);
其中,参数statement是要执行的SQL语句,返回的是一个PDOStatement对象。

3)预处理语句prepare()和execute()方法:

首先,用prepare()做查询的准备工作,然后通过execute()执行查询,同时还通过bindParam()方法来绑定参数提供给execute()方法。语法为:
PDOStatement PDO::prepare(string statement[, array drive_options]);
bool PDOStatement::execute([array input_parameters]);

3.PDO中获取结果集:

在PDO中获取结果集有3种方法。

1)fetch()方法:

fetch()方法获取结果集中的下一行数据。语法为:
mixed PDOStatement::fetch([int fetch_style[, int cursor_orientation[, int cursor_offset]]])
其中,fetch_style控制结果集的返回方式;cursor_orientation是PDOStatement对象的一个游标,可用于获取指定的一行;int cursor_offset是游标的偏移量。fetch_style的可选值表:


说明

PDO::FETCH_ASSOC

关联数组形式

PDO::FETCH_NUM

数字索引数组形式

PDO::FETCH_BOTH

两种数组形式都有,这是默认的

PDO::FETCH_OBJ

按照对象的形式,类似于以前的mysql_fetch_object()

PDO::FETCH_BOUND

以布尔值的形式返回结果,同时将获取的列值赋给bindParam()方法中指定的变量

PDO::FETCH_LAZY

以关联数组、数字索引数组和对象3种形式返回结果

示例:
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $query="select * from tb_pdo_mysql";
   $result=$pdo->prepare($query); //准备查询语句
   $result->execute(); //执行查询语句
   while($res=$result->fetch(PDO::FETCH_ASSOC)) {
?>
<tr>
   <td height="22" align="center" valign="middle"><?php echo $res['id']; ?></td>
   <td align="center" valign="middle"><?php echo $res['pdo_type']; ?></td>
   <td align="center" valign="middle"><?php echo $res['database_name']; ?></td>
   <td align="center" valign="middle"><?php echo $res['dates']; ?></td>
   <td align="center" valign="middle"><a href="#">删除</a></td>
</tr>
<?php
   }
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

2)fetchAll()方法:

fetchAll()方法获取结果集中的多有行。语法为:
array PDOStatement::fetchAll([int fetch_style[, int column_index]])
其中,fetch_style控制结果集的返回方式,可选值与fetch()函数中的一样;column_index是字段的索引。返回值是一个包含结果集中所有数据的二维数组。
示例:
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $query="select * from tb_pdo_mysql";
   $result=$pdo->prepare($query); //准备查询语句
   $result->execute(); //执行查询语句
   $res=$result->fetchAll(PDO::FETCH_ASSOC)
   for($i=0;$i<count($res);$i++) {
?>
<tr>
   <td height="22" align="center" valign="middle"><?php echo $res[$i]['id']; ?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['pdo_type']; ?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['database_name']; ?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['dates']; ?></td>
   <td align="center" valign="middle"><a href="#">删除</a></td>
</tr>
<?php
   }
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

3)fetchColumn()方法:

fetchColumn()方法获取结果集中下一行指定列的值。语法为:
string PDOStatement::fetchColumn([int fetch_number])
可选参数fetch_number设置行中列的索引值,该值从0开始。如果省略该参数则将从第1列开始取值。
示例:
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $query="select * from tb_pdo_mysql";
   $result=$pdo->prepare($query); //准备查询语句
   $result->execute(); //执行查询语句
?>
<tr>
<td height="22" align="center" valign="middle"><?php echo $result->fetchColumn(0); ?></td>
</tr>
<tr>
<td height="22" align="center" valign="middle"><?php echo $result->fetchColumn(0); ?></td>
</tr>
<tr>
<td height="22" align="center" valign="middle"><?php echo $result->fetchColumn(0); ?></td>
</tr>
<tr>
<td height="22" align="center" valign="middle"><?php echo $result->fetchColumn(0); ?></td>
</tr>
<?php
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

4.PDO中捕获SQL语句中的错误:

1)使用默认模式PDO::ERRMODE_SILENT:

在默认模式中设置PDOStatement对象的errorCode属性,但不进行其他任何操作。通过prepare()和execute()方法向数据库中添加数据,设置PDOStatement对象的errorCode属性,手动检测代码中的错误。
示例:
<?php
if($_POST['submit']=="提交"&&$_POST['pdo']!="") {
  $dbms='mysql';
  $host='localhost';
  $dbName='dbDatabase';
  $user='root';
  $pwd='111';
  $dsn="$dbms:host=$host;dbname=$dbName";
  $query="insert into tb_pdo_mysql(pdo_type,data_name,dates)values('".$_POST('pdo')."', '".$_POST['databases']."', '".$POST['dates']."')";
  $result=$pdo->prepare($query); //准备查询语句
  $result->execute(); //执行查询语句
  $code=$result->errorCode()
  if(emply($code)) {
     echo "数据添加成功!";
  } else {
     echo "数据库错误:<br />";
     echo "SQL Query:".$query;
     echo "<pre>";
     var_dump($result->errorInfo());
     echo "</pre>";
  }
}
?>

2)使用警告模式PDO::ERRMODE_WARNING:

警告模式会产生一个PHP警告,并设置errorCode属性。如果设置的是警告模式,那么除非明确地检查错误代码,否则程序将继续按照其方式进行。设置警告模式,通过prepare()和execute()方法读取数据库中的数据,并且通过while语句和fetch()方法完成数据的循环输出。
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); //设为警告模式
   $query="select * from tb_pdo_mysql";
   $result=$pdo->prepare($query); //准备查询语句
   $result->execute(); //执行查询语句
   while($res=$result->fetch(PDO::FETCH_ASSOC)) { //循环输出查询结果集
?>
<tr>
   <td height="22" align="center" valign="middle"><?php echo $res['id']; ?></td>
   <td align="center" valign="middle"><?php echo $res['pdo_type']; ?></td>
   <td align="center" valign="middle"><?php echo $res['database_name']; ?></td>
   <td align="center" valign="middle"><?php echo $res['dates']; ?></td>
</tr>
<?php
   }
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

3)使用异常模式PDO::ERRMODE_EXCEPTION:

异常模式会创建一个PDOException,并设置errorCode属性。它可以将执行代码封装到一个try{}catch{}语句块中。未捕获的异常会导致脚本中断,并显示堆栈跟踪让用户了解是哪里出现问题。
示例:
<?php
header("Content-type:text/html;charset=utf-8");
if($_GET['conn_id']!="") {
  $dbms='mysql';
  $host='localhost';
  $dbName='dbDatabase';
  $user='root';
  $pwd='111';
  $dsn="$dbms:host=$host;dbname=$dbName";
  try {
   $pdo=new PDO($dsn,$user,$pwd);
   $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXECPTION); //设为警告模式
   $query="delect from tb_pdo_mysql where Id=:id";
   $result=$pdo->prepare($query); //准备查询语句
   $result->bindParam(':id',$_GET['conn_id']); //绑定更新的数据
   $result->execute(); //执行查询语句
  } catch (PDOException $e) {
   echo 'PDO Exception Caught.';
   echo 'Error with the database:<br />';
   echo 'SQL Query:'.$query;
   echo '<pre>';
   echo 'Error:'.$e->getMessage()."<br />";
   echo 'Code:'.$e->getCode()."<br />";
   echo 'File:'.$e->getFile()."<br />";
   echo 'Line:'.$e->getLine()."<br />";
   echo 'Trace:'.$e->getTraceAsString()."<br />";
   echo '</pre>';
  }
}
?>

5.PDO中错误处理:

在PDO中有两个获取程序中错误信息的方法。

1)errorCode()方法:

errorCode()方法用于获取在操作数据库句柄时所发生的错误代码,这些错误代码被称为SQLSTATE代码。语法为:
int PDOStatement::errorCode(void)
errorCode()方法返回一个SQLSTATE代码,是由5个数字和字母组成的。
示例:
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $query="select * from tb_pdo_mysql";
   $result=$pdo->query($query); //准备查询语句
   echo "errorCode为:".$pdo->errorCode();
   foreach($result as $items) {
?>
<tr>
   <td height="22" align="center" valign="middle"><?php echo $items['id']; ?></td>
   <td align="center" valign="middle"><?php echo $items['pdo_type']; ?></td>
   <td align="center" valign="middle"><?php echo $items['database_name']; ?></td>
   <td align="center" valign="middle"><?php echo $items['dates']; ?></td>
</tr>
<?php
   }
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

2)errorInfo()方法:

errorInfo()方法用于获取操作数据库句柄时所发生的错误信息。语法为:
array PDOStatement::errorInfo(void)
errorInfo()方法的返回值为一个数组,它包含了相关的错误信息。
示例:
<?php
$dbms='mysql';
$host='localhost';
$dbName='dbDatabase';
$user='root';
$pwd='111';
$dsn="$dbms:host=$host;dbname=$dbName";
try {
   $pdo=new PDO($dsn,$user,$pwd);
   $query="select * from tb_pdo_mysql";
   $result=$pdo->query($query); //准备查询语句
   print_r($pdo->errorInfo());
   foreach($result as $items) {
?>
<tr>
   <td height="22" align="center" valign="middle"><?php echo $items['id']; ?></td>
   <td align="center" valign="middle"><?php echo $items['pdo_type']; ?></td>
   <td align="center" valign="middle"><?php echo $items['database_name']; ?></td>
   <td align="center" valign="middle"><?php echo $items['dates']; ?></td>
</tr>
<?php
   }
} catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
}
?>

6.PDO中事务处理:

在PDO中同样可以实现事务处理的功能。包括3个方法:
beginTransaction()方法:开启事务,关闭自动提交模式,直到事务提交或回滚后才回复。
commit()方法:提交事务,成功则返回true,否则返回false。
rollBack()方法:事务回滚。
示例:
<?php
if($_POST['submit']=="提交"&&$_POST['pdo']!="") {
  $dbms='mysql';
  $host='localhost';
  $dbName='dbDatabase';
  $user='root';
  $pwd='111';
  $dsn="$dbms:host=$host;dbname=$dbName";
  try {
   $pdo=new PDO($dsn,$user,$pwd);
   $pdo->beginTransaction(); //开启事务
   $query="insert into tb_pdo_mysql(pdo_type,data_name,dates)values('".$_POST('pdo')."', '".$_POST['databases']."', '".$POST['dates']."')";
   $result=$pdo->prepare($query); //准备查询语句
   if($result->execute()) {
      echo "数据添加成功";
   } else {
      echo "数据添加失败";
   }
   $pdo->commit(); //执行事务提交操作
  } catch (PDOException $e) {
   die("Error!:".$e->getMessage()."<br />");
   $pdo->rollBack();
  }
}
?>

7.PDO存储过程:

PDO中存储过程允许在更接近于数据的位置操作数据,从而减少带宽的使用,使数据独立于脚本逻辑,允许使用不同语言的多个系统以相同的方式访问数据,从而节省了花费在编码和调试上的时间。同时,它使用预定义的方案执行操作,提高查询速度,并且能够阻止与数据的直接相互作为,从而起到保护数据的作用。
一个存储过程的SQL语句为:
drop procedure if exists pro_reg;
delimiter//
create procedure pro_reg (in nc varchar(80)), in pwd varchar(80), in email varchar(80), in address varchar(50))
begin
insert into tb_reg (name, pwd, email, address) values (nc, pwd, email, address);
end;
//
其中,drop语句删除已经存在的存储过程pro_reg;delimiter//的作用是将语句结束符更改为“//”;然后向存储过程传入参数;begin...end表示存储过程中的语句块。存储过程创建成功后,在PDO中通过CALL语句调用存储过程,实现用户注册信息的添加操作。
<?php
if($_POST['submit']!="") {
  $dbms='mysql';
  $host='localhost';
  $dbName='dbDatabase';
  $user='root';
  $pwd='111';
  $dsn="$dbms:host=$host;dbname=$dbName";
  try {
   $pdo=new PDO($dsn,$user,$pwd);
   $pdo->query("set names utf8");
   $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //定义错误异常
   $nc=$_POST['nc'];
   $pwd=md5($_POST['pwd']);
   $email=$_POST['email'];
   $address=$_POST['address'];
   $query="call pro_reg('$nc', '$pwd', '$email', '$address')";
   $result=$pdo->prepare($query); //准备查询语句
   if($result->execute()) {
      echo "数据添加成功";
   } else {
      echo "数据添加失败";
   }
  } catch (PDOException $e) {
   echo 'PDO Exception Caught';
   echo 'Error with the database:<br />';
   echo 'SQL Query:'.$query;
   echo '<pre>';
   echo "Error:".$e->getMessage()."<br />";
   echo "Code:".$e->getCode()."<br />";
   echo "File:".$e->getFile()."<br />";
   echo "Line:".$e->getLine()."<br />";
   echo "Trace:".$e->getTraceAsString()."<br />";
   echo '</pre>';
  }
}
?>

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659