捕获PDO下SQL语句中的错误之 PDO::ERRMODE_WARN|NG、PDO::ERRMODE_ EXCEPTION、PDO::ERRMODE_SILENT

继上两章节的内容,我们使用了PDO方式连接数据库,但是PDO方式在执行SQL语句的时候,即使语句有问题,默认也是不会报错的,那么我如何才能查看到错误信息呢,请跟笔者来学习本篇文章,?

一、使用默认模式——PDO::ERRMODE_SILENT

通过prepare()和execute()方法向数据库中添加数据,设置PDOStatement对象的errorCode属性,手动检测代码中的错误
示例:
数据库截图:
在这里插入图片描述
这里我们故意写一条错误的sq语句, 在表名后面多加一个s语句像数据库增加数据,并且把错误信息捕获。
注:如果我们不手动捕获的话,PDO是不会返回任何信息的。
代码:

<?php
    if($_POST['Submit']=='提交' && $_POST['pdo']!=''){
        $dbms='mysql';
        $host='localhost';
        $dbName='db_database17';
        $user='root';
        $pass='123456';
        
        $dsn="$dbms:host=$host;dbname=$dbName";

        $pdo = new PDO($dsn,$user,$pass);
        $query ="insert into tb_pdo_mysqls(pdo_type,database_name,dates)values('".$_POST['pdo']."','".$_POST['database']."','".$_POST['dates']."')";
        $result=$pdo->prepare($query);
        $result->execute();

        $code=$result->errorCode();
        if(empty($code)){
            echo '数据添加成功!';
        }else{
            echo "数据库错误<br/>";
            echo "SQL Query:".$query;
            echo '<pre>';

            echo ("Error:".$result->errorInfo()[2]);
            echo '</pre>';
        }
    }
?>

如图:
在这里插入图片描述
成功把我们的错误信息捕获。

二、使用警告模式——PDO::ERRMODE_WARN|NG

设置属性使用 : PDO::setAttribute
我们使用 PDO::setAttribute 给pdo对象设置 出错模式(PDO::ATTR_ERRMODE) 的方式为,PDOERRMODE_WARNING
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);详细请查看示例2.2

2.1 解决 该网页无法正常运作 目前无法处理此请求,HTTP ERROR 500

注意:
如果此处的警告信息没有弹出的话,可能是因为 由于php.ini配置文件中错误显示关闭导致.
需要将 php.ini 里边的下述值改为 on!
display_errors = On
display_startup_errors = On

示例(2.2):
此处我们也是故意写错了表名,真实的表名并没有 s,,目的是用于触发这个警告提示。

<?php
    $dbms='mysql'; //数据库类型
    $host='localhost';  //数据库主机名
    $dbName='db_database17';//使用的数据库名称
    $user='root';
    $pass='123456';

    $dsn="$dbms:dbname=$dbName;host=$host";

    try {
        
        $pdo = new PDO($dsn,$user,$pass);
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
        $query = "select * from tb_pdo_mysqls";
        $result = $pdo->prepare($query);//准备查询语句
        $result->execute();//执行查询语句,并返回结果集

        while($res=$result->fetch(PDO::FETCH_ASSOC)){
            ?>
                <tr>
                    <td height='22' align='center' valign='middle'><?php echo $res['id'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['pdo_type'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['database_name'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['dates'] ?></td>
                </tr>
            <?php
        }
    } catch (Exception $e) {
        die("Error:".$e->getMessage()."<br>");
    }
?> 

效果:
在这里插入图片描述
可以看到,警告信息成功弹出!

三、异常模式——PDO::ERRMODE_ EXCEPTION

异常模式会创建一个PDOException,并设置errorCode属性。它可以将执行代码封装到一个try{…}catch{…}语句块中。未捕获的异常将会导致脚本中断,并显示堆栈跟踪让你了解是哪里出现的问题。

<?php
    $dbms='mysql'; //数据库类型
    $host='127.0.0.1';  //数据库主机名
    $dbName='db_database17';//使用的数据库名称
    $user='root';
    $pass='123456';

    $dsn="$dbms:dbname=$dbName;host=$host";

    try {
        
        $pdo = new PDO($dsn,$user,$pass);

        $query = "select * from tb_pdo_mysql";
        $result = $pdo->prepare($query);//准备查询语句
        $result->execute();//执行查询语句,并返回结果集

        while($res=$result->fetch(PDO::FETCH_ASSOC)){
            ?>
                <tr>
                    <td height='22' align='center' valign='middle'><?php echo $res['id'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['pdo_type'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['database_name'] ?></td>
                    <td align='center' valign='middle'><?php echo $res['dates'] ?></td>
                    <td align='center' valign='middle'><a target="_black" href="delete.php?conn_id=<?php echo $res['id']; ?>">删除</a></td>
                </tr>
            <?php
        }
    } catch (PDOException $e) {
        die("Error:".$e->getMessage()."<br>");
    }
?>
delete.php

此处我们也是故意写错了表名,真实的表名并没有 s,,目的是用于触发这个异常提示。

<?php
    header("Content-type:text/html;charset=utf-8");
    if($_GET['conn_id']!=''){
        $dbms='mysql'; //数据库类型
        $host='127.0.0.1';  //数据库主机名
        $dbName='db_database17';//使用的数据库名称
        $user='root';
        $pass='123456';

        $dsn="$dbms:dbname=$dbName;host=$host";

        try {
            $pdo= new PDO($dsn,$user,$pass);
            // 设置出错模式 为 异常
            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            
            $query = "delete from tb_pdo_mysqls where ID=:id";
            $result = $pdo->prepare($query);

            $result->bindParam(':id',$_GET['conn_id']);

            $result->execute();

        } catch (PDOException $th) {
            echo "捕获到PDO异常:<br>";
            echo 'SQL Query:'.$query."<br>";
            echo '<pre>';
            echo 'Error:'.$th->getMessage()."<br>";
            echo '</pre>';
        }
    }
?>

效果:
当点击删除过后,我们会跳转到delete.php 因为sql语句里的表名不正确,所以会触发error。
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅哥cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值