php pdo 简单使用 (二)

通过上一节内容 php pdo 简单使用(一)了解了链接的创建和简单的操作。

通过 pdo 有三种方式执行sql语句: exec, query, prepared statement

1. exec() 函数适用于执行一次sql 操作,并且不适用于select语句 参见:http://php.net/manual/zh/pdo.exec.php

2. query() 函数适用于执行一次sql操作,并且在下一次query之前要fetch 出所有的结果否则执行将会失败 参见:http://php.net/manual/zh/pdo.query.php

3. 如果一类查询(查询结构相似而具体的参数不一)需要一次解析而执行使用很多次,可以先用prepared statement,这样可以为具体的查询的执行做好准备,避免了分析、编译、优化的循环,将减少资源占用率,从而提高运行效率。通过对数据库进行prepare操作,便会返回PDOStatement数据类型,从而在其基础上展开execute、fetch等进一步的操作。

使用prepared statement还可以防止SQL注入。查询语句里可以使用包含命名(:name)和问号(?)的参数占位符,分别将用associated array 和indexed array传入数值。

代码示例:

<?php
header("Content-type: text/html; charset=utf-8");

$dbType = ‘mysql‘;
$dbUser = ‘root‘;
$dbPass = ‘simael‘;
$dbhost = ‘localhost‘;
$dbName = ‘pdotest‘;
$dsn="$dbType:host=$dbhost;dbname=$dbName";
try{
    $pdo = new PDO($dsn, $dbUser, $dbPass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ‘utf8‘;"));
    echo "PDO成功连接MySQL数据库!<br>";
}catch(PDOException $exception){
    echo $exception->getMessage();
}
$pdo->query(‘set names utf8‘);

$name = ‘‘;
$text = ‘‘;

// 用问号占位符传入参数
$stmt = $pdo->prepare("INSERT INTO users (name, text) VALUES (?, ?)");
//$stmt->bindParam(1, $name); // 这里只能传入变量,不能是常量例如 $stmt->bindParam(1, ‘simael‘); 报错
//$stmt->bindParam(2, $text);

$stmt->bindValue(1, ‘bindValue‘);
$stmt->bindValue(2, ‘bindValue \‘s text‘);

$name = ‘again name‘;
$text = ‘again text text‘;
$stmt->execute();
//$stmt->execute(array(‘mike‘,‘mike text‘));
// 用命名占位符传入参数
$stmt2 = $pdo->prepare("SELECT * FROM users WHERE name like :name");
//$stmt2->bindParam(‘:name‘,$name);
$stmt2->execute(array(‘:name‘=>‘%mike%‘));

/*while($row = $stmt2->fetch(PDO::FETCH_ASSOC)){
 print_r($row);
 echo ‘<br>‘;
}*/ 

//print_r($stmt2->fetchAll(PDO::FETCH_BOTH));
//print_r($stmt2->fetchAll(PDO::FETCH_ASSOC));
print_r($stmt2->fetchAll(PDO::FETCH_OBJ));

注意注释的代码,都可以测试一下。

例如,我们使用问号占位符,通过bindParam()函数传入参数的时候,第二个参数必须是变量,想使用常量应当使用函数bindValue()

参见:

http://php.net/manual/zh/pdostatement.bindparam.php

http://php.net/manual/en/pdostatement.bindvalue.php

当然我们也可以直接在 execute()函数中直接传入参数。

上面的例子还包含了使用Pdo 的插入和查询操作,其它操作类似。

最后打印结果有多种方式:

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

错误处理:

静默模式(默认模式)

$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

事务:

try{
$dbh->beginTransaction();
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES (‘mick‘, ‘text1‘);");
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES (‘lily‘, ‘text2‘);");
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES (‘susan‘, ‘text3‘);");
$dbh->commit();
 } catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
 } 

使用pdo 建立一个持久连接:

<?php
$db = new PDO(‘mysql:host=localhost;dbname=testpdo‘, $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

持久的连接能够跨越代码,在一个代码执行完毕时并未被关闭,而是被缓存起来,

以供另一段拥有同样权限的代码重复使用。这样便不必每次都新建一个连接,省了不少事不说,还能够加快网站速度。

时间: 2024-10-05 13:38:38

php pdo 简单使用 (二)的相关文章

php pdo 简单使用 (一)

简介: PDO扩展为PHP访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据. 即提供了一个数据库访问抽象层能使得我们通过一致的函数和写法来操作不同数据库,有利于日后对数据库的迁移,当然也有安全方面的提升. 对比: php 操作数据库以mysql 为例常用的方法有 php_mysql , php_mysqli , pdo 1.php_mysql 和 php_mysqli 都是不可以移植的,只能应用于mysql

ZabbixAPI+django+nginx简单的二次开发实例(三)

接上一篇博文 ZabbixAPI+django+nginx简单的二次开发实例(二) 步骤三,站点架构部分 本部分用到的软件 1,Nginx:接受访问请求,应答静态页面,转发动态请求至uwsgi 2,uwsgi:应答动态请求 3,Django:处理后台数据 4,supervisor:管理进程 首先安装Nginx yum install epel-release yum install python-devel nginx 修改配置文件 vim /etc/ngnix/ngnix.conf user

调用MyFocus库,简单实现二十几种轮播效果

一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要调用就可以使用,下面会介绍方法. c . 灵活的设置,很多参数可以提供设置,比如不想要文字提示,设置高度为0....更多参数适用请见网站教程页面. 二.下载下来之后,解压,看到一个文件夹,如下图所示: 对此文件夹进行一下说明:a . 打开js文件夹,然后有个js文件,就是我们最开始要调用的myfoc

若干排序算法简单汇总(二)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/36706131 作者:小马 一希尔排序 上一篇讲到的直接插入排序,时间复杂度O(n^2). 请在脑海里想一下它的过程.如果一个序列本来就是有序的,对它排序的时间复杂度是O(n).所以当序列基本有序时,插入排序排序的效率大大提高,因为减少了移动的动作. 另外,直接插入排序还有一个特点,当n比较小时,它的效率比较高. 希尔排序正是基于上面两个思想做的一种改进算法.它先将整个序列分成若干

ZabbixAPI+django+nginx简单的二次开发实例(五)

接上一篇博文 ZabbixAPI+django+nginx简单的二次开发实例(四) 步骤五,图形展示 写一个RRDtool图形展示的脚本,由于要和view.py联动,我放在了appname的文件夹下 cd /API/web/pos/moniter vim rrddraw.py #!/usr/bin/env python #coding=utf-8 import rrdtool #ping的图形 def itemping(data): pngname = str(data['pname']) #图

Redis入门很简单之二【常见操作命令】

Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存 Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一下作为常用的一些命令,包括对字符串.列表.集合.有序集合.哈希表的操作,以及一些其他常用命令. [ 基本操作] 1. 添加记录:通常用于设置字符串(string)类型,或者整数类型:如果key已经存在,则覆盖其对应的值. Shell代码   set name James 2. 获取记录:通过键获取值.

Android自定义用户控件简单范例(二)

对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的. 我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义. 使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来. 在自定义控件类中使

正则表达式--简单记忆二

全部符号解释 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置. $ 匹配输入字符串的结束位置.如果设置了RegExp

【sql注入】简单实现二次注入

[sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php     include('./connect.php'); //引入数据库配置文件     $id=$_GET['id'];     $select_sql="SELECT * FROM article WHERE title='