再使用php进行原生框架搭建的过程当中,发现即便sql语句错误,php的pdo是不会报错的,很是奇怪php
而后研究了下,发现原来pdo默认是不报错的,想要报错就要知足两个条件:mysql
一、须要将错误处理模式变成异常模式sql
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);数据库
二、全部可能出错的语句都必须进行捕捉数组
try{服务器
//code框架
}catch(PDOExecption $e){fetch
//错误信息处理spa
}code
总结:
pdo使用:
$pdo=new PDO("mysql:host=localhost;dbname=kong","root",""); $pdo->query();//执行的是select语句,返回值是PDOStatement对象。 $pdo->fetchAll(PDO::FETCH_ASSOC);//经过一次调用返回所有结果,并以数组方式保存 $pdo->exec();//执行的是返回值为intl的sql语句:增长,修改,删除 $pdo->exective();//执行的是预处理语句 /*设置字符集 */ $pdo->query("set names utf8");
另外,在使用pdo返回数据的时候,若是不设置,返回的数据会出现问题。如明明是int类型,返回的确实string
解决:
$options = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_STRINGIFY_FETCHES => false ]; static::$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password, $options);
PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。 须要 bool 类型。
PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO老是模拟预处理语句(若是为 TRUE ),或试着使用本地预处理语句(若是为 FALSE)。若是驱动不能成功预处理当前查询,它将老是回到模拟预处理语句上。 须要 bool 类型。
注意:修改完,若发现还不起做用,是由于你用的是老的驱动php5-mysql,你应该换成php5-mysqlnd。
经常使用属性及使用方式:
设置PDO在处理数据过程当中的处理方式:
PDO::setAttribute:设置属性
PDO::getAttribute:获取属性
PDO::ATTR_CASE:当pdo从结果集中获取数据的时候,如何处理对应的字段的名字
PDO::CASE_LOWER:将全部字段都小写显示
PDO::CASE_UPPER:全部字段都大写显示
PDO::CASE_NATURAL:本来怎么样就怎么样
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_NATURAL); //或 $pdo->setAttribute(PDO::ATTR_CASE,1); var_dump(PDO::CASE_UPPER); //1 转换为大写 var_dump(PDO::CASE_LOWER); //2 转换为小写 var_dump(PDO::CASE_NATURAL); //0 是怎样就是怎样 $sql = "select * from user "; $stmt = $pdo->query($sql); var_dump($stmt->fetch(PDO::FETCH_ASSOC));
PDO::ATTR_AUTOCOMMIT:设置当前链接Mysql服务器的客户端的SQL语句是否自动执行,默认是自动提交
//自动提交属性 var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); //1 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); //0
PDO::ATTR_ERRMODE:错误模式,当pdo出现错误的时候到底使用哪一种模式进行处理,会内部本身抛出异常,终断页面
PDO::ERRMODE_SILENT:静默模式,默认的出错了无论
PDO::ERRMODE_WARNING:警告模式,若是出错了就会报出警告
PDO::ERRMODE_EXCEPTION:异常模式,若是出错会采用异常来处理(PDOException)
var_dump($pdo->getAttribute(PDO::ATTR_ERRMODE)); var_dump(PDO::ERRMODE_SILENT); //0 静默模式,默认的出错了无论 var_dump(PDO::ERRMODE_WARNING); //1 警告模式,若是出错了就会报出警告 var_dump(PDO::ERRMODE_EXCEPTION); //2 异常模式,若是出错会采用异常来处理(PDOException)
PDO::ATTR_PERSISTENT:当前对Mysql服务器的链接是不是长链接
TRUE:是长链接(长链接的使用必需要配合:Apache(connection:keepAlive),Mysqld)
FALSE:默认的,非长链接
什么状况下使用长链接?