第二部分PDO详解--个人学习笔记

第二部分PDO详解
尽量使用外部的Apche服务,比如Xampp的集成环境,具体如何在PHPStorm如何更改,请参见
http://blog.csdn.net/yellowstar5/article/details/52652962

1.PDO 使得数据库更换方便
    pdo开启方式 php.ini文件中搜索php_pdo
    前面的分号去掉表示开启
    extension=php_pdo.dll(父扩展,就是驱动确保开启,前面的分号去掉表示开启)
    echo php_info();查看那些已经开启
    如果扩展不全,自己可以将其放在Php目录下的ext目录下如Php_pdo
    **高版本的php里面已经没有php_pdo.dll了,所有的连接都直接集成到php_pdo_xxx.dll中了**
    所以你只要php_pdo_xxx.dll前面的;被去掉即可
2.PHP manual
    静态方法或者静态成员在外部采用类名::+方法名/变量名访问
    内部采用self::方法名/变量名
    /单例类(目的是为了产生唯一的对象
    class A{
        private static  $single;
        private function __construct(){

        }
        static function makeA(){
            if(A::$single==null){
                A::$single=new self();
            }
            return A::$single;
        }
    }
    print_r(A::makeA());
PDO 成员对象方法
    1.query($sql) 用于执行查询sql语句,返回pdostatement对象
    2.exec($sql) 用于执行增删改操作,返回影响的行数
    3.setAttribute()设置PDO对象属性$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    4.fetchAll()用于解析数据

更常用的方式

1.连接数据库,及读取和增删改
try{
    $pdo=new PDO("uri:mysqlPDO.ini",
        'root','');
}
catch (Exception $e){
    die($e->getMessage());
}
//这是快捷的操作
//$sql="select * from users";
//
////3.解析数据 foreach 语法
//foreach ($pdo->query($sql) as $val){
// echo $val['id']." ".$val['name'].$val['age']."<br>";
//}
//$sql="insert into users values(null,'YellowStar',20)";

//$sql="delete from users where id=26 ";
$sql="update users set name='mylove' where id=27";
$affectRow=$pdo->exec($sql);
if($affectRow==1)
        echo 'success';
//4.释放资源
$pdo=null;

连接数据库的方式及传统的读取
1.连接数据库
    try{
         $pdo=new PDO("mysql:host=localhost;dbname=myapp",
    // 'root','');
        $pdo=new PDO("uri:mysqlPDO.ini",'root','');//mysqlPDO.ini为同一目录下的配置文件

    // $pdo=new PDO("mysqlpdo",'root','');//在php.ini中声明的,但好像不行
    [PDO]
    pdo.dsn.mysqlpdo=mysql:host=localhost;dbname=myapp
    }
    catch (Exception $e){
        die($e->getMessage());
    }
    //执行query返回一个预处理对象
    $sql="select * from users";
    $stas=$pdo->query($sql);
    //$list=$stas->fetchAll();
    $list=$stas->fetchAll(PDO::FETCH_ASSOC);//返回的都是关联的,没有以数字为键的
    //print_r($list);
    //3.解析数据 foreach 语法
    foreach ($list as $val){
        echo $val['id']." ".$val['name'].$val['age']."<br>";
    }
    //4.释放资源
    $stas=null;
    $pdo=null;
2.PDO Exception的使用
PDO 异常处理介绍
PDO::ATTR_ERRMODE
 1.PDO::ERRMODE_SILENT //默认是不现实的
        默认是不提示的,需要用
        echo $pdo->errorCode()."<br>";
        print_r($pdo->errorInfo());
 2.PDO::ERRMODE_WARINING //已警告的方式报错
 3.PDO::ERRMODE_EXCEPTION //以异常的方式报错,最常用
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        setAttribute();
        getAttrubute();


    */
    try{
        $pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
    // $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
        //方式二,设置PDO为报警的模式
        //最常用方式三,设置PDO为异常模式
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }
    catch (Exception $e){
        die('连接数据库失败'.$e->getMessage());
    }
    // print_r($pdo);
    try{
        $sql="insert into userrs values(null,'Codercuixin',22)";
        $result=$pdo->exec($sql);
        if($result==0){
    // echo 'insert failure<br>';
    // echo $pdo->errorCode()."<br>";
    // print_r($pdo->errorInfo());
        }
        else{
            echo 'insert success';

        }

    }catch (PDOException $e){
        print_r( $e->errorInfo);
    }
3.PDO预处理
     1.prepare()用于执行sql语句,返回PDOstatement对象
     2.bindvalue()将值绑定到对应的一个参数,返回布尔值
     3.bindParam()将参数绑定到相应的查询占位符上,返回布尔值
     4.bindColumn()用来匹配列名和一个指定的变量名
     5.执行一个准备好了的预处理语句,返回布尔值
     6.rowCount()返回使用增删改查操作语句后受到影响的行总数。
         1.?方式的预处理语句,一共有三种绑定方式
             $statement->execute(array(null,'python',3));最简洁
             /预处理的sql语句
            $sql="insert into users(id,name,age) values(?,?,?)";
            $statement=$pdo->prepare($sql);
            //第三种绑定方式
            $statement->execute(array(null,'python',3));
            //执行
            //$statement->execute();
            echo $statement->rowCount();

            //对?号进行参数绑定,第一种绑定方式
            //$statement->bindValue(1,null);
            //$statement->bindValue(2,'php');
            //$statement->bindValue(3,10);

            //第二种绑定方式
            //$id=null;
            //$name='java';
            //$age=16;
            //$statement->bindParam(1,$id);
            //$statement->bindParam(2,$name);
            //$statement->bindParam(3,$age);
            //$id=null;
            //$name='java';
            //$age=16;

        2.别名方式的预处理语句,也有三种绑定方式(只当做知识点,并没有?的好用)
            //预处理的sql语句
            $sql="insert into users(id,name,age) values(:id,:name,:age)";
            $statement=$pdo->prepare($sql);
            //对?号进行参数绑定,第一种绑定方式
            //$statement->bindValue("id",null);
            //$statement->bindValue("name",'c');
            //$statement->bindValue("age",10);

            //第二种绑定方式
            //$id=null;
            //$name='c++';
            //$age=16;
            //$statement->bindParam("id",$id);
            //$statement->bindParam("name",$name);
            //$statement->bindParam("age",$age);
            //第三种绑定方式 
            $statement->execute(array('id'=>null,
            'name'=>'javascript','age'=>10));
            //执行
            //$statement->execute();
            echo $statement->rowCount();
        3.采用预处理方式Sql执行查询
            $sql='select * from users';
            $statement=$pdo->prepare($sql);
            $statement->execute();
            //采用foreach输出
            //foreach ($statement as $row){
            // echo $row['id'].' '.$row['name'].' '.$row['age']."<br>";
            //}
            //采用bindColumn输出
            $statement->bindColumn(1,$id);
            $statement->bindColumn(2,$name);
            $statement->bindColumn('age',$age);
            while($row=$statement->fetch(PDO::FETCH_COLUMN)){
                echo "$id $name $age<br>";

4.PDO事务处理(要么都成功,要么都失败)
    1.数据表需要InnoDB类型
    2.beginTransaction() 开启一个事物作为一个回滚点
    3.commit()提交事物
    4.rollback 事物回滚操作
    //采用预处理+事物处理执行sql操作
    1.方法一 exception

        $pdo=null;
        try{
            $pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e){
            die('连接数据库失败' . $e->getMessage());
        }
        try{
            //开启事物
            $pdo->beginTransaction();
            $sql="insert into users values(?,?,?)";
            $stmt=$pdo->prepare($sql);
            //传入参数
            $stmt->execute(array(null,'hello',1));
            $stmt->execute(array(null,'hello',1));
            $stmt->execute(array(null,'hello',1));
            $pdo->commit();
        }
        catch (PDOException $e){
            die('执行失败' . $e->getMessage());
            $pdo->roolback();
        }
    2.方法二 foreach遇到错误就跳出
        $pdo=null;
        try{
            $pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e){
            die('连接数据库失败' . $e->getMessage());
        }
            //开启事物
            $pdo->beginTransaction();
            $sql="insert into users values(?,?,?)";
            $stmt=$pdo->prepare($sql);
            $datalist=array(array(null,'hello',1),
                array(null,'hello',1),array(null,'hello',1));
        $needCommit=true;
        //传入参数
            foreach($datalist as $item){
                $stmt->execute($item);
                if($stmt->errorCode()>0){
                    $pdo->rollBack();
                    $needCommit=false;
                    echo 'operation failure';
                    break;
                }
            }
            if($needCommit)
            $pdo->commit();
5.PDO增删改 如果是字符串类型必须加''(如'{$name}'),如果是整形的则不加where id={$id} 
    action="action.php?action=add"
    <input type="hidden" name="id" value="<?php echo $stu['id'];?>">
    <td><input type="text" name="name" value="<?php echo $stu['name']?>"></td>  
    $sql="insert into student values(null,'{$name}','{$sex}','{$age}','{$classId}')";
    $sql="delete from student where id={$id}";
    $sql="update student set name='{$name}',sex='{$sex}',age='{$age}',classId='{$classId}' where id={$id}";

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