前端学PHP之PDO基础操作

前方的话

  PDO(php data
object)扩充类库为php访问数据库定义了轻量级的、一致性的接口,它提供了二个数据库访问抽象层,那样,无论使用什么数据库,都足以因此平等的函数执行查询和获取数据,大大简化了数据库的操作,并能够屏蔽区别数据库之间的距离,使用PDO能够很有益地展开跨数据库程序的付出,以及分歧数据库间的移植,是他日php在数据库处理地点的严重性发展趋势,它能够支撑mysql、postgresql、oracle、mssql等两种数据库

 

创建PDO对象

  使用PDO在与差别数据库管理种类里头互相时,PDO对象中的成员方法是统一各个数据库的访问接口,所以在采取PDO与数据库举行互相以前,首先要创立3个PDO对象。在经过构造方法创设对象的还要,须求建立3个与数据库服务器的连接,并采纳贰个数据库

  PDO的构造方法原型如下

__construct ( string $dsn [,string $username [,string $password [,array $driver_options ]]] )

  在构造方法中,第⑥个必选的参数是数量源名(dsn),用来定义3个显然的数据库和必须选用的驱动程序。DSN的PDO命名惯例为PDO驱动程序的名号,前面为2个冒号,再前面是可选的驱动程序的数据库连接变量音讯,如主机名、端口和多少库名

  构造方法中的第3个参数username和第⑥个参数password分别钦点用于连接数据库的用户名和密码。最后一个参数driver_options须要二个数组,用来钦命连接所需的拥有额外选项,传递附加的调优参数到PDO或底层驱动程序

/*连接如果失败,使用异常处理模式进行捕获 */
$dsn = 'mysql:dbname=pdotest;host=127.0.0.1'; //连接MySQL数据库的DSN 
$user = 'root'; //MySQL数据库的用户名
$password = '*****'; //MySQL数据库的密码
try { 
     $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
      echo '数据库连接失败: ' . $e->getMessage(); 
}

  在开创PDO对象时,有一部分与数据库连接相关的选项,可以将须要的几个采用组成数据传递给构造方法的第陆个参数driver_opts中,用来传递附加的调优参数到PDO或底部驱动程序

 PDO::ATTR_AUTOCOMMIT): PDO是否关闭自动提交功能
 PDO::ATTR_ERRMODE): 当前PDO的错误处理的模式 
 PDO::ATTR_CASE): 表字段字符的大小写转: 
 PDO::ATTR_CONNECTION_STATUS): 与连接状态相关特有信息: 
 PDO::ATTR_ORACLE_NULLS): 空字符串转换为SQL的null 
 PDO::ATTR_PERSISTENT): 应用程序提前获取数据大 
 PDO::ATTR_SERVER_INFO): 与数据库特有的服务器信 
 PDO::ATTR_SERVER_VERSION): 数据库服务器版本号信息
 PDO::ATTR_CLIENT_VERSION): 数据库客户端版本号信息 

//设置持久连接的选项数组作为最后一个参数,可以一起设置多个元素 
$opt = array(PDO::ATTR_PERSISTENT => true);   
try { 
       $db = new PDO('mysql:dbname=pdotest;host=127.0.0.1','root','*****',$opt); 
} catch (PDOException $e) { 
       echo "数据库连接失败: " .$e->getMessage(); 
}

 

使用PDO对象

调整PDO的表现性质

  在PDO对象中有成都百货上千属性用来调动PDO的行事或取得底层驱动程序状态。假如在制造PDO对象时,没有在构造方法中最终一个参数过属性选项,也足以在指标成立达成现在,通过PDO对象中的setAttribute()和getAttribute()方法设置和得到那一个属性的值

PDO::getAttribute()

  PDO::getAttribute()用于取回二个数据库连接的性格

mixed PDO::getAttribute ( int $attribute )

PDO::setAttribute()

  PDO::setAttribute()用于安装属性

bool PDO::setAttribute ( int $attribute , mixed $value )

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$dbh->setAttribute(3,2); 
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//$dbh->setAttribute(0,0); 
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
//$dbh->setAttribute(19,2); 

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

错误处理

  PDO一共提供了三种分歧的错误处理形式,不仅能够满意分裂风格的编制程序,也得以调动增添处理错误的艺术

PDO:ERRORMODE_SILENT

  那是暗许形式,在错误产生时不进行别的操作,PDO将只设置错误代码。开发人员能够经过PDO对象中的errorCode()和errorInfo()方法对讲话和数据库对象开始展览自作者批评。如果不当是出于对讲话对象的调用而发生的,那么能够在尤其语句对象上调用errorCode()或errorInfo()方法。假如不当是出于调用数据库对象而产生的,那么能够在老大数据库对象上调用上述七个点子

PDO:ERRMODE_WARNING

  除了设置错误代码以外,PDO还将生出一条PHP古板的E_WAKoleosNING音讯,能够选择正规的PHP错误处理程序捕获该警告。假使只是想看看发生了什么难点,而无心中断应用程序的流程,那么在调节或测试中那种装置很有用

$dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//设置警告模式处理错误

PDO:ERRMODE_EXCEPTION

  除了安装错误代码以外,PDO还将抛出一个PDOException,并设置其质量,以显示错误代码和错误新闻。那种装置在调节中也很有用,因为它会推广脚本中发出错误的地方,从而能够11分飞速地提议代码中非常的秘闻区域。很是格局另1个立竿见影的地点是,与价值观的PHP风格的警戒相比较,能够更分明地布局本人的错误处理,而且,比起以安静格局及显式检查各类数据库调用的重回值,相当格局代码及嵌套代码也更少

$dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置异常模式处理错误

执行SQL语句

  在使用PDO执行查询数据此前,先提供一组有关的多寡。成立PDO对象并透过mysql驱动连接mysql数据库服务器,创制3个以’testdb’命名的数据库,并在该数据库中开创八个关联人音讯表contactInfo

CREATE TABLE contactInfo(
    uid MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    departmentID CHAR(3) NOT NULL,
    address VARCHAR(80) NOT NULL,
    phone VARCHAR(20),
    email VARCHAR(20),
    PRIMARY KEY(uid)
);

  数据表contactInfo建立之后,向表中插入多行记录

INSERT INTO contactInfo(name,departmentID,address,phone,email) VALUES ('张三','D01','朝阳','15011111234','zs@aaa.com'),('李四','D02','朝阳','15011112345','ls@aaa.com'),('王五','D02','海淀','15011113456','ww@aaa.com'),('赵四','D01','海淀','15011114567','zx@aaa.com');

图片 1

PDO::exec()

  PDO::exec()函数执行一条SQL语句,并回到受影响的行数

int PDO::exec ( string $statement )

  当执行INSEEvoqueT、UPDATE、DELETET等没有结果集的询问时,使用PDO对象中的exec()方法去履行。该方法成功施行后,将回来受影响的行数

<?php
try {
    //创建对象
    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");
}catch(PDOException $e) {
    echo "数据库连接失败:".$e->getMessage();
    exit;
}

$query = "UPDATE contactInfo SET phone='12345678900' WHERE name='张三'";
$affected = $dbh->exec($query);
if($affected){
    //数据表contactInfo中受影响的行数为:1
    echo '数据表contactInfo中受影响的行数为:' .$affected;
}else{
    print_r($dbh->errorInfo());
}
$query = "UPDATE contactInfo SET phone='123456789' WHERE (uid%2 = 0)";
$affected = $dbh->exec($query);
if($affected){
    //数据表contactInfo中受影响的行数为:2
    echo '数据表contactInfo中受影响的行数为:' .$affected;
}else{
    print_r($dbh->errorInfo());
}
?>

图片 2

PDO::lastInsertId()

  PDO::lastInsertId()函数用于再次来到最终插入行的ID或连串值

string PDO::lastInsertId ([ string $name = NULL ] )

<?php
try {
    //创建对象
    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");
}catch(PDOException $e) {
    echo "数据库连接失败:".$e->getMessage();
    exit;
}

try{
    $query = "INSERT INTO contactInfo(name,departmentID,phone,email) VALUES ('诸葛','D03','120120120','zg@aaa.com')";
    $affected = $dbh->exec($query);    
    echo $affected."<br>";//1
    echo $dbh->lastInsertId();//5
}catch(PDOException $e){
    echo "错误:" .$e->getMessage();
}
?>

图片 3

PDO::query()

  当执行回来结果集的SELECT查询时,大概所影响的行数非亲非故主要时,应当利用PDO对象中的query()方法。要是该措施成功实施钦命的查询,则赶回二个PDOStatement对象。若是采纳了query()方法,并想打听获取的多少行总数,能够行使PDOStatement对象中的rowCount()方法得到

PDOStatement::rowCount()

  PDOStatement::rowCount()函数再次回到受上2个 SQL 语句影响的行数

int PDOStatement::rowCount ( void )

<?php
try {
    //创建对象
    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");
}catch(PDOException $e) {
    echo "数据库连接失败:".$e->getMessage();
    exit;
}
$query = "SELECT name,phone,email FROM contactInfo WHERE departmentId='D01'";
try{
    $pdostatement = $dbh->query($query);    
    echo "一共从表中获取到".$pdostatement->rowCount()."条记录:<br>";
    foreach($pdostatement as $row){
        echo $row['name'] ."\t";
        echo $row['phone'] ."\t";
        echo $row['email'] ."<br>";
    }
}catch (PDOException $e){
    echo $e->getMessage();
}
?>

图片 4

 

事务处理

  事务是承保数据库一致的机制,是一个或一多种的查询,作为3个单元的一组有序的数据库操作。固然组中的全部SQL语句都操作成功,则以为工作成功,事务则被交给,其修改将功能于拥有其余数据库进度。就算在作业的组中唯有二个环节操作战败,事务也不成功,则全体育赛事情将被回滚,该事情中具有操作都被裁撤。事务功效是同盟社级数据库的2个重庆大学片段,因为不少政工业经济过都席卷八个步骤。假若别的叁个手续失利,则怀有手续都不应爆发。事务处理有5个特征:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即ACID。对于在1个事情中施行的任何工作,就算它是分等级举行的,也势必可以确认保障该工作会安全地利用于数据库,并且在做事被提交时,不相会临其余连接的震慑

  MySQL近日只有InnoDB和BDB多少个数据库表类型才支撑工作,三个表类型具有同样的特色,InnoDB表类型具有比BDB还添加的风味,速度更快,因而建议利用InnoDB表类型。创造InnoDB类型的表实际上与创设任何别的类型表的经过并未分别,即使数据库没有安装为暗中同意的表类型,只要在成立时显式内定要将表创造为InnoDB类型

  要落实事务处理,首先要采纳InnoDB引擎

ALTER TABLE contactInfo engine=innodb;

图片 5

  在暗中认可的事态下,MySQL是以自行提交(autocommit)形式运转的,那就表示所进行的每2个言辞都将立即写入数据库中。但一旦利用工作安全的表格类型,是不期待有活动
提交的表现的,所以要在近期的对话中关闭自动提交

SET AUTOCOMMIT = 0;//在当前的会话中关闭自动提交

  假使提交被打开了,必须拉开叁个事情;尽管自动提交是关门的,则不必要使用那条命令,因为输入二个SQL命令时,三个作业将活动运转

START TRANSACTION;//开启一个事务

  在形成了一组织工作作的语句输入后,供给交给三个作业,该工作才能在其余会话中被其余用户所见

COMMIT;//提交一个事务给数据库

  假使更改注意,可以回滚到在此以前的景况

ROOLBACK;//事务被回滚,所有操作都被取消

  事务处理完毕后,再一次开启自动提交

SET AUTOCOMMIT = 1;

图片 6

  上边在PHP中开展事务处理操作,对张三和李四进行部门交换到轮流培育

<?php
try {
    //创建对象
    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "123456");
    //设置错误使用异常的模式
    $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //关闭自动提交
    $dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
}catch(PDOException $e) {
    echo "数据库连接失败:".$e->getMessage();
    exit;
}
try {
    //开启一个事务
    $dbh -> beginTransaction();
    $affected_rows = $dbh->exec("UPDATE contactInfo set departmentID = 'D02' where uid=1");
    if($affected_rows > 0) {
        echo "张三转岗成功!<br>";
    } else {
        throw new PDOException("张三转岗失败!<br>");
    }
    $affected_rows = $dbh-> exec("UPDATE contactInfo set departmentID = 'D01' where uid=2");
    if($affected_rows) {
        echo "李四转岗成功!<br>";
    }else {
        throw new PDOException("李四转岗失败!<br>");
    }
    echo "轮岗成功!<br>";
    //提交以上的操作
    $dbh->commit();    
}catch(PDOException $e) {
    echo "错误:".$e->getMessage();
    echo "转岗失败!<br>";
    //撤销所有操作
    $dbh -> rollback();
}
//运行完成以后, 最后开启自动提交
$dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
?>

图片 7

相关文章