php PDOException 笔记

PDOException


【开启PDO】


首先,将pdo_mysql.dll文件放到PHP安装根目录下的ext目录下
注意,如果你在php.ini文件中配置了其他的目录为扩展目录,那就要放到配置的目录下面,具体哪个目录才是你PHP的扩展目录,要看看php.ini文件中extension_dir = "F:/PHP/AppServ/php5/ext",这一行extension_dir后指向的是哪个目录,上面是我的扩展目录所在
然后在php.ini文件中查找"pdo",你就可以一下找到  ;extension=php_pdo.dll  这一行,看这行前面是否有分号,如果有的话,把它去掉。然后找找有没有  extension=php_pdo_mysql.dll   如果有,同样去掉前面的分号。如果没有,则手动添加上
最终这两行配置内容如下
extension=php_pdo.dll
extension=php_pdo_mysql.dll


保存php.ini文件,重启apache,使用phpinfo函数观察有没有pdo这个扩展,如果有说明安装成功




pdo  不能被重定义


特性
   预处理   事务  多数据库支持 统一性


 设置字符集
 PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8'
   




new PDO(DNS,账号,密码,参数配置);
链接一个PDO
 public function __construct() {
try {
$this->pdo = new PDO('mysql:host=localhost;dbname=yyg','root','aaaaaa');
} catch (PDOException $e) {
exit("PDOError: " . $e->getMessage() . "");
}
}
   
   






PDO 开启事务
事务处理要先关闭自动提交  PDO::ATTR_AUTOCOMMIT, 0


try {  
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $dbh->beginTransaction();   //开启事务
  $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
  $dbh->exec("insert into salarychange (id, amount, changedate) 
      values (23, 50000, NOW())");
  $dbh->commit();   处理事务
} catch (Exception $e) {
  $dbh->rollBack();   回滚事务
  echo "Failed: " . $e->getMessage();
}






执行一条sql语句 并返回影响的行数,返回insert、delete、update处理行数
exec(sql语句);


pdo::query则返回select记录集,也可以执行insert、delete、update。
query(sql语句,返回的模式(PDO::FETCH_ASSOC))
获取结果集
$a = quert($sql);
$a->fetch()  得到一条结果集  用while循环
fetchColumn()  得到下一行的结果集
fetchAll  获取所有的结果集 用foreach循环




或者可以用 准备+执行语句 
$_stmt = $this->_pdo->prepare($_sql);
$_stmt->execute();




这取决于你需要做的数据,如果你需要运行查询,并没有做任何事情的结果,那么你应该使用exec来执行查询,否则,如果你需要的行数,返回的数据,你应该使用pdo::query ,然后使用调用返回的结果。




PDO 常量  通过 $this->_pdo->getAttribute(PDO::ATTR_AUTOCOMMIT); 获取
通过$this->_pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);  设置
有的常量只读 有的常量读写
PDO 默认报错方式是  PDO::ERRMODE_SILENT  如果有错误  也不会提示 只会返回给pdo的errorinfo方法
要改成PDO::ERRMODE_WARNING
设置方法
$this->_pdo->setAttribute(PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING);










PDO 提供了几个执行查询的方法,每个方法都经过调整以尽可能更高效的方式执行一
个特定的查询。
1.执行没有结果集的查询:当执行INSERT、UPDATE 和DELETE 等查询时,不返回结
果集。在这些情况下,exec()方法将返回查询所影响的行数。
2.一次执行一个查询:当执行返回结果集的查询时,或者所影响的行数无关紧要时,应
当使用query()方法。
3.多次执行一个查询:虽然可以使用while 循环和query()配合执行多次查询,但使用准
备语句来实现效率会更加高效prepare()。






在PDO 操作SQL 如果有错误的情况下,他报错的方式提供了三种:
1.ERRMODE_EXCEPTION //异常模式,通过异常来捕获错误
2.ERRMODE_SILENT //默认模式,错误时不进行任何操作
3.ERRMODE_WARNING //警告模式,错误时会报警告
如果采用默认模式,那么,我们需要自行判断和输出错误结果。
if (!$_affected_rows) {
echo '错误代号:'.$_pdo->errorCode();
echo '<br />错误信息:';
print_r($_pdo->errorInfo());
}
如果设置了警告模式,会自动提醒PDO操作数据库存在的问题。
$_pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
如果设置了异常模式,则需要通过try{}catch{}来捕获。
$_pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
try {
$_pdo->exec("INSERT INTO cms_user (user1) VALUES ('Lee')");
} catch (PDOException $e) {
echo $e->getMessage();
}






使用query()来设置字符集编码:
$_pdo->query("SET NAMES UTF8");
也可以是用常量PDO::MYSQL_ATTR_INIT_COMMAND='SET NAMES UTF8'
使用query()来获取数据集,要注意,获取后返回的不是结果集,而是预处理对象
PDOStatement。所以,可以通过foreach 来循环获取。
$_sql = "SELECT user,pass FROM cms_user";
foreach ($_pdo->query($_sql) as $_row) {
print_r($_row);
}


可以使用query(sql,模式)方法中的第二个参数来确定数据的获取方式。
1.FETCH_BOTH 默认模式,关联和数字数组模式
2.FETCH_NUM 数字模式,数字数组模式
3.FETCH_ASSOC 关联模式,关联数组模式
4.FETCH_OBJ 对象模式,对象数组模式










PDO 与连接有关的选项
可以使用$_pdo->getAttribute();来获取连接有关的选项,具体如下:
1.ATTR_AUTOCOMMIT 确定每次提交,是否等待commit()方法才生效。
2.ATTR_CASE 强制获取的列字符大小写全部转换为大写或小写,或不动。有三个选项
可以控制:CASE_UPPER、CASE_LOWER 和CASE_NATURAL。
3.ATTR_EMULATE_PREPARES 可使准备语句利用MySQL 的查询缓存。
4.ATTR_ERRMODE 错误模式报告,PDO 支持三种:ERRMODE_EXCEPTION、
ERRMODE_SILENT 和ERRMODE_WARNING。
5.ATTR_ORACLE_NULLS 设置为TRUE 时,把字符串转成NULL。默认情况FALSE。
6.ATTR_PERSISTENT 是否持久连接。
7.ATTR_PREFETCH 预获取是一种获取多行的数据库特性。
8.ATTR_TIMEOUT 超时,MySQL 不支持。
9.ATTR_SERVER_INFO 数据库信息。
10.ATTR_SERVER_VERSION 数据库版本。
11.ATTR_CLIENT_VERSION 数据库客户端版本。
12.ATTR_CONNECTION_STATUS 数据库连接状态信息。













































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值