手记

PHP PDO 事务处理 预处理

PDO错误处理三种模式

/*

 * 数据库抽象层PDO

 * 一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成。

 * PDO::ERRMODE_SILENT

 * PDO::ERRMODE_WARNING

 * PDO::ERRMODE_EXCEPTION

 * 

 * PDO中的执行SQL语句的方法

 * 1.exec() 用来处理非结果集的 insert update delete create 返回影响行

 * 2.query() 用来处理有结果集的 select desc show

 * 

 * 两种都可以

 * $pdo->exec('set names utf8');

 * $pdo->query('set names utf8');

 * 

 */

 

        //mysql_connect('localhost','root','root');

       // mysql_select_db('test');

       $dsn           =     'mysql:dbname=test;host=localhost';

       $username =    'root';

       $passwd     =    'root';

       $options     =    array(

           PDO::ATTR_AUTOCOMMIT=>true,

           PDO::ATTR_PERSISTENT=>true

       );

       try{

                $pdo =  new PDO($dsn, $username, $passwd, $options);

       }catch(PDOException $e){

                echo "数据库连接失败:".$e->getMessage();

                exit;

       }

        echo '创建PDO对象成功!';

        echo $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_SERVER_VERSION).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_CASE).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS ).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_DRIVER_NAME).'<br/>';

        echo $pdo->getAttribute(PDO::ATTR_PERSISTENT).'<br/>';

        /*

        $query = "delete from helloworld";

        $affected_rows =    $pdo->exec($query);

         

        //PDO的错误处理模式(默认不提示,我们可能看不到问题)PDO::ERRMODE_SILENT

        if(!$affected_rows){

            echo $pdo->errorCode();

            echo '<br/>';

            echo '<pre>';

            print_r($pdo->errorInfo());

            echo '</pre>';            

        }

         

        //警告模式

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

        echo  $pdo->getAttribute(PDO::ATTR_ERRMODE);

        */

        //异常模式

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        try{

            //使用PDO中的方法执行语句

            //插入

            $query = "insert into users(username,password,email) values('xiaowang','123','xiaoming@163.com')";

            $affected_rows =    $pdo->exec($query);

             echo $pdo->lastInsertId();

           //查询

            $query  =   "select * from users";

            $result = $pdo->query($query);

            var_dump($result);

        }catch (PDOException $e){

            echo '错误的原因:'.$e->getMessage();

        }


PDO事务处理

/*

 * PDO事务处理

 */

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

    PDO::ATTR_AUTOCOMMIT=>true,

    PDO::ATTR_PERSISTENT=>true

);

try{

    //创建对象

    $pdo =  new PDO($dsn, $username, $passwd, $options);

    //设置错误使用异常模式

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //关闭自动提交(使用事务第一步)

    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

}catch(PDOException $e){

    echo "数据库连接失败:".$e->getMessage();

    exit;

}

 

try{

    //开启一个事务

    $pdo->beginTransaction();

    $price = 50;

    $statement = "update demo set salary=salary-{$price} where id=1";

    $a=$pdo->exec($statement);

    if($a>0){

        echo '转出成功!';

    }else{

        throw new PDOException('转出失败!');

    }

    $statement = "update demo set salary=salary+{$price} where id=3";

    $b=$pdo->exec($statement);

    if($b>0){

        echo '转入成功!';

    }else{

        throw new PDOException('转入失败!');

    }

    echo '交易成功!<br/>';

    //提交以上的操作

    $pdo->commit();

}catch (PDOException $e){

    echo '错误的原因:'.$e->getMessage();

    echo '交易失败!<br/>';

    //撤销所有的操作

    $pdo->rollBack();

}

 

//运行完成后开启自动提交

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);

PDO对预处理语句

/*

 * PDO对预处理语句

 * 1.效率问题 编译次数

 * 2.安全性问题  防止SQL注入     1 or 1='1' 

 * $query = "delete from demo where id='{$_GET['id']}' ";

 * 

 * 

 */

  

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

    PDO::ATTR_AUTOCOMMIT=>true,

    PDO::ATTR_PERSISTENT=>true

);

try{

    //创建对象

    $pdo =  new PDO($dsn, $username, $passwd, $options);

    //设置错误使用异常模式

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}catch(PDOException $e){

    echo "数据库连接失败:".$e->getMessage();

    exit;

}

 

try{

        $statement = "insert into users(username,password,email) values(?,?,?)";// ?表示占位

        //直接给数据库管理系统并执行

        //$pdo->query($statement);

        //给数据库管理系统,编译后等待 没有执行

        $pdostatement=$pdo->prepare($statement);

        //绑定参数(?) 将问号和一个变量关联起来  对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。         

        $pdostatement->bindParam(1, $username);

        $pdostatement->bindParam(2, $password);

        $pdostatement->bindParam(3, $email);

        //给变量赋值

        $username = 'lisiming1';

        $password = '1234';

        $email = 'lisiming@163.com';

        //PDOStatement::execute — 执行一条预处理语句         

        $pdostatement->execute();

         

        $username = 'lisiming2';

        $password = '1234';

        $email = 'lisiming@163.com';

        $pdostatement->execute();

         

}catch (PDOException $e){

    echo '错误的原因:'.$e->getMessage();

 

}

=======================================================================================

/*

 * PDO对预处理语句

 * 1.效率问题 编译次数

 * 2.安全性问题  防止SQL注入     1 or 1='1' 

 * $query = "delete from demo where id='{$_GET['id']}' ";

 * 

 * 

 */

  

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

    PDO::ATTR_AUTOCOMMIT=>true,

    PDO::ATTR_PERSISTENT=>true

);

try{

    //创建对象

    $pdo =  new PDO($dsn, $username, $passwd, $options);

    //设置错误使用异常模式

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}catch(PDOException $e){

    echo "数据库连接失败:".$e->getMessage();

    exit;

}

 

try{

        $statement = "insert into users(username,password,email) values(:username,:password,:email)";// :name 形式的参数名

        //直接给数据库管理系统并执行

        //$pdo->query($statement);

        //给数据库管理系统,编译后等待 没有执行

        $pdostatement=$pdo->prepare($statement);

        //绑定参数(?) 将问号和一个变量关联起来  对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。         

        $pdostatement->bindParam(':username', $username,PDO::PARAM_STR);

        $pdostatement->bindParam(':password', $password,PDO::PARAM_STR);

        $pdostatement->bindParam(':email', $email,PDO::PARAM_STR);

        //给变量赋值

        $username = 'lisiming3';

        $password = '1234';

        $email = 'lisiming@163.com';

        //PDOStatement::execute — 执行一条预处理语句         

        $pdostatement->execute();

         

        $username = 'lisiming4';

        $password = '1234';

        $email = 'lisiming@163.com';

        $pdostatement->execute();

         

}catch (PDOException $e){

    echo '错误的原因:'.$e->getMessage();

 

}

=======================================================================================

        $statement = "insert into users(username,password,email) values(?,?,?)";

        //给数据库管理系统,编译后等待 没有执行

        $pdostatement=$pdo->prepare($statement);

        $pdostatement->execute(array('xiaoli','123','xiaoli@163.com'));

=======================================================================================

        $statement = "insert into users(username,password,email) values(:username,:password,:email)";

        //给数据库管理系统,编译后等待 没有执行

        $pdostatement=$pdo->prepare($statement);

        $pdostatement->execute(array('username'=>'xiaoli1','password'=>'1123aa','email'=>'xiaoli1@163.com'));

=======================================================================================

/*

 * PDO对预处理语句

 * 1.效率问题 编译次数

 * 2.安全性问题  防止SQL注入     1 or 1='1' 

 * $query = "delete from demo where id='{$_GET['id']}' ";

 * fetch()

 * fetchAll()

 * setFetchMode()

 * 

 */

  

$dsn           =     'mysql:dbname=test;host=localhost';

$username =    'root';

$passwd     =    'root';

$options     =    array(

    PDO::ATTR_AUTOCOMMIT=>true,

    PDO::ATTR_PERSISTENT=>true

);

try{

    //创建对象

    $pdo =  new PDO($dsn, $username, $passwd, $options);

    //设置错误使用异常模式

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}catch(PDOException $e){

    echo "数据库连接失败:".$e->getMessage();

    exit;

}

 

try{

        $statement = "select * from users where id > ? and id < ?";

        //给数据库管理系统,编译后等待 没有执行

        $pdostatement=$pdo->prepare($statement);

        $pdostatement->execute(array(3,6));

        //设置结果的模式

        $pdostatement->setFetchMode(PDO::FETCH_NUM);        

        echo '<table border="1" width="800" align="center">';

        while(list($id,$username,$password,$email) = $pdostatement->fetch()){

           echo '<tr>';

           echo '<td>'.$id.'</td>';

           echo '<td>'.$username.'</td>';

           echo '<td>'.$password.'</td>';

           echo '<td>'.$email.'</td>';

           echo '</tr>';

            

        }

        echo '</table>';

         

}catch (PDOException $e){

    echo '错误的原因:'.$e->getMessage();

}

=======================================================================================

        //绑定栏目

        $pdostatement->bindColumn(1, $id);

        $pdostatement->bindColumn(2, $username);

        $pdostatement->bindColumn(3, $password);

        $pdostatement->bindColumn(4, $email);

=======================================================================================

        //绑定栏目

        $pdostatement->bindColumn('id', $id);

        $pdostatement->bindColumn('username', $username);

        $pdostatement->bindColumn('password', $password);

        $pdostatement->bindColumn('email', $email);




0人推荐
随时随地看视频
慕课网APP