文章目录
继上两章节的内容,我们使用了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。