PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
以数据库 msg 为例,说明 PDO 的数据提取、预处理语句:
mysql> show tables;
+---------------+
| Tables_in_msg |
+---------------+
| message |
+---------------+
mysql> show create table message \G
*************************** 1. row ***************************
Table: message
Create Table: CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(200) NOT NULL COMMENT '聊天内容',
`flag` int(11) NOT NULL DEFAULT '0' COMMENT '0-未读 1-已读',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
mysql> show columns from message;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| content | varchar(200) | NO | | NULL | |
| flag | int(11) | NO | | 0 | |
+---------+--------------+------+-----+---------+----------------+
mysql> select * from message;
+----+---------+------+
| id | content | flag |
+----+---------+------+
| 1 | hello | 1 |
| 2 | world | 1 |
+----+---------+------+
从表中选择数据
<?php $dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $stmt = $db_conn->query('select * from message');
while($row = $stmt->fetch()) {
echo $row['id'],'.',$row['content'],'<br />';
}
返回:
1.hello
2.world
说明:
① $db_conn 是 PDO 对象
② $stmt 是 PDOStatement 对象,它代表查询,并获取结果(stmt 有预处理的意思)
③ PDOStatement::fetch() 方法可以 处理大量提取数据的模式
④ fetch() 方法将从结果集中取出一行数据
数据提取模式
fetchAll() 方法可以一次检索所有的行。同时 fetch() 方法 和 fetchAll() 方法 都可以接受 fetch_style 参数,包括:
PDO::FETCH_ASSOC,返回关联数组
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $stmt = $db_conn->query('select * from message'); $res = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($res);
返回:
array
'id' => string '1' (length=1)
'content' => string 'hello' (length=5)
'flag' => string '1' (length=1)
或(fetchAll):
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $stmt = $db_conn->query('select * from message'); $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($res);
返回:
array
0 =>
array
'id' => string '1' (length=1)
'content' => string 'hello' (length=5)
'flag' => string '1' (length=1)
1 =>
array
'id' => string '2' (length=1)
'content' => string 'world' (length=5)
'flag' => string '1' (length=1)
PDO::FETCH_NUM,返回索引数组:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $stmt = $db_conn->query('select * from message'); $res = $stmt->fetchAll(PDO::FETCH_NUM);
var_dump($res);
返回:
array
0 =>
array
0 => string '1' (length=1)
1 => string 'hello' (length=5)
2 => string '1' (length=1)
1 =>
array
0 => string '2' (length=1)
1 => string 'world' (length=5)
2 => string '1' (length=1)
PDO::FETCH_BOTH,返回关联数组和索引数组:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $stmt = $db_conn->query('select * from message'); $res = $stmt->fetchAll(PDO::FETCH_BOTH);
var_dump($res);
返回:
array
0 =>
array
'id' => string '1' (length=1)
0 => string '1' (length=1)
'content' => string 'hello' (length=5)
1 => string 'hello' (length=5)
'flag' => string '1' (length=1)
2 => string '1' (length=1)
1 =>
array
'id' => string '2' (length=1)
0 => string '2' (length=1)
'content' => string 'world' (length=5)
1 => string 'world' (length=5)
'flag' => string '1' (length=1)
2 => string '1' (length=1)
参数和预处理语句
提取 id = 1 的 message 的信息,要使用一个 预处理语句,告诉 MySQL 这条语句的哪些部分是变量。在运行 PDO::query() 时,组合了 预处理 和 执行步骤:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'select * from message where id = :msg_id';
$stmt = $db_conn->prepare($sql); //执行预处理
$stmt->execute(array('msg_id'=>2));
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($res);
返回:
array
0 =>
array
'id' => string '1' (length=1)
'content' => string 'hello' (length=5)
'flag' => string '1' (length=1)
说明:
① 通过传递 SQL 语句作为参数, PDO 对象的 prepare() 方法创建了 PDOStatement($stmt);
② :msg_id 前面的冒号表示这是一个占位符(placeholder);
③ 在实际查询前,会用真正的值来替换占位符
④ execute() 方法执行查询
⑤ 必须为 SQL 中的每一个占位符传入值,需要创建一个与占位符数量相同的元素组成的数组,每个占位符都有一个与之匹配的数组元素,数组元素的键名和占位符一致,数组元素的实际值替换占位符
占位符的另外一种形式:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'select * from message where id = ? and flag = ?';
$stmt = $db_conn->prepare($sql); //执行预处理
$stmt->execute(array(2, 1));
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($res);
返回:
array
0 =>
array
'id' => string '2' (length=1)
'content' => string 'world' (length=5)
'flag' => string '1' (length=1)
说明:
占位符可以不需要名字,而用 ? 为变量保留一个位置作为没有命名的占位符。
当使用预处理时,为占位符传入的值已经溢出(删除了不需要的字符),因为 MySQL 知道这些都是可能改变的值。
绑定值和预处理语句的变量
当使用 不同的值 重复调用 相同的查询 时,只会有很小的系统弄个开销,可以设置一些元素用于每次查询 - PDOStatement::buildValue():
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'select * from message where id = :msg_id and flag = :msg_flag';
$stmt = $db_conn->prepare($sql); //绑定值
$stmt->bindValue(':msg_id', 1); $stmt->bindValue(':msg_flag', 1);
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->bindValue('msg_id', 2);
$stmt->execute();
$res2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($res);
var_dump($res2);
输出:
array
'id' => string '1' (length=1)
'content' => string 'hello' (length=5)
'flag' => string '1' (length=1)
array
'id' => string '2' (length=1)
'content' => string 'world' (length=5)
'flag' => string '1' (length=1)
还可以使用 PDOStatement::bindParam() 将参数和变量绑定:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'select * from message where id = :msg_id and flag = :msg_flag';
$stmt = $db_conn->prepare($sql); //绑定值
$stmt->bindParam(':msg_id', $msgid); $stmt->bindValue(':msg_flag', 1);
$msgid = 1;
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->bindValue('msg_id', 2);
$stmt->execute();
$res2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($res);
var_dump($res2);
输出:
array
'id' => string '1' (length=1)
'content' => string 'hello' (length=5)
'flag' => string '1' (length=1)
array
'id' => string '2' (length=1)
'content' => string 'world' (length=5)
'flag' => string '1' (length=1)
插入一行数据并获取 ID
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'insert into message (content, flag) values (:content, :flag)';
$stmt = $db_conn->prepare($sql); $stmt->execute(array(
':content'=>'诸葛四郎和魔鬼党,到底谁抢到那支宝剑',
':flag'=>2
)
); echo 'new id: ',$db_conn->lastInsertId();
输出:new id: 3
说明:lastinsertId() 是 PDO 对象而不是 PDOStatement 对象。
注意:插入中文时为避免乱码,需要在实例化 PDO 对象时增加一个参数 $opt:
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = '';
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"); try {
$db_conn = new PDO($dsn, $username, $pwd, $opt);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
}
返回插入、更新或删除的数据的数量
当执行 Insert、Update、Delete 语句时,可以通过 rowCount() 方法 找出多少行内容已经改变:
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'update message set flag = :flag where flag = 1';
$stmt = $db_conn->prepare($sql); $stmt->execute(array(':flag'=>3)); echo $stmt->rowCount(),' rows uodated.';
输出:2 rows uodated.
说明:rowCount() 方法是 PDOStatement 对象。
删除数据
<?php
$dsn = 'mysql:host=localhost;dbname=msg';
$username = 'root';
$pwd = ''; try {
$db_conn = new PDO($dsn, $username, $pwd);
}catch (PDOException $e) {
echo 'Could not connect to database.<br />'.$e->getMessage();
} $sql = 'delete from message where id = :msgid';
$stmt = $db_conn->prepare($sql); $stmt->execute(array(':msgid'=>2)); echo $stmt->rowCount(),' row(s) deleted.';
输出:1 row(s) deleted.
附:《PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入》
PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句的更多相关文章
- PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本.我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容.所以在这里,我们就不再多讲理论方面的 ...
- Scrapy 学习笔记(一)数据提取
Scrapy 中常用的数据提取方式有三种:Css 选择器.XPath.正则表达式. Css 选择器 Web 中的 Css 选择器,本来是用于实现在特定 DOM 元素上应用花括号内的样式这样一个功能的. ...
- MySQL学习笔记十二:数据备份与恢复
数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...
- C Primer Plus学习笔记(二)- 数据和C
从一个简单的程序开始 #include <stdio.h> int main(void) { float weight; float value; printf("Please ...
- 使用Tensorflow搭建回归预测模型之二:数据准备与预处理
前言: 在前一篇中,已经搭建好了Tensorflow环境,本文将介绍如何准备数据与预处理数据. 正文: 在机器学习中,数据是非常关键的一个环节,在模型训练前对数据进行准备也预处理是非常必要的. 一.数 ...
- jmeter之断言、数据提取器(正则表达式、jsonpath、beanshell)、聚合报告、参数化
ctx - ( JMeterContext) - gives access to the context vars - ( JMeterVariables) - gives read/write ac ...
- PHP中的PDO操作学习(二)预处理语句及事务
今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现.只不过大部分情况下,大家都在使用框架,手写的机会非 ...
- Java学习-028-JSON 之二 -- 数据读取
JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...
- 【转】Pandas学习笔记(二)选择数据
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
随机推荐
- 考前复习(codevs 2837)
2837 考前复习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Aiden马上要考试了,可他 ...
- Mybatis if判断的坑
具体情况参考这两篇文章: http://cheng-xinwei.iteye.com/blog/2008200 http://www.cnblogs.com/tv151579/p/3297691.ht ...
- Linux命令自己总结
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- List、Map、Set
这样的题属于随意发挥题:这样的题比较考水平,两个方面的水平:一是要真正明白这些内容,二是要有较强的总结和表述能力.如果你明白,但表述不清楚,在别人那里则等同于不明白. 首先,List与Set具有相似性 ...
- Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...
- [编辑器] Tab转换成空格
Notepad++: 设置 -> 首选项 -> 制表符设置 怎样设置EditPlus中Tab用空格替换http://jingyan.baidu.com/article/63f236280b ...
- ytu 1938:首字母变大写(水题)
首字母变大写 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 110 Solved: 43[Submit][Status][Web Board] Desc ...
- C++的那些事:表达式与语句
表达式 1,应该把函数调用当作是一种运算符,这种运算符对参与运算的对象没有数量限制. 2,关于“左值(lvalue)”和“右值(rvalue)”可以做一个简单的归纳:当一个对象被用作右值的时候,用的是 ...
- mysql如何修改表类型(表引擎)
参考阅读:http://www.manongjc.com/article/1205.html 最近遇到一个修改 MySQL 表类型的问题,以前在 phpmyadmin 管理 mysql 数据库时,建立 ...
- 状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
题目传送门 题意:有n*m的房间,'.'表示可以被点亮,'#'表示不能被点亮,每点亮一个房间会使旁边的房间也点亮,有意盏特别的灯可以选择周围不同方向的房间点亮.问最少需要多少灯使得所有房间点亮 分析: ...