旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

有关PHP中PDO衔接数据库的细致教程与实际操作演示【php教程】,PDO

作者:搜教程发布时间:2019-12-01分类:PHP教程浏览:71评论:0


导读:PDO—数据库笼统层简介:PDO扩大为PHP接见数据库定义了一个轻量级的、一致性的接口,PDO处理了数据库衔接不一致的题目。一、PDO简介本章重要引见PDO的装置...
PDO—数据库笼统层

简介:PDO扩大为PHP接见数据库定义了一个轻量级的、一致性的接口,PDO处理了数据库衔接不一致的题目。

一、 PDO简介

本章重要引见PDO的装置与设置,以及运用PDO衔接数据库的要领。

1-1PDO简介

PDO是PHP Data Object(PHP数据对象)的简称,它是与PHP5.1版本一同宣布的,现在支撑的数据库包括Firebird、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) { }

二、 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操纵数据库的细致操纵以及实例了,相相识更多相干题目请接见ki4网:

PHP视频教程

以上就是有关PHP中PDO衔接数据库的细致教程与实际操纵演示的细致内容,更多请关注ki4网别的相干文章!

标签:PDO


欢迎 发表评论: