以数据库 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 数据提取 和 预处理语句的更多相关文章

  1. PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

    对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本.我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容.所以在这里,我们就不再多讲理论方面的 ...

  2. Scrapy 学习笔记(一)数据提取

    Scrapy 中常用的数据提取方式有三种:Css 选择器.XPath.正则表达式. Css 选择器 Web 中的 Css 选择器,本来是用于实现在特定 DOM 元素上应用花括号内的样式这样一个功能的. ...

  3. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  4. C Primer Plus学习笔记(二)- 数据和C

    从一个简单的程序开始 #include <stdio.h> int main(void) { float weight; float value; printf("Please ...

  5. 使用Tensorflow搭建回归预测模型之二:数据准备与预处理

    前言: 在前一篇中,已经搭建好了Tensorflow环境,本文将介绍如何准备数据与预处理数据. 正文: 在机器学习中,数据是非常关键的一个环节,在模型训练前对数据进行准备也预处理是非常必要的. 一.数 ...

  6. jmeter之断言、数据提取器(正则表达式、jsonpath、beanshell)、聚合报告、参数化

    ctx - ( JMeterContext) - gives access to the context vars - ( JMeterVariables) - gives read/write ac ...

  7. PHP中的PDO操作学习(二)预处理语句及事务

    今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现.只不过大部分情况下,大家都在使用框架,手写的机会非 ...

  8. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

  9. 【转】Pandas学习笔记(二)选择数据

    Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...

随机推荐

  1. 数列(codevs 1141)

    题目描述 Description 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13 ...

  2. stm32——RTC实时时钟

    stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

  3. unix PS命令和JPS命令的区别

    1.JPS介绍 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java ...

  4. Codeigniter:如何写一个好的Model

    本文是关于在Code Igniter PHP MVC框架中如何编写Model方法. CRUD 方法 CRUD 是Create, Retrieve, Update, and Delete的缩写. 这些是 ...

  5. .NET 下各种Resource的读取方式

    1) Embedded Resource (Build Action 设置为 Embedded Resource) 在运行时使用GetManifestResourceStream读取 Image.Fr ...

  6. wp8 --退出程序

    重写OnBackKeyPress事件,设置 e.cancel=true:然后加弹窗代码,为确定按钮订阅事件委托,委托方法里加Application.Current.Terminate();退出方法即可

  7. hdu 4280 最大流sap

    模板套起来 1 5 7 //5个结点,7个边 3 3 //坐标 3 0 3 1 0 0 4 5 1 3 3 //相连的结点和流 2 3 4 2 4 3 1 5 6 4 5 3 1 4 4 3 4 2 ...

  8. android 项目中规范使用SharedPreferences

    一.SharedPreferences是什么来的? SharedPreferences是Android四种数据存储技术中的一种(SharedPreferences.SQLite.Content Pro ...

  9. 用c++处理文件流

    #include<bits/stdc++.h> using namespace std; struct Bian { int num; string name; }b[]; int mai ...

  10. DP URAL 1244 Gentlemen

    题目传送门 /* 题意:已知丢失若干卡片后剩余的总体积,并知道原来所有卡片的各自的体积,问丢失的卡片的id DP递推:首先从丢失的卡片的总体积考虑,dp[i] 代表体积为i的方案数,从dp[0] = ...