PHP学习笔记之PDO
1. 何为PDO?
$dbname = 'shelf.sqlite';
try {
$db = new PDO("sqlite:" . $dbname);
$sth = $db->prepare('select * from book where cat_id=:id limit :offset, :limit', array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
)); $result = $sth->execute(array (
':id' => $cat,
':offset' => ($pg -1) * $limit,
':limit' => $limit
));
$list = array ();
$query = $db->query('select count(*) from book where cat_id=' . $cat)->fetch(); //Only 1 row
$list["count"] = $query[0];
if ($result) {
while ($row = $sth->fetch(PDO :: FETCH_ASSOC)) {
$list["books"][] = $row;
}
} else {
print_r($db->errorInfo());
} $db = NULL; echo str_replace('\\/', '/', json_encode($list)); } catch (PDOException $ex) {
print_r($ex);
}
?>
3. PDO中的常量
$query=$db->prepare('select * from book where cat_id=:id limit :offset, :limit', array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
这里的PDO :: ATTR_CURSOR和PDO :: CURSOR_FWDONLY都是PDO常量,这里将数据库的cursor类型设为forward only。
<?php
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
//使用新建立的数据库连接。
//... ...
//连接在PDO实例的生命周期里是活动的。使用完毕后应当关闭此连接,若不这样做PHP在代码结束时才关闭此连接,将占用一部分内存。
$db = null;
?>
当然,事情并不都是这样,有时我们可能会需要一个永久的连接。具体做法是在PDO的构造函数里再加一个参数:
<?php
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
永久的连接能够跨越代码,在一个代码执行完毕时并未被关闭,而是被缓存起来,以供另一段拥有同样权限的代码重复使用。这样便不必每次都新建一个连接,省了不少事不说,还能够加快网站速度。
(2)PDO::query()用于执行一次SELECT语句,执行后应当随即使用PDOStatement::fetch()语句将结果取出,否则立即进行下一次的PDO::query()将会报错。在2.PDO实例部分,为了得到查询数据的总量,就用了PDO::query()语句。
$sth = $db->prepare('select * from book where cat_id=:id limit :offset, :limit', array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
//用$limit1得到一个结果
$result1 = $sth->execute(array (
':id' => $cat,
':offset' => ($pg -1) * $limit1,
':limit' => $limit1
)); //用$limit2得到另一个结果
$result2 = $sth->execute(array (
':id' => $cat,
':offset' => ($pg -1) * $limit2,
':limit' => $limit2
));
使用prepared statement还有一个好处就是,语句里不再使用引号,PDO driver已自动完成这一操作,可以防止SQL注入攻击的危险。查询语句里可以使用包含名字的(:name)和问号(?)的参数占位符,分别将用associated array 和indexed array传入数值。
//用位置参入参数
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value); //用名称传入参数
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value); $name = 'one';
$value = 1;
$stmt->execute(); //也可以这样实现
//用位置参入参数,indexed array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$name = 'one';
$value = 1;
$stmt->execute(array($name,$value)); //用名称传入参数, associated array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$name = 'one';
$value = 1;
$stmt->execute(array(':name'=>$name,':value'=>$value));
特别注意:查询语句中的占位符应当是占据整个值的位置,如果有模糊查询的符号,应当这样做:
// placeholder must be used in the place of the whole value
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%")); //下面这样就有问题了
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name']));
PHP学习笔记之PDO的更多相关文章
- 两千行PHP学习笔记
亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...
- PHP学习笔记 - 进阶篇(11)
PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...
- DVWA-基于布尔值的盲注与基于时间的盲注学习笔记
DVWA-基于布尔值的盲注与基于时间的盲注学习笔记 基于布尔值的盲注 一.DVWA分析 将DVWA的级别设置为low 1.分析源码,可以看到对参数没有做任何过滤,但对sql语句查询的返回的结果做了改变 ...
- 《SQL 反模式》 学习笔记
第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...
- TP6学习笔记一:安装与基本配置
1 说明与概述 1.1 说明 以下内容大部分来源于TP6完全开发手册,以手册为主附上个人理解,仅作学习使用. 1.2 概述 第一篇学习笔记,主要记录TP6的基础,包括TP6简介,安装,Hello Wo ...
- Web安全学习笔记 SQL注入下
Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
随机推荐
- OC-Objection 学习笔记之一:简单的开始
Objection 统一管理对象的引用问题,我想这就是这种技术的意义吧. 废话不说,咱们直接上步骤吧: 1:协议 我们的意识里要知道,一切围绕协议来进行. 下面的协议是一个视图的协议,该协议简单到不能 ...
- IOS 上线问题
info.plist 是否支持后台位置 音频 Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括 audio:在后台提供声音播放功能,包括音频流和 ...
- 解压文件--linux
linux下不同的文件格式用不同的命令解压. 对于tar.gz文件,用以下命令. .tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileNa ...
- jQuery插件placeholder的使用方法
借助该插件可以轻松实现HTML5中placeholder特效: 实例代码如下: <script type="text/javascript" src="<%= ...
- 安装MYSql Windows7下MySQL5.5.20免安装版的配置
MySQL Windows安装包说明: 1.mysql-5.5.20-win32.msi:Windows 安装包,图形化的下一步下一步的安装. 2.mysql-5.5.20.zip,这个是window ...
- RMAN-06217: not connected to auxiliary database with a net service name
RMAN> duplicate target database to clonedb from active database; Starting Duplicate Db at 28-JAN- ...
- mysql 使用sqldump来进行数据库还原
MYSQLdump参数详解 mysqldump备份: 复制代码代码如下: mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –lock-all-tables > ...
- C# winform 按钮设置左边图标
按钮设置操作如下: 1.先设置按钮图标,再设置图标的对齐方式 2.再设置按钮字体的对齐方式. 3.最后设置排列: TextImageRelation:设置为ImageBeforeText
- CocosBuilder 多分辨率基础
最近两个项目大量使用了CocosBuilder, 对于开发效率提高是巨大的. 一直计划写一篇博客谈谈CocosBuilder的多分辨率问题, 懒病加上一些疙疙瘩瘩的小事情, 拖延了一个多月, 才终于下 ...
- Js让光标停在输入框input框最后面
var val = $(this) val(); 1.$(this). focus(); 2.$(this).val(""); 3.$(this).val(val); 1. ...