PDO数据库抽象层

什么是PDO

PHP Data Object (PHP 数据对象)
数据库访问抽象层
用于统一各种数据库的访问接口

为什么要学习PDO

PDO特性:

  • 编码一致性
  • 灵活性
  • 高性能
  • 面向对象

PDO的配置和启用

1.配置PHP.ini文件,开启相应扩展

extension = php_pdo.dll

2.开启对相应数据库的扩展

extension=php_pdo_mysql.dll 

3.通过查看phpinfo查看PDO扩展的详细信息
配置完后需要重启PHP-FPM让其重新加载配置文件和生效

service php-fpm restart

PDO连接数据库

  1. 通过参数的形式连接数据库(建议用第一种比较好用)
  2. 通过uri的方式连接数据库
  3. 通过配置文件连接数据库

    通过参数的形式连接数据库

<?php //通过参数形式连接数据库 try{ //dsn 即data source name 数据源 $dsn='mysql:host=localhost;dbname=test'; $username='root'; $passwd='root'; $pdo=new PDO($dsn, $username, $passwd); var_dump($pdo); }catch(PDOException $e){ echo $e->getMessage(); } 

通过uri的形式连接数据库

<?php //通过uri的形式连接数据库 try{ $dsn='uri:file://H:\wamp\PHPnow-1.5.6.1428396605\htdocs\pdo\dsn.txt'; $username='root'; $passwd='root'; $pdo=new PDO($dsn,$username,$passwd); var_dump($pdo); }catch(PDOException $e){ echo $e->getMessage(); }

dsn.txt

mysql:dbname=test;host=localhost

通过配置文件连接数据库
先在php.ini中配置,然后重启apache加载配置,如下所示

[PHP]
;在php.ini中配置,然后重启apache加载配置
pdo.dsn.test="mysql:host=localhost;dbname=test"
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;

通过配置文件链接数据库

<?php /** *通过配置文件链接数据库 *在php.ini中配置,然后重启apache加载配置 */ try{ $dsn='test'; $username='root'; $passwd='root'; $pdo=new PDO($dsn,$username,$passwd); var_dump($pdo); }catch(PDOException $e){ echo $e->getMessage(); }

PDO对象的使用

exec()方法执行建表操作并插入一条记录

<?php 
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    //exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的记录,他返回0
    //exec对于select没有作用
    $sql=<<<EOF
        CREATE TABLE IF NOT EXISTS user(
        id INT(10) UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        password CHAR(32) NOT NULL,
        email VARCHAR(30) NOT NULL
        );
EOF;
    $res=$pdo->exec($sql);
    var_dump($res);    
    $sql='INSERT user(username,password,email) VALUES("king","'.md5('king').'","[email protected]")';
    //echo $sql;
    $res=$pdo->exec($sql);
    echo $res;
}catch(PDOException $e){
    echo $e->getMessage();
}

lastInsertId得到最后一次插入记录的id

<?php header('content-type:text/html;charset=utf-8'); try{ $pdo=new PDO('mysql:host=localhost;dbname=test','root','root'); //exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的记录,他返回0 //exec对于select没有作用 //插入多条记录 // $sql=<<<EOF // INSERT user(username,password,email) VALUES("king1","king1","[email protected]"), // ("king2","king2","[email protected]"), // ("king3","king2","[email protected]") //  //EOF; //echo $sql; $sql='INSERT user(username,password,email) VALUES("king6","king6","[email protected]")'; $res=$pdo->exec($sql); echo '受影响的记录的条数为:'.$res,'<br/>'; //$pdo->lastInsertId():得到新插入记录的ID号 echo '最后插入的ID号为'.$pdo->lastInsertId(); if(!$res) throw new PDOException("<br/>插入数据失败"); }catch(PDOException $e){ echo $e->getMessage(); }

exec()方法执行其他操作,exec()方法不能用于查询

<?php 
header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    //$sql='update user set username="king" where id=1';
    //$sql='delete from userwhere id=1';
    $sql='select * from user';
    $res=$pdo->exec($sql);
    //echo $res.'条记录被影响';
    var_dump($res);
//  echo '<hr/>';
//  echo $pdo->lastInsertId();
}catch(PDOException $e){
    echo $e->getMessage();
}

errorCode()和errorInfo()查看错误信息

<?php 
header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    $sql='delete from user12 where id=1';
    $res=$pdo->exec($sql);
    //echo $res.'条记录被影响';
    //var_dump($res);
    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);
    }
//  echo '<hr/>';
//  echo $pdo->lastInsertId();
}catch(PDOException $e){
    echo $e->getMessage();
}

query()方法执行查询语句

<?php 
header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    //$sql='select * from user where id=2';
    $sql='select id,username,email from user';
    //$pdo->query($sql),执行SQL语句,返回PDOStatement对象
    $stmt=$pdo->query($sql);
    var_dump($stmt);
    echo '<hr/>';
    foreach($stmt as $row){
        //print_r($row);
        echo '编号:'.$row['id'],'<br/>';
        echo '用户名:'.$row['username'],'<br/>';
        echo '邮箱:'.$row['email'],'<br/>';
        echo '<hr/>';
    }
}catch(PDOException $e){
    echo $e->getMessage();
}

query()方法执行插入语句,建议用exec()方法

<?php header('content-type:text/html;charset=utf-8'); try{ $pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root'); $sql='INSERT user(username,password,email) VALUES("king11","'.md5('king11').'","[email protected]")'; $stmt=$pdo->query($sql); var_dump($stmt); }catch(PDOException $e){ echo $e->getMessage(); }

prepare()和execute()执行查询语句
fetch()方法使用

<?php 
header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    $sql='select * from user where username="king11"';
    //prepare($sql):准备SQL语句
    $stmt=$pdo->prepare($sql);
    //execute():执行预处理语句
    $res=$stmt->execute();
    //var_dump($res);
    //fetch():得到结果集中的一条记录
    $row=$stmt->fetch();
    print_r($row);

    //var_dump($stmt);
}catch(PDOException $e){
    echo $e->getMessage();
}

setFetchMode()方法和fetchAll()方法使用

<?php 
header('content-type:text/html;charset=utf-8');
try{
    $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
    $sql='select * from user';
    $stmt=$pdo->prepare($sql);
    $res=$stmt->execute();
// if($res){
// while($row=$stmt->fetch(PDO::FETCH_OBJ)){
// print_r($row);
// echo '<hr/>';
// }
// }
// $rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($rows);
    echo '<hr/>';
    $stmt->setFetchMode(PDO::FETCH_ASSOC); //设置返回结果集的模式
    //var_dump($stmt);
    $rows=$stmt->fetchAll();
    print_r($rows);
}catch(PDOException $e){
    echo $e->getMessage();
}

设置数据库连接属性

<?php 
/** *getAttribute() 检索一个语句属性 *setAttribute()设置一个语句属性 */
header('content-type:text/html;charset=utf-8');
try{
    $dsn='mysql:host=localhost;dbname=test';
    $username='root';
    $passwd='root';
    $pdo=new PDO($dsn, $username, $passwd);
    echo '自动提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
    echo '<br/>';
    echo 'PDO默认的错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
    echo '<br/>';
    echo '自动提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
}catch(PDOException $e){
    echo $e->getMessage();
}

批量获取PDO属性

<?php /** *批量获取PDO属性 */ header('content-type:text/html;charset=utf-8'); try{ $dsn='mysql:host=localhost;dbname=test'; $username='root'; $passwd='root'; $pdo=new PDO($dsn, $username, $passwd); $attrArr=array( 'AUTOCOMMIT','ERRMODE','CASE','PERSISTENT','TIMEOUT','ORACLE_NULLS', 'SERVER_INFO','SERVER_VERSION','CLIENT_VERSION','CONNECTION_STATUS' ); foreach($attrArr as $attr){ echo "PDO::ATTR_$attr: "; echo $pdo->getAttribute(constant("PDO::ATTR_$attr")),'<br/>'; } }catch(PDOException $e){ echo $e->getMessage(); }
<?php 
header('content-type:text/html;charset=utf-8');
try{
    $dsn='mysql:host=localhost;dbname=imooc';
    $username='root';
    $passwd='root';
    $options=array(PDO::ATTR_AUTOCOMMIT=>0,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
    $pdo=new PDO($dsn, $username, $passwd, $options);
    echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
    echo '<br/>';
    echo $pdo->getAttribute(PDO::ATTR_ERRMODE);
}catch(PDOException $e){
    echo $e->getMessage();
}

你可能感兴趣的:(PHP,pdo)