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或asp创建网页桌面快捷方式的代码
Mar 23 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
浅析php header 跳转
Jun 17 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
PHP CURL获取返回值的方法
May 04 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
Jul 03 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php的大小写敏感问题整理
2011/12/29 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
python动态进度条的实现代码
2019/07/03 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
使用Python构造hive insert语句说明
2020/06/06 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
Python之Sklearn使用入门教程
2021/02/19 Python
python包的导入方式总结
2021/03/02 Python
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
二人合伙经营协议书
2014/09/13 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis