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 ...
随机推荐
- Grunt实现自动化单元测试
http://www.tuicool.com/articles/rAnaYvn 直奔主题: 一.安装grunt-contrib-qunit npm install grunt-contrib-qu ...
- 记录一次事故——idea,sbt,scala
没事千万不要点idea的update啊,就算它自己弹出来的也不要管哦. 我们自己的IDE在使用过程中总会有各种settting的配置,更新之后这些都没有了,而且自己本地安装的插件也就都没有了,所以更新 ...
- simplexml 对xml的增删改操作
simplexml 是php 处理xml 文件的一个方法,另一个是dom 处理,这里只说simplexml .目前php 处理xml 用的比较多,比较成熟的还是dom .但dom 在速度和代码量上还是 ...
- 2.9. Scalar Properties for Primitive Data Types 选项(Core Data 应用程序实践指南)
该选项的意思是,“用Scalar特性来表示原始数据类型”.什么意思,妈妈米呀,这是我学这门课程遇到的最难懂的概念. scalar properties,是复数,也就是说是 “分等级的属性”.那么,大概 ...
- permeation开篇
学习方法: To follow the path look to the master follow the master walk with the master see through the m ...
- webpack+react+redux+es6开发模式---续
一.前言 之前介绍了webpack+react+redux+es6开发模式 ,这个项目对于一个独立的功能节点来说是没有问题的.假如伴随着源源不断的需求,前段项目会涌现出更多的功能节点,需要独立部署运行 ...
- GDB中的backtrace命令
backtrace命令,可以用于回溯函数调用栈. 例如:当出现段错误的时候,执行backtrace,可以看到是哪里的调用,产生的这个段错误.
- java_JDBC(1)
Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver";Class.forName(" ...
- ORACLE_INSERT
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...
- MATLAB 单变量函数一阶及N阶求导
1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms ...