PDO中捕获SQL语句中的错误
$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接用户名
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
$pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="insert into user (username,password) values('admin')";//须要运行的sql语句
$res=$pdo->prepare($query);
$res->execute();
$code=$res->errorCode();
echo $code.'<br>';
if($code==00000){//假设没有不论什么错误, errorCode() 返回的是: 00000 ,否则就会返回一些错误代码
echo "数据加入成功";
}else{
echo "数据库错误:<br>";
echo 'SQL Query:'.$query;
echo '<pre>';
var_dump($res->errorInfo());
echo '<pre>';
}
执行结果例如以下
21S01
数据库错误:
SQL Query:insert into user (username,password) values('admin')array(3) {
[0]=>
string(5) "21S01"
[1]=>
int(1136)
[2]=>
string(47) "Column count doesn't match value count at row 1"
}
使用警告模式-----PDO::ERRMODE_WARNING
警告模式会产生一个PHP警告,并设置errorCode属性。 假设设置的是警告模式,那么除非明白的检查错误代码,否则程序将继续依照其方式执行。
比如:
设置警告模式,通过prepare()和execute()方法读取数据库中数据。而且通过while语句和fetch()方法完毕数据的循环输出,体会在设置成警告模式后运行错误的SQL的语句。
$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接用户名
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//设置为警告模式
$query = "select * from userrr";//须要运行的sql语句
$res = $pdo->prepare($query);//准备查询语句
$res->execute();
while ($result = $res->fetch(PDO::FETCH_ASSOC)) {//while循环输出查询结果集并设置结果集以关联数组的形式返回。
echo $result['id'] . " " . $result['username'] . " " . $result['password'];
}
}catch(PDOException $e){
die("ERROR!:".$e->getMessage().'<br>');
}
echo "继续继续继续继续继续继续继续";
执行结果例如以下:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.userrr' doesn't exist in D:\wampserver\www\test\test\index1.php on line 14
继续继续继续继续继续继续继续
可以看出在设置警告模式后。假设SQL语句出现错误将给出一个提示信息,可是程序仍可以继续运行下去。
使用异常模式----PDO::ERRMODE_EXCEPTION
异常模式将会创建一个PDOException,并设置errorCode属性,它能够将运行代码封装到一个try{}catch{}语句块中。未捕获的异常将会导致脚本中断。并显示堆栈跟踪让用户了解是哪里出现了问题。
比如:
删除一个错误的数据表中的信息
$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接username
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置异常模式
$query = "delete from userrr where id=1";//须要运行的sql语句
$res = $pdo->prepare($query);//准备删除语句
$res->execute();
}catch(PDOException $e){
echo 'PDO Exception Caught: ';
echo "Error with the database:<br>";
echo 'SQL Query:'.$query;
echo '<pre>';
echo "ERROR:".$e->getMessage().'<br>';
echo "Code:".$e->getCode().'<br>';
echo "File:".$e->getFile().'<br>';
echo "Line:".$e->getLine().'<br>';
echo "Trace:".$e->getTraceAsString().'<br>';
echo '</pre>';
}
执行结果:
PDO Exception Caught: Error with the database:
SQL Query:delete from userrr where id=1ERROR:SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.userrr' doesn't exist
Code:42S02
File:D:\wampserver\www\test\test\index1.php
Line:14
Trace:#0 D:\wampserver\www\test\test\index1.php(14): PDOStatement->execute()
#1 {main}
PDO中捕获SQL语句中的错误的更多相关文章
- 在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'
在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB' 解决方法:解决方法: 1.关闭MySQL数据库 2 ...
- Mybatis中动态SQL语句中的parameterType不同数据类型的用法
Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型, 此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...
- MyBatis 中实现SQL语句中in的操作 (11)
MyBatis 中实现SQL语句中in的操作 概括:应用myBatis实现SQL查询中IN的操作 1.数据库结构及其数据 2.mapper.xml文件 <?xml version="1 ...
- delphi中的sql语句中空格问题
sql语句中的冒号 ‘’,在delphi中需要用四个冒号表示 ‘’‘’,delphi中的两个冒号只代表一个冒号
- java中的sql语句中如果有like怎么写
我先是在SQL server中写了如下语句: 这样是顺利执行的,可是我把这句话复制到Java代码中打出来却报错了, 刚开始我还以为是前端没有传回来值,待我一句一句打印发现,它提示我rs没有next.到 ...
- delphi中写SQL语句中变量的注意事项
1.procedure TForm1.btn1Click(Sender: TObject); var s: String; begin S := 'select * from TMarketI ...
- MyBatis 动态 SQL 语句中出现 '<' 的问题
问题描述 映射接口方法如下: /** * 根据姓名和年龄查询用户信息 * @param name 姓名 * @param user 获取年龄 * @return */ public List<U ...
- 160311、mybatis sql语句中转义字符
问题: 在mapper ***.xml中的sql语句中,不能直接用大于号.小于号要用转义字符 解决方法: 1.转义字符串 小于号 < < 大于号 > & ...
- mybatis sql语句中转义字符
问题: 在mapper ***.xml中的sql语句中,不能直接用大于号.小于号要用转义字符 解决方法: 1.转义字符串 小于号 < < 大于号 > & ...
随机推荐
- 洛谷——P1143 进制转换
P1143 进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进 ...
- Jboss ESB简介及开发实例
一.Jboss ESB的简介 1. 什么是ESB. ESB的全称是Enterprise Service Bus,即企业服务总线.ESB是过去消息中间件的发展,ESB采用了“总线”这样一 ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- POJ 3264 Balanced Lineup(zkw线段树)
[题目链接] http://poj.org/problem?id=3264 [题目大意] 求区间最大值和最小值的差值 [题解] 线段树维护区间极值即可 [代码] #include <cstdio ...
- iOS 耳机线控
当你使用iphone的时候听音乐的时候,播放器在后台运行的时候,你仍然可以通过耳机来进行操作,完成曲目切换,快进,快退等功能!当然你的程序不一定是播放器应用,但是我们仍然可以让它具有这个功能,让用户通 ...
- symbol(s) not found for architecture arm64
问题如下: 解决:更改环境 ok Standard architectures (armv7, arm7s)
- NSPredicate 条件查询或过虑
NSPredicate用于查询和过滤 在SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate. NSPredicate 不单可以和COREDATA中 ...
- The Art of Mocking
One of the challenges developers face when writing unit tests is how to handle external dependencies ...
- Ubuntu下安装配置JDK
第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...
- XShell命令行使用
1.建立连接: 2.查看总体目录: 3.查看对应服务目录: 4.删除对应jar包后,再查看目录下文件: 5.上传对应的jar文件: 6.重启服务 7.查看服务日志: 8.mv old-name new ...