php mysql PDO 查询操作的实例详解


Posted in PHP onSeptember 23, 2017

php mysql PDO 查询操作的实例详解

<?php 
$dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', '');  
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
$dbh->exec('set names utf8');  
/*添加*/ 
//$sql = "INSERT INTO `user` SET `login`=:login AND `password`=:password";  
$sql = "INSERT INTO `user` (`login` ,`password`)VALUES (:login, :password)"; $stmt = $dbh->prepare($sql); $stmt->execute(array(':login'=>'kevin2',':password'=>''));  
echo $dbh->lastinsertid();  
/*修改*/ 
$sql = "UPDATE `user` SET `password`=:password WHERE `user_id`=:userId";  
$stmt = $dbh->prepare($sql);  
$stmt->execute(array(':userId'=>'7', ':password'=>'4607e782c4d86fd5364d7e4508bb10d9'));  
echo $stmt->rowCount();  
/*删除*/ 
$sql = "DELETE FROM `user` WHERE `login` LIKE 'kevin_'"; //kevin%  
$stmt = $dbh->prepare($sql);  
$stmt->execute();  
echo $stmt->rowCount();  
/*查询*/ 
$login = 'kevin%';  
$sql = "SELECT * FROM `user` WHERE `login` LIKE :login";  
$stmt = $dbh->prepare($sql);  
$stmt->execute(array(':login'=>$login));  
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){    
 print_r($row);  
}  
print_r( $stmt->fetchAll(PDO::FETCH_ASSOC));  
?>

1 建立连接

<?php 
$dbh=newPDO('mysql:host=localhost;port=3306; dbname=test',$user,$pass,array( 
PDO::ATTR_PERSISTENT=>true 
)); 
?>

持久性链接PDO::ATTR_PERSISTENT=>true

2. 捕捉错误

<?php 
try{ 
$dbh=newPDO('mysql:host=localhost;dbname=test',$user,$pass); 
 
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
 
$dbh->exec("SET CHARACTER SET utf8"); 
$dbh=null; //断开连接 
}catch(PDOException$e){ 
print"Error!:".$e->getMessage()."<br/>"; 
die(); 
} 
?>

3. 事务的

<?php 
try{ 
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
 
$dbh->beginTransaction();//开启事务 
$dbh->exec("insertintostaff(id,first,last)values(23,'Joe','Bloggs')"); 
$dbh->exec("insertintosalarychange(id,amount,changedate) 
values(23,50000,NOW())"); 
$dbh->commit();//提交事务 
 
}catch(Exception$e){ 
$dbh->rollBack();//错误回滚 
echo"Failed:".$e->getMessage(); 
} 
?>

4. 错误处理

a. 静默模式(默认模式)

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT); //不显示错误
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//显示警告错误,并继续执行
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//产生致命错误,PDOException
<?php 
try{   
 $dbh = new PDO($dsn, $user, $password);   
 $sql = 'Select * from city where CountryCode =:country';   
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);   
 $stmt = $dbh->prepare($sql);   
 $stmt->bindParam(':country', $country, PDO::PARAM_STR);   
 $stmt->execute();   
 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {    
 print $row['Name'] . "/t";   
 }  
}  // if there is a problem we can handle it here  
catch (PDOException $e) {   
 echo 'PDO Exception Caught. ';   
 echo 'Error with the database: <br />';   
 echo 'SQL Query: ', $sql;   
 echo 'Error: ' . $e->getMessage();  
}  
?>

1. 使用 query()

<?php 
$dbh->query($sql); 当$sql 中变量可以用$dbh->quote($params); //转义字符串的数据 
 
$sql = 'Select * from city where CountryCode ='.$dbh->quote($country);  
foreach ($dbh->query($sql) as $row)  {   
 print $row['Name'] . "/t";   
 print $row['CountryCode'] . "/t";   
 print $row['Population'] . "/n";  
}  
?>

2. 使用 prepare, bindParam和 execute [建议用,同时可以用添加、修改、删除]

<?php 
$dbh->prepare($sql); 产生了个PDOStatement对象 
 
PDOStatement->bindParam() 
 
PDOStatement->execute();//可以在这里放绑定的相应变量 
?>

3. 事物

<?php  
 try {  
 $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');  
 $dbh->query('set names utf8;');  
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
 $dbh->beginTransaction();  
 $dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('mick', 22);");  
 $dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('lily', 29);");  
 $dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('susan', 21);");  
 $dbh->commit();  
 } catch (Exception $e) {  
 $dbh->rollBack();  
 echo "Failed: " . $e->getMessage();  
 }  
?>

PDO常用方法:

PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作。
PDO::exec()主要是针对没有结果集合返回的操作。如insert,update等操作。返回影响行数。
PDO::lastInsertId()返回上次插入操作最后一条ID,但要注意:如果用insert into tb(col1,col2) values(v1,v2),(v11,v22)..的方式一次插入多条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。
PDOStatement::fetch()是用来获取一条记录。配合while来遍历。
PDOStatement::fetchAll()是获取所有记录集到一个中。
PDOStatement::fetchcolumn([int column_indexnum])用于直接访问列,参数column_indexnum是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。因此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount()适用于当用query("select ...")方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();
PDOStatement::columncount()适用于当用query("select ...")方法时,获取记录的列数。

注解:

1、选fetch还是fetchall?

小记录集时,用fetchall效率高,减少从数据库检索次数,但对于大结果集,用fetchall则给系统带来很大负担。数据库要向WEB前端传输量太大反而效率低。

2、fetch()或fetchall()有几个参数:

mixed pdostatement::fetch([int fetch_style [,int cursor_orientation [,int cursor_offset]]])
array pdostatement::fetchAll(int fetch_style)

fetch_style参数:

■$row=$rs->fetchAll(PDO::FETCH_BOTH); FETCH_BOTH是默认的,可省,返回关联和索引。
■$row=$rs->fetchAll(PDO::FETCH_ASSOC); FETCH_ASSOC参数决定返回的只有关联数组。
■$row=$rs->fetchAll(PDO::FETCH_NUM); 返回索引数组
■$row=$rs->fetchAll(PDO::FETCH_OBJ); 如果fetch()则返回对象,如果是fetchall(),返回由对象组成的二维数组

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
谈谈PHP语法(4)
Oct 09 PHP
php下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
Ping服务的php实现方法,让网站快速被收录
Feb 04 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php跨服务器访问方法小结
May 12 PHP
PHP实现的增强性mhash函数
May 27 PHP
PHP实现的简单缓存类
Jul 29 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
thinkphp jquery实现图片上传和预览效果
Jul 22 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
PHP实现权限管理功能示例
Sep 22 #PHP
php生成毫秒时间戳的实例讲解
Sep 22 #PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 #PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 #PHP
Laravel中Facade的加载过程与原理详解
Sep 22 #PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 #PHP
深入理解PHP的远程多会话调试
Sep 21 #PHP
You might like
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP中的事务使用实例
2015/05/26 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Python中关键字is与==的区别简述
2014/07/31 Python
Python获取任意xml节点值的方法
2015/05/05 Python
python开发之list操作实例分析
2016/02/22 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
高中生自我评语大全
2014/01/19 职场文书
共产党员承诺书
2014/03/25 职场文书
出国英文推荐信
2014/05/10 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
公司内部升职自荐信
2015/03/27 职场文书
营运督导岗位职责
2015/04/10 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技