PDO – Datenbankabstraktionsschicht
Einführung: Die PDO-Erweiterung definiert eine leichte, konsistente Schnittstelle für PHP, um auf die Datenbank zuzugreifen. PDO löst das Problem inkonsistenter Datenbankverbindungen.
1. Einführung in PDO
In diesem Kapitel wird hauptsächlich die Installation und Konfiguration von PDO sowie die Verwendung von PDO zum Herstellen einer Verbindung zur Datenbank vorgestellt .
1-1 Einführung in PDO
PDO ist die Abkürzung für PHP Data Object (PHP Data Object). Es wurde zusammen mit der PHP5.1-Version veröffentlicht Datenbanken Umfasst Firebird, FreeTDS, Interbase, MySQL, MS SQL Server, ODBC, Oracle, Postgre SQL, SQLite und Sybase. Wenn Sie verschiedene Datenbanken betreiben, müssen Sie nur DSN
(Datenbankquelle) in PDO ändern, um die einheitliche Schnittstelle von PDO zu verwenden.
PDO-Funktionen:
Codierungskonsistenz: PDO bietet eine einzige Schnittstelle, die mit verschiedenen Datenbanken verwendet werden kann
Flexibilität: PDO muss zur Laufzeit geladen werden Datenbanktreiber, sodass PHP nicht jedes Mal neu konfiguriert und kompiliert werden muss, wenn Sie die Datenbank verwenden.
Hohe Leistung: PDO ist in der Sprache C geschrieben und im Vergleich zu anderen in PHP geschriebenen Lösungen kompiliert Sind gleich, bietet es eine höhere Leistung
Objektorientierte Funktionen: PDO nutzt die objektorientierten Funktionen von PHP5, um eine effizientere Datenbankkommunikation zu erreichen.
Hinweis: Die PDO-Erweiterung ist nur eine abstrakte Schnittstellenschicht. Sie können keine Datenbankoperationen implementieren. Sie müssen eine Funktion verwenden, um ihre jeweiligen Eigenschaften auszudrücken.

1-2 PDO-Konfiguration und -Aktivierung

1-3 PDO-Verbindungsdatenbank

1. Stellen Sie eine Verbindung zur Datenbank über Parameter her (konzentrieren Sie sich auf die Beherrschung dieser Methode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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) { }
|
Nach dem Login kopieren
2. Verwendung von PDO-Objekten
主要介绍PDO对象方法的使用。
2-1 [PDO] exec()方法执行建表操作 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$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();
};
|
Nach dem Login kopieren
输出结果:int(0);
2-2 [PDO] exec()方法执行插入记录操作
续上面:插入一条或多条记录
1 2 3 4 5 6 7 8 9 10 | <?php
try {
$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();
};
|
Nach dem Login kopieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$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/>" ;
} catch (PDOException $e ){
echo $e ->getMessage();
};
|
Nach dem Login kopieren
2-3 [PDO] exec()方法执行其他SQL操作

本身是king,修改为king,会是0条记录被影响.
lastInsertId() 只能对插入有影响。
exec()对查询无作用
2-4 [PDO] errorCode()和errorInfo()方法查看错误信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
try {
$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){
echo $pdo ->errorCode();
echo '<hr/>';
$errInfo = $pdo ->errorInfo();
print_r( $errInfo );
}
} catch (PDOException $e ){
echo $e ->getMessage();
};
|
Nach dem Login kopieren
2-5 [PDO] query()方法执行查询语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$sql ='select * from t_teacher';
$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();
};
|
Nach dem Login kopieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Query()用于插入数据
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$sql ='insert into t_teacher values( default , "king12" , "'.md5('king').'" , "waly@qq.com" );';
$stmt = $pdo ->query( $sql );
var_dump( $stmt );
} catch (PDOException $e ){
echo $e ->getMessage();
};
|
Nach dem Login kopieren
注意:更多的用query()查询数据,用exec()实现增删改
2-6 [PDO] prepare()和execute()方法执行查询语句

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$sql ='select * from t_teacher where id=5';
$stmt = $pdo ->prepare( $sql );
$res = $stmt ->execute();
$row = $stmt ->fetch();
print_r( $row );
} catch (PDOException $e ){
echo $e ->getMessage();
};
|
Nach dem Login kopieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$sql ='select * from t_teacher';
$stmt = $pdo ->prepare( $sql );
$res = $stmt ->execute();
$rows = $stmt ->fetchAll();
print_r( $rows );
} catch (PDOException $e ){
echo $e ->getMessage();
};
|
Nach dem Login kopieren
指定类型:我们更多的是想得到关联数组,我们可以通过两种方式来获得,第一种方式:设置其取回数据的方式(设置参数、常量);第二种方式:通过方法
三、 PDOStatement对象的使用
本章主要介绍PDOStatement对象方法的使用,以及参数的绑定与预处识。

3-1 [PDO] quote()方法防止SQL注入
带条件查询 登录实现的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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');
$username = $pdo ->quote( $username );
$sql = "select * from t_user WHERE `name`={$username} AND `password`={$password}" ;
echo $sql ;
$stmt = $pdo ->query( $sql );
echo $stmt ->rowCount();
} catch (PDOException $e ){
echo $e ->getMessage();
}
|
Nach dem Login kopieren
3-2 [PDO] 预处理语句中的占位符的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?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 ));
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();
}
|
Nach dem Login kopieren
3-3 [PDO] bindParam()方法绑定参数
两种方式:命名参数占位符,问号方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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 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();
}
|
Nach dem Login kopieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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 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();
}
|
Nach dem Login kopieren
3-4 [PDO] bindValue()方法绑定参数
向用户表插入数据:命名参数占位符,问号方式类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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 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();
}
|
Nach dem Login kopieren
3-5 [PDO] bindColumn()方法绑定参数

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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 ->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();
}
|
Nach dem Login kopieren
3-6 [PDO] fetchColumn()方法从结果集中返回一列
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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 );
echo $stmt ->fetchColumn(0), "<br/>" ;
echo $stmt ->fetchColumn(1), "<br/>" ;
echo $stmt ->fetchColumn(2);
} catch (PDOException $e ){
echo $e ->getMessage();
}
|
Nach dem Login kopieren
3-7 [PDO] debugDumpParams()方法打印一条预处理语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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 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();
}
|
Nach dem Login kopieren
四、PDO事务处理
主要介绍如何使用PDO进行事务处理
4-1 PDO错误处理模式
3种错误处理模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 静默模式
<?php
header('content-type:text/html;charset=utf-8');
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();
}
|
Nach dem Login kopieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php
header('content-type:text/html;charset=utf-8');
try {
$pdo = new PDO('mysql:host=localhost;dbname=school','root','root');
$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();
}
|
Nach dem Login kopieren
4-2 PDO事务处理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?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();
}
|
Nach dem Login kopieren
好了,以上就是关于本文介绍的关于PHP中PDO操作数据库的详细操作以及实例了,相了解更多相关问题请访问PHP中文网:
PHP视频教程
Das obige ist der detaillierte Inhalt vonAusführliche Tutorials und praktische Demonstrationen zur Anbindung an die Datenbank mit PDO in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!