设为首页 收藏本站
查看: 1125|回复: 0

[经验分享] PHP PDO 事务处理 预处理 高洛峰 细说PHP

[复制链接]

尚未签到

发表于 2018-12-16 06:22:36 | 显示全部楼层 |阅读模式
  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).'';
        echo $pdo->getAttribute(PDO::ATTR_SERVER_VERSION).'';
        echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT).'';
        echo $pdo->getAttribute(PDO::ATTR_CASE).'';
        echo $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS ).'';
        echo $pdo->getAttribute(PDO::ATTR_DRIVER_NAME).'';
        echo $pdo->getAttribute(PDO::ATTR_PERSISTENT).'';
        /*
        $query = "delete from helloworld";
        $affected_rows =    $pdo->exec($query);
        //PDO的错误处理模式(默认不提示,我们可能看不到问题)PDO::ERRMODE_SILENT
        if(!$affected_rows){
            echo $pdo->errorCode();
            echo '';
            echo '';
            print_r($pdo->errorInfo());
            echo '';            
        }
        //警告模式
        $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 '交易成功!';
    //提交以上的操作
    $pdo->commit();
}catch (PDOException $e){
    echo '错误的原因:'.$e->getMessage();
    echo '交易失败!';
    //撤销所有的操作
    $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 '';
        while(list($id,$username,$password,$email) = $pdostatement->fetch()){
           echo '';
           echo ''.$id.'';
           echo ''.$username.'';
           echo ''.$password.'';
           echo ''.$email.'';
           echo '';
        }
        echo '';
}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);  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-651800-1-1.html 上篇帖子: PHP读取微信超时,'curl出错,错误码:28' 下篇帖子: PHP memcache 内存缓存 数据库查询 应用 高洛峰 细说PHP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表