欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  php进阶(二)--PDO连接数据库技术应用

PHP学习 本站 988 0评论

一、什么是PDO


PDO是PHP数据对象(PHP Data Object)的缩写,PDO扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了一个数据库访问抽象层,这样,无论你使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据库的捉拿和,并能够屏蔽不同数据库之间的差异,使用pdo可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来php在数据库处理方面的主要发展方向,它可以支持mysql,postgresql,oracle,mssql等多种数据库。

PHP6中也将默认使用PDO的方式连接,mysql扩展将被作为辅助 。

111.jpg

注意:利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。


1.PDO的特点


222.jpg


2.安装PDO


333.jpg


PHP.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去掉与PDO相关的数据库扩展前面的";"号,然后重启Apache服务器即可。 

extension=php_pdo.dll 

extension=php_pdo_mysql.dll 

extension=php_pdo_pgsql.dll 

extension=php_pdo_sqlite.dll 

extension=php_pdo_mssql.dll 

extension=php_pdo_odbc.dll 

extension=php_pdo_firebird.dll 

...... 

官方参考网址:http://php.net/manual/zh/pdo.installation.php 


二、PDO连接数据库


1.PDO构造函数


在PDO中,要建立与数据库的连接需要实例化PDO构造函数,PDO构造函数的语法如下:

444.jpg


通过POD连接mysql数据库的代码如下:

<?php
//header("Content-type: text/html; charset=utf-8");
$dbms='mysql';     //数据库类型 ,对于开发者来说,使用不同的数据库,只要更改这个,不用记住那么多函数  
$host='localhost'; //数据库主机名
$user='root';      //数据库连接用户名
$pwd='root';       //对应的数据库密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {//捕获异常
    $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    echo "PDO连接mysql成功";
} catch (PDOException $e) {
    echo $e->getMessage()."<br>";
}
?>


2.DSN详解


555.jpg

连接于连接管理http://php.net/manual/zh/pdo.connections.php 


三、PDO 常用方法及其使用


PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作

PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作

PDO::setAttribute() 设置一个“数据库连接对象”属性

PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID 

PDOStatement::fetch() 是用来获取一条记录  

PDOStatement::fetchAll() 是获取所有记录集到一个中  


PDO与连接有关的选项:

PDO::ATTR_ERRMODE 

1.PDO::ERRMODE_SILENT 0 

2.PDO::ERRMODE_WARNING 1 

3.PDO::ERRMODE_EXCEPTION 2 

PDO::ATTR_AUTOCOMMIT 

1.0 //关闭自动提交 

2.1 //开启自动提交 

PDO::ATTR_DEFAULT_FETCH_MODE 

1.PDO::FETCH_ASSOC 2 

2.PDO::FETCH_NUM 3 

3.PDO::FETCH_BOTH 4 

4.PDO::FETCH_OBJ 5


在创建了PDO对象连接数据库之后,可以使用如下方法获取服务端数据库的属性值。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$pdo->setAttribute(3,2); 
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//$pdo->setAttribute(0,0); 
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
//$pdo->setAttribute(19,2); 
echo "\nPDO是否关闭自动提交功能:". $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo "\n当前PDO的错误处理的模式:". $pdo->getAttribute(PDO::ATTR_ERRMODE); 
echo "\n表字段字符的大小写转换: ". $pdo->getAttribute(PDO::ATTR_CASE); 
echo "\n与连接状态相关特有信息: ". $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS); 
echo "\n空字符串转换为SQL的null:". $pdo->getAttribute(PDO::ATTR_ORACLE_NULLS); 
echo "\n应用程序提前获取数据大小:".$pdo->getAttribute(PDO::ATTR_PERSISTENT); 
echo "\n与数据库特有的服务器信息:".$pdo->getAttribute(PDO::ATTR_SERVER_INFO); 
echo "\n数据库服务器版本号信息:". $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
echo "\n数据库客户端版本号信息:". $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION);


使用$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, flase);可以设置服务端数据库的属性值


1.exec()方法

666.jpg


2.query()方法

777.jpg


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

888.jpg

PDO预定义常量http://php.net/manual/zh/pdo.constants.php 


4.fetch()方法

999.jpg

例:通过fetch()方法获取结果集中的下一行数据

100.jpg

$dbms='mysql'; //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数
$host='localhost'; //数据库主机名
$dbName='db_database18';//使用的数据库
$user='root';      //数据库连接用户名
$pass='root';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";//数据库主机和数据库名称
?>
<table width="400" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td height="30" align="center"><strong>ID</strong></td>
    <td align="center"><strong>PDO</strong></td>
    <td align="center"><strong>数据库</strong></td>
    <td align="center"><strong>时间</strong></td>
    <td align="center"><strong>操作</strong></td>
</tr>
<?php
try {
    $pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $query="select * from tb_book";//定义SQL语句
    $result=$pdo->prepare($query);//准备查询语句
    $pdo->exec('set names gbk');//设置中文编码,因为数据库是中文编码gbk的
    $result->execute();     //执行查询语句,并返回结果集
while($res=$result->fetch(PDO::FETCH_ASSOC)){//while循环输出查询结果集,并且设置结果集的为关联索引数组形式
?>
  <tr>
    <td align="center" valign="middle"><?php echo $res['id'];?></td>
    <td align="center" valign="middle"><?php echo $res['bookname'];?></td>
    <td align="center" valign="middle"><?php echo $res['issuDate'];?></td>
    <td align="center" valign="middle"><?php echo $res['price'];?></td>
    <td align="center" valign="middle"><?php echo $res['maker'];?></td>
  </tr>
<?php
}
  } catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
?>
</table>

输出: 

101.jpg


5.fetchAll()方法

102.jpg

<?php
try {
$pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="select * from tb_book";//定义SQL语句
$result=$pdo->prepare($query);//准备查询语句
$pdo->exec('set names gbk');//设置中文编码,因为数据库是中文编码gbk的
$result->execute();//执行查询语句,并返回结果集
$res=$result->fetchAll(PDO::FETCH_ASSOC);//获取结果集中的所有数据
for($i=0;$i<count($res);$i++){//循环读取二维数组中的数据
?>
 <tr>
   <td align="center" valign="middle"><?php echo $res[$i]['id'];?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['bookname'];?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['issuDate'];?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['price'];?></td>
   <td align="center" valign="middle"><?php echo $res[$i]['maker'];?></td>
 </tr>
<?php
}
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
?>


6.fetchColumn()方法

103.jpg

<?php
try {
$pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="select * from tb_pdo_mysql";//定义SQL语句
$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/>");
}
?>


四、PDO错误处理


PDO的错误处理模式及其设置:

PDO::ATTR_ERRMODE=>错误处理模式:(3) 

PDO::ERRMODE_SILENT:不报错误(忽略)(0) 

PDO::ERRMODE_WARNING:以警告的方式报错(1) 

PDO::ERRMODE_EXCEPTION:以异常的方式报错(推荐使用)(2) 

设置方式:2种 

· 在构造时初始化错误模式 

· 通过pdo对象的setAttribute()方法设置。 

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

面向过程 

· $con->errorCode():SQL语句错误代码 

· $con->errorInfo():错误信息 

面向对象 

· 捕获PDOException异常对象


1.使用默认模式—PDO::ERRMODE_SILENT

104.jpg

代码如下:

<?php
if($_POST['Submit']=="提交" && $_POST['pdo']!=""){
    $dbms='mysql';         //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数
    $host='localhost';       //数据库主机名
    $dbName='db_database18';    //使用的数据库
    $user='root';          //数据库连接用户名
    $pass='root';          //对应的密码
    $dsn="$dbms:host=$host;dbname=$dbName";
    $pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $query="insert into tb_pdo_mysqls(pdo_type,database_name,dates)values('".$_POST['pdo']."','".$_POST['databases']."','".$_POST['dates']."')";
    $result=$pdo->prepare($query);
    $result->execute();
    $code=$result->errorCode();
    if(empty($code)){
       echo "数据添加成功!";
    }else{
       echo '数据库错误:<br/>';
       echo 'SQL Query:'.$query;
       echo  '<pre>';
       var_dump($result->errorInfo());
       echo '</pre>';
    }
}
?>

105.jpg


2.使用警告模式—PDO::ERRMODE_WARNING

106.jpg

<?PHP
此处省略部分代码
try {
   $pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//设置为警告模式
$query="select * from tb_pdo_mysqls";        //定义SQL语句
$result=$pdo->prepare($query);//准备查询语句
$result->execute();//执行查询语句,并返回结果集
while($res=$result->fetch(PDO::FETCH_ASSOC)){//while循环输出查询结果集,并且设置结果集的为关联索引
?>
        <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

107.jpg


errorCode()方法

108.jpg

<table>
 <tr>
   <td height="30" align="center"><strong>ID</strong></td>
   <td align="center"><strong>PDO</strong></td>
   <td align="center"><strong>数据库</strong></td>
   <td align="center"><strong>时间</strong></td>
 </tr>
<?php
$dbms='mysql';   //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数
$host='localhost'; //数据库主机名
$dbName='db_database18';//使用的数据库
$user='root';      //数据库连接用户名
$pass='root';      //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
    $pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="select * from tb_pdo_mysqls";//定义SQL语句
$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/>");
}
?>
< /table>


errorInfo()方法

109.jpg

<?php
try {
$pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="select * from tb_pdo_mysql";//定义SQL语句
$result=$pdo->query($query);//执行查询语句,并返回结果集
mysql_query("set names gbk"); //设置mysql字符集
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 ap;nbsp; <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/>");
}
?>

110.jpg

错误于错误处理http://php.net/manual/zh/pdo.error-handling.php 


五、PDO中事务处理


1111.jpg

<form id="form1" name="form1" method="post" action="index.php">
<table width="310" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td height="30" align="right">类型:</td>
    <td align="left"><input name="pdo" type="text" id="pdo" size="20" /></td>
  </tr>
  <tr>
    <td height="25" align="right">数据库:</td>
    <td align="left"><input name="databases" type="text" id="databases" size="20" /></td>
  </tr>
  <tr>
    <td height="25" align="right">时间:</td>
    <td align="left"><input name="dates" type="text" id="dates" size="20" /></td>
  </tr>
  <tr>
    <td height="30" colspan="2" align="center"><input type="submit" name="Submit" value="提交" />&nbsp;&nbsp; &nbsp;&nbsp;<input type="reset" name="Submit2" value="重置" /></td>
  </tr>
<?php
if($_POST['Submit']=="提交" && $_POST['pdo']!=""){
$dbms='mysql';     //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数
$host='localhost';   //数据库主机名
$dbName='db_database18; //使用的数据库
$user='root';      //数据库连接用户名
$pass='root       //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->beginTransaction();//开启事务
$query="insert into tb_pdo_mysqlspdo_type,database_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();  //执行事务的回滚
}
}
?>
</table>
</form>


六、PDO中存储过程


1112.jpg1113.jpg

<?php
if($_POST['submit']!=""){
$dbms='mysql';   //数据库类型 ,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数
$host='localhost'; //数据库主机名
$dbName='db_database18; //使用的数据库
$user='root';      //数据库连接用户名
$pass='root';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
    $pdo = new PDO($dsn, $user, $pass);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->query("set names gbk");//设置数据库编码格式
$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>';
}
 }
?>

实例代码见pdo_cunchuguocheng文件夹代码部分


本文案例下载:链接:https://pan.baidu.com/s/1hKBi-I9BxW_UFABAlQyRCw    提取码:oc7f


参考网址:

http://php.net/manual/zh/book.pdo.php

https://blog.csdn.net/gorgeouschou/article/details/79697837

http://phpstudy.php.cn/b.php/22890.html


转载请注明: ITTXX.CN--分享互联网 » php进阶(二)--PDO连接数据库技术应用

最后更新:2019-03-19 12:38:18

赞 (4) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽