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 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
给php新手谈谈我的学习心得
Feb 25 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
laravel实现于语言包的完美切换方法
Sep 29 PHP
PHP新手指南
Apr 01 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函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
Python unittest单元测试框架总结
2018/09/08 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
物流司机岗位职责
2013/12/28 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
司仪主持词两篇
2014/03/22 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
感谢信的格式
2015/01/21 职场文书
地道战观后感400字
2015/06/04 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python