PHP PDO 事务处理 预处理 高洛峰 细说PHP
admin
2023-06-06 22:01:57
0

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);





相关内容

热门资讯

香江警花,即将绽放于星空之间 潮新闻客户端 记者 屠晨昕 今天(23日)上午,神舟二十三号载人飞行任务新闻发布会,给了整个香港乃至...
美官员披露美伊即将签署协议的更... △霍尔木兹海峡(资料图)据美国方面23日消息,美国和伊朗即将达成一份协议,其中包括将停火再延长60天...
现代AI系统通过图灵测试首获证... 美国加州大学圣迭戈分校科学家开展了一项实证研究,首次证明现代人工智能(AI)系统通过了图灵测试。相关...
强劲“中国心” 国产自研600... 5月23日,内蒙古锡林郭勒盟上空传来轰鸣声:由我国自主研制的600公斤推力级F406涡扇发动机,双发...
留神峪矿难获救矿工讲述:自救器... 5月22日晚7时29分,山西留神峪煤矿发生瓦斯爆炸事故,已致82人死亡。据央视新闻,事故发生后,留神...
预祝圆满成功!李家超与黎家盈视... 据凤凰卫视报道,神舟二十三号载人飞船即将发射,乘组成员包括首位来自香港的航天员黎家盈。香港特区行政长...
《给阿嬷的情书》,票房超10亿... 据网络平台数据截至5月24日,2026年度电影总票房(含预售)已突破151亿元!其中,电影《给阿嬷的...
美媒称伊朗同意放弃高浓缩铀库存 新华社华盛顿5月23日电(记者黄强 颜亮)据美国媒体23日报道,作为美国与伊朗即将达成的协议中的一个...
全自动洗衣机进水管漏水怎么办 造成全自动洗衣机进水管漏水,要根据原因寻找解决办法,1、由于洗衣机进水管使用年限过长,部分出现损坏,...
电视机闪屏一下又黑屏 问答:1、电视显示屏出现短路或损坏等问题。2、电视的信号源出现干扰。3、电视内部的小零件损坏,如屏幕...