PDO - データベース抽象化レイヤー
はじめに: PDO 拡張機能は、PHP がデータベースにアクセスするための軽量で一貫したインターフェイスを定義します。PDO は、一貫性のないデータベース接続の問題を解決します。
1. PDO の概要
この章では、主に PDO のインストールと構成、および PDO を使用してデータベースに接続する方法を紹介します。 。
1-1 PDO の概要
PDO は PHP Data Object の略称で、PHP5.1 バージョンと同時にリリースされ、現在データベースをサポートしています。 FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite、Sybase。異なるデータベースを操作する場合、PDO の DSN
(データベース ソース) を変更するだけで、PDO の統合インターフェイスを使用して操作できます。
PDO の機能:
コーディングの一貫性:PDO はさまざまなデータベースで使用できる単一のインターフェイスを提供します
柔軟性:PDO は実行時にロードする必要がありますデータベース ドライバーなので、データベースを使用するたびに PHP を再構成して再コンパイルする必要はありません。
高パフォーマンス: PDO は C 言語で記述され、PHP にコンパイルされます。PHP で記述された他のソリューションと比較すると、他の機能はありますが、
#オブジェクト指向機能: PDO は、PHP5 のオブジェクト指向機能を使用して、より効率的なデータベース通信を実現します。注意: PDO 拡張機能は単なる抽象的なインターフェイス層です。PDO 拡張機能自体を使用するだけではデータベース操作を実現できません。それぞれの特徴を表現するには特徴的な形式を使用する必要があります。
1-2 PDO の構成とアクティベーション
#1-3 PDO 接続データベース
#1. パラメーター フォームを使用してデータベースに接続します (この方法の習得に重点を置きます)
//通过参数形式连接数据库 try{ $dsn='mysql:host=localhost;dbname=school'; $username='root'; $password='root'; $pdo=new PDO($dsn,$username,$password); var_dump($pdo); }catch (PDOException $e){ echo $e->getMessage(); }; 需要注意:dsn是你的数据源 输出结果:object(PDO)#1 (0) { }
2. PDO オブジェクトの使用
主要介绍PDO对象方法的使用。
2-1 [PDO] exec()方法执行建表操作
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //exec():执行一条sql语句并返回其受影响的行数;如果没有受影响的记录,它返回0 //exec对于select没有作用 //PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况, //如果用传统的输出方法 ——按字符串输出的话, //肯定要有大量的转义符来对字符串中的引号等特殊字符进行转义,以免出现语法错误。 //如果是一两处还可以容忍,但是要是一个完整的 html文本或者是一个200行的js我想是谁都会崩溃的。 //这就是PHP为什么要引入一个定界符的原因——至少一大部分原因是这样的。 /* 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西; 2.在PHP定界符中的任何特殊字符都不需要转义; 3.PHP定界符中的PHP变量会被正常的用其值来替换。 PHP中的定界符格式是这样的: <<<Eof …… Eof;*/ $sql=<<<EOF create table if not exists t_teacher( id int UNSIGNED auto_increment primary key, teaname varchar(20) not null UNIQUE, pwd char(32) not null, email varchar(30) not null ); EOF; $res= $pdo->exec($sql); var_dump($res); }catch (PDOException $e){ echo $e->getMessage(); };
输出结果:int(0);
2-2 [PDO] exec()方法执行插入记录操作
续上面:插入一条或多条记录
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); $sql='insert into t_teacher values(default,"king5","'.md5('king').'","waly@qq.com");'; $res=$pdo->exec($sql); echo $res; }catch (PDOException $e){ echo $e->getMessage(); };
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //$sql='insert into t_teacher values(default,"king6","'.md5('king').'","waly@qq.com");'; $sql=<<<EOF insert into t_teacher values (default,"king7","'.md5('king').'","waly@qq.com"), (default,"king8","'.md5('king').'","waly@qq.com"), (default,"king9","'.md5('king').'","waly@qq.com") EOF; $res=$pdo->exec($sql); echo '受影响的记录的条数为:'. $res."<br/>"; //$pdo->lastInsertId():得到新插入记录的ID号 //echo '最后插入的ID号为:'.$pdo->lastInsertId(); }catch (PDOException $e){ echo $e->getMessage(); };
2-3 [PDO] exec()方法执行其他SQL操作
本身是king,修改为king,会是0条记录被影响.
lastInsertId() 只能对插入有影响。
exec()对查询无作用
2-4 [PDO] errorCode()和errorInfo()方法查看错误信息
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //错误的表名 $sql='insert into t_teacher1 values(default,"king6","'.md5('king').'","waly@qq.com");'; $res=$pdo->exec($sql); if($res===false){ //$pdo->errorCode(); SQLSTATE的值 echo $pdo->errorCode(); echo '<hr/>'; //$pdo->errorInfo():返回的错误信息的数组,数组中包含3个单元 //0=>SQLSTATE(错误编号),1=>CODE(错误码),2=>INFO(错误信息) $errInfo=$pdo->errorInfo(); print_r($errInfo); } }catch (PDOException $e){ echo $e->getMessage(); };
2-5 [PDO] query()方法执行查询语句
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //查询一条记录 //$sql='select * from t_teacher where id=5'; //查询多条记录 $sql='select * from t_teacher'; //$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来 $stmt=$pdo->query($sql); var_dump($stmt); //只能看出这个语句返回的是一个对象 echo '<hr/>'; foreach ($stmt as $row){ print_r($row); echo '<hr/>'; echo '编号:'.$row['id'].'<br/>'; echo '用户名:'.$row['teaname'].'<br/>'; echo '邮箱:'.$row['email'].'<br/>'; echo '<hr/>'; } }catch (PDOException $e){ echo $e->getMessage(); };
Query()用于插入数据 <?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //插入一条记录 $sql='insert into t_teacher values(default,"king12","'.md5('king').'","waly@qq.com");'; //$pdo->query($sql):执行sql语句,返回PDOStatement对象:需要遍历这个对象,将里面的内容取出来 $stmt=$pdo->query($sql); var_dump($stmt); //只能看出这个语句返回的是一个对象 }catch (PDOException $e){ echo $e->getMessage(); };
注意:更多的用query()查询数据,用exec()实现增删改
2-6 [PDO] prepare()和execute()方法执行查询语句
<?php //查询单条语句 try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //查询一条记录 $sql='select * from t_teacher where id=5'; //$pdo->prepare($sql);准备sql语句 $stmt=$pdo->prepare($sql); //execute():执行预处理语句 $res=$stmt->execute(); //var_dump($res); //会返回bool(true) //查数据使用 //fetch():得到结果集中的一条记录(作为索引+关联样式返回) $row=$stmt->fetch(); print_r($row); }catch (PDOException $e){ echo $e->getMessage(); };
<?php try{ //驱动器的名称 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //查询多条记录 $sql='select * from t_teacher'; //$pdo->prepare($sql);准备sql语句 $stmt=$pdo->prepare($sql); //execute():执行预处理语句 $res=$stmt->execute(); //var_dump($res); //会返回bool(true) //查数据使用 //fetch():得到结果集中的一条记录(作为索引+关联数组) /*if($res){ while ($row=$stmt->fetch()){ print_r($row); echo '<hr/>'; } }*/ //fetchAll() 查询所有记录,以二维数组(索引+关联方式) $rows=$stmt->fetchAll(); print_r($rows); }catch (PDOException $e){ echo $e->getMessage(); };
指定类型:我们更多的是想得到关联数组,我们可以通过两种方式来获得,第一种方式:设置其取回数据的方式(设置参数、常量);第二种方式:通过方法
三、 PDOStatement对象的使用
本章主要介绍PDOStatement对象方法的使用,以及参数的绑定与预处识。
3-1 [PDO] quote()方法防止SQL注入
带条件查询 登录实现的例子
<?php header('content-type:text/html;charset=utf-8'); $username=$_POST['username']; $password=$_POST['password']; try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //向数据库表查找对应的用户信息//如果存在,证明有这个用户,登录成功;否则登录失败 //输入 'or 1=1 # 可以查看查到的数据 //$sql="select * from t_user WHERE `name`='{$username}' AND `password`='{$password}'"; //通过quote():返回带引号的字符串,过滤字符串中的特殊字符 $username=$pdo->quote($username); $sql="select * from t_user WHERE `name`={$username} AND `password`={$password}"; echo $sql; $stmt=$pdo->query($sql); //PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数, //对于INSERT、UPDATE、DELETE返回受影响的记录的条数 echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
3-2 [PDO] 预处理语句中的占位符的使用
<?php header('content-type:text/html;charset=utf-8'); $username=$_POST['username']; $password=$_POST['password']; try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //占位符有两种方法 //第一种方法 $sql="select * from t_user WHERE `name`=:username and `password`=:password"; $stmt=$pdo->prepare($sql); $stmt->execute(array(":username"=>$username,":password"=>$password)); //PDOStatement对象的方法:rowCount() :对于select操作返回的结果集中记录的条数, //对于INSERT、UPDATE、DELETE返回受影响的记录的条数 echo $stmt->rowCount(); //第二种方法 $sql="select * from t_user WHERE `name`=? and `password`=?"; $stmt=$pdo->prepare($sql); $stmt->execute(array($username,$password)); echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
3-3 [PDO] bindParam()方法绑定参数
两种方式:命名参数占位符,问号方式
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)"; $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)"; $stmt=$pdo->prepare($sql); $stmt->bindParam(":username",$username,PDO::PARAM_STR); $stmt->bindParam(":password",$password,PDO::PARAM_STR); $stmt->bindParam(":sex",$sex,PDO::PARAM_STR); $username='张三'; $password='123654'; $sex='M'; $stmt->execute(); echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)"; $sql="insert into t_user VALUES (DEFAULT ,?,?,?)"; $stmt=$pdo->prepare($sql); $stmt->bindParam(1,$username); $stmt->bindParam(2,$password); $stmt->bindParam(3,$sex); $username='张三1'; $password='1236541'; $sex='F'; $stmt->execute(); echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
3-4 [PDO] bindValue()方法绑定参数
向用户表插入数据:命名参数占位符,问号方式类似
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)"; $sql="insert into t_user VALUES (DEFAULT ,?,?,?)"; $stmt=$pdo->prepare($sql); $username='李四'; $password='123654'; $stmt->bindValue(1,$username); $stmt->bindValue(2,$password); $stmt->bindValue(3,'M'); $stmt->execute(); echo $stmt->rowCount(); $username='李四1'; $password='1236541'; $stmt->bindValue(1,$username); $stmt->bindValue(2,$password); $stmt->bindValue(3,'M'); $stmt->execute(); echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
3-5 [PDO] bindColumn()方法绑定参数
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)"; $sql="select `name`,`password`,`sex` from t_user"; $stmt=$pdo->prepare($sql); $stmt->execute(); echo '结果集中的列数一共有:'.$stmt->columnCount(); echo "<hr/>"; print_r($stmt->getColumnMeta(0)); $stmt->bindColumn(1,$username); $stmt->bindColumn(2,$password); $stmt->bindColumn(3,$sex); while ($stmt->fetch(PDO::FETCH_BOUND)){ echo '用户名:'.$username."-密码:".$password."-性别:".$sex."<hr/>"; } echo $stmt->rowCount(); }catch (PDOException $e){ echo $e->getMessage(); }
3-6 [PDO] fetchColumn()方法从结果集中返回一列
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); $sql="select `name`,`password`,`sex` from t_user"; $stmt=$pdo->query($sql); //索引默认从0开始 echo $stmt->fetchColumn(0),"<br/>"; echo $stmt->fetchColumn(1),"<br/>"; echo $stmt->fetchColumn(2); }catch (PDOException $e){ echo $e->getMessage(); }
3-7 [PDO] debugDumpParams()方法打印一条预处理语句
<?php header('content-type:text/html;charset=utf-8'); try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)"; $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)"; $stmt=$pdo->prepare($sql); $stmt->bindParam(":username",$username,PDO::PARAM_STR); $stmt->bindParam(":password",$password,PDO::PARAM_STR); $stmt->bindParam(":sex",$sex,PDO::PARAM_STR); $username='张三'; $password='123654'; $sex='M'; $stmt->execute(); $stmt->debugDumpParams(); }catch (PDOException $e){ echo $e->getMessage(); }
四、PDO事务处理
主要介绍如何使用PDO进行事务处理
4-1 PDO错误处理模式
3种错误处理模式
静默模式 <?php header('content-type:text/html;charset=utf-8'); /*PDO::ERRMODE_SLIENT:默认模式,静默模式*/ try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); $sql="select * from nonet_user"; $stmt=$pdo->query($sql); echo $pdo->errorCode(); echo '<br/>'; echo $pdo->errorInfo(); }catch (PDOException $e){ echo $e->getMessage(); }
<?php header('content-type:text/html;charset=utf-8'); /*PDO::ERRMODE_SLIENT:默认模式,静默模式 *PDO::ERRMODE_WARNING:警告模式 * PDO::ERRMODE_EXCEPTION:异常模式 */ try{ //连接数据库 $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //设置警告模式 //$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); //设置异常模式:推荐使用 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql="select * from nonet_user"; $stmt=$pdo->query($sql); echo $pdo->errorCode(); echo '<br/>'; echo $pdo->errorInfo(); }catch (PDOException $e){ echo $e->getMessage(); }
4-2 PDO事务处理
<?php header('content-type:text/html;charset=utf-8'); try{ $option=array(PDO::ATTR_AUTOCOMMIT,0); $pdo=new PDO('mysql:host=localhost;dbname=school','root','root',$option); //开启事务 $pdo->beginTransaction(); var_dump($pdo->inTransaction()); $sql="update account set money=money-200 WHERE username='king'"; $res=$pdo->exec($sql); if($res==0){ throw new PDOException('转账失败'); } $res1=$pdo->exec('update account set money=money+200 WHERE username="queen"'); if($res1==0){ throw new PDOException('接收失败'); } $pdo->commit(); }catch (PDOException $e){ $pdo->rollBack(); echo $e->getMessage(); }
好了,以上就是关于本文介绍的关于PHP中PDO操作数据库的详细操作以及实例了,相了解更多相关问题请访问PHP中文网:
以上がPHP の PDO を使用してデータベースに接続するための詳細なチュートリアルと実践的なデモンストレーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。