php pdo 查询语句,PDO:预处理语句(参数化查询)

@(PDO(PHP data object/PHP数据对象))[PDO|预处理语句|参数化查询]

The database library called PHP Data Objects or PDO for short can use drivers for many different database types, and supports a very important feature known as prepared statements, sometimes also known as parametrized queries.

PDO::prepare

f432fee5d901

Paste_Image.png

在执行之前,对一条语句进行预处理,并返回一个语句对象。

预处理一条 SQL 语句,以便 PDOStatement::execute() 方法执行。该 SQL 语句可以包含 0 或更多个命名参数(:name)或问号参数(?),这些参数的真实值在语句执行的时候会被替换掉。使用这些参数绑定所有的用户输入的数据,不要在查询中直接包含用户输入的数据。

返回值:

如果数据库服务器成功地预处理了该语句,PDO::prepare() 将会返回一个 PDOStatement 对象;否则,返回 false 或 抛出 PDOException(依 error handling 而定)。

模拟的预处理语句并没有与数据库服务器进行通信,所以PDO::prepare()并没有检查该语句。

PDOStatement::bindParam

f432fee5d901

Paste_Image.png

原来 PDO 官方手册的简要描述的描述顺序有点怪怪的,并且后面的详细描述也不一致。所以这里把简要描述跟详细描述中的描述顺序统一一下。

Binds the specified variable name to a parameter.

绑定 指定的变量名(只能是 $name 的形式)到 一个参数(:name 或 ?参数 ,可以是 :name 或 从1 开始的索引 的形式)。

绑定 一个 PHP 变量 到 预处理语句中对应的命名占位符或问号占位符。

与 PDOStatement::bindValue() 不同的是:PDOStatement::bindParam() 中的变量是作为引用而绑定的,并且只有在调用 PDOStatement::execute() 的时候才会读取这个变量的值。

Note we used bindValue and not bindParam. Trying to bind a parameter by reference will generate a Fatal Error and this cannot be caught by PDOException either.

但如果需要循环执行预处理语句,最好使用bindParam,具体原因见对应的章节:Executing prepared statements in a loop。

返回值:

成功则返回 true,失败则返回 false

例如:

/* Execute a prepared statement by binding PHP variables */

$calories = 150;

$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories

FROM fruit

WHERE calories < :calories AND colour = :colour');

$sth->bindParam(':calories', $calories, PDO::PARAM_INT);

$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);

$sth->execute();

/* Execute a prepared statement by binding PHP variables */

$calories = 150;

$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories

FROM fruit

WHERE calories < ? AND colour = ?');

$sth->bindParam(1, $calories, PDO::PARAM_INT);

$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);

$sth->execute();

PDOStatement::bindValue

f432fee5d901

Paste_Image.png

Binds a value to a parameter.

绑定 一个值(可以是 $name 或 'Jack' 的形式) 到 一个参数(:name 或 ?参数 ,可以是 :name 或 从1 开始的索引 的形式)。

绑定 一个值 到 预处理语句中对应的命名占位符或问号占位符。

返回值:

成功则返回 true,失败则返回 false

例如:

$stm->bindValue(':name',$name);

$stm->bindValue(':name','Jack');

PDOStatement::execute

f432fee5d901

Paste_Image.png

Executes a prepared statement.

执行一条 经过预处理的语句。

如果预处理语句中包含占位符,则必须执行以下两点之一:

调用PDOStatement::bindParam() 或 PDOStatement::bindValue() 把变量或值绑定到占位符上。

或 传入一个数组

1. 参数:

$input_parameters:一个数组。数组的元素数量 应该与 需要执行的 SQL 语句中占位符数量 相等。

所有的值作为 PDO::PARAM_STR 处理。

不能绑定多个值到一个单独的参数;比如,不能绑定两个值到 IN()子句中一个单独的命名占位符。

绑定值的数量不能超过指定的数量。如果在 $input_parameters 的键名数量 比 PDO::prepare() 中的 SQL 语句中指定的参数的数量还要多,则该语句将会失败并发出一个错误。

$input_parameters 中的键名 必须和 SQL 中声明的 相匹配。在 PHP 5.2.0 之前,这是被忽略的。

2. 返回值:

成功则返回 true,失败则返回 false

例如:

/* Execute a prepared statement by passing an array of insert values */

$calories = 150;

$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories

FROM fruit

WHERE calories < :calories AND colour = :colour');

$sth->execute(array(':calories' => $calories, ':colour' => $colour));

/* Execute a prepared statement by passing an array of insert values */

$calories = 150;

$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories

FROM fruit

WHERE calories < ? AND colour = ?');

$sth->execute(array($calories, $colour));

Preparing Statements using SQL functions

You may ask how do you use SQL functions with prepared statements. I've seen people try to bind functions into placeholders like so:

//THIS WILL NOT WORK!

$time = 'NOW()';

$name = 'BOB';

$stmt = $db->prepare("INSERT INTO table(`time`, `name`) VALUES(?, ?)");

$stmt->execute(array($time, $name));

This does not work, you need to put the function in the query as normal:

$name = 'BOB';

$stmt = $db->prepare("INSERT INTO table(`time`, `name`) VALUES(NOW(), ?)");

$stmt->execute(array($name));

You can bind arguments into SQL functions however:

$name = 'BOB';

$password = 'badpass';

$stmt = $db->prepare("INSERT INTO table(`hexvalue`, `password`) VALUES(HEX(?), PASSWORD(?))");

$stmt->execute(array($name, $password));

Also note that this does NOT work for LIKE statements:

//THIS DOES NOT WORK

$stmt = $db->prepare("SELECT field FROM table WHERE field LIKE %?%");

$stmt->bindParam(1, $search, PDO::PARAM_STR);

$stmt->execute();

So do this instead:

$stmt = $db->prepare("SELECT field FROM table WHERE field LIKE ?");

$stmt->bindValue(1, "%$search%", PDO::PARAM_STR);

$stmt->execute();

Note we used bindValue and not bindParam. Trying to bind a parameter by reference will generate a Fatal Error and this cannot be caught by PDOException either.

但如果需要循环执行预处理语句,最好使用bindParam,具体原因见对应的章节:Executing prepared statements in a loop。

Executing prepared statements in a loop

Prepared statements excel in being called multiple times in a row with different values.

Because the sql statement gets compiled first, it can be called multiple times in a row with different arguments, and you'll get a big speed increase vs calling mysql_query over and over again!

Typically this is done by binding parameters with bindParam. bindParam is much like bindValue except instead of binding the value of a variable, it binds the variable itself, so that if the variable changes, it will be read at the time of execute.

$values = array('bob', 'alice', 'lisa', 'john');

$name = '';

$stmt = $db->prepare("INSERT INTO table(`name`) VALUES(:name)");

$stmt->bindParam(':name', $name, PDO::PARAM_STR);

foreach($values as $name) {

$stmt->execute();

}

Transactions

Here's an example of using transactions in PDO: (note that calling beginTransaction() turns off auto commit automatically):

try {

$db->beginTransaction();

$db->exec("SOME QUERY");

$stmt = $db->prepare("SOME OTHER QUERY?");

$stmt->execute(array($value));

$stmt = $db->prepare("YET ANOTHER QUERY??");

$stmt->execute(array($value2, $value3));

$db->commit();

} catch(PDOException $ex) {

//Something went wrong rollback!

$db->rollBack();

echo $ex->getMessage();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WiFi密码都不会破译​还想考清华?​

1 18万的飞机票也能秒空&#xff1f;&#xff1f;&#xff1f;留学生&#xff1a;这是救命钱啊▼2 WiFi密码都不会破译还想考清华&#xff1f;▼3 好羡慕有这样的妈妈▼4 猫&#xff1a;你别进来&#xff0c;我这儿不接待小孩儿&#xff01;孩子&#xff1a;我就进去看看▼…

ASP.NET网页文本编辑器的使用

ASP.NET网页文本编辑器的使用&#xff0c;效果图如下&#xff1a; 这里要用到DotNetTextBox.dll组件&#xff0c;具体内容可以在http://sites.google.com/site/zhangqs008/chang-yong-gong-ju 下载&#xff0c;使用方法如下&#xff1a; 1.将“DotNetTextBox.dll”文件添加到工…

在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...

如果你要问我最近什么手游最火&#xff1f;那我的回答肯定就是《英雄联盟》手游了&#xff01;自从拳头公司在前几天爆出部分地区公测的消息之后&#xff0c;很多国内玩家就已经按耐不住自己激动的心了。由于国服没有公测&#xff0c;所以许多国内玩家便纷纷涌入日服和韩服。这…

php 电压 异常,tv断线警告是什么原因

电力系统中TV断线&#xff0c;就是电压互感器断线。TV断线一般可以分为TV 一次侧(高压)断线和二次侧(低压)断线&#xff0c;无论是哪一侧的断线&#xff0c;都将会使TV二次回路的电压异常&#xff0c;影响继电保护装置的正确动作。 (推荐学习&#xff1a;phpstorm)如果发生TV一…

《JavaScript 高级程序设计》 7.1 正则表达式支持

转载于:https://www.cnblogs.com/xiaochaohuashengmi/archive/2010/11/07/1871100.html

豆瓣9.7,这些舍不得看完的神剧,看一集少一集啊!

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——菌菌。菌菌&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过&#xff…

因子分析最少要有几个因子_Re0:魔女司教和魔女是什么关系?他们的魔女因子是魔女给的吗...

​魔女司教和魔女的能力一点关系都没有&#xff0c;而且魔女教一开始是正常的&#xff0c;直到艾米莉亚父母死后才出现各种大罪司教发疯&#xff0c;怠惰是艾米莉雅的养父&#xff0c;艾米莉亚一族守护的封印被虚饰魔女入侵&#xff0c;怠惰为了守护强行融合了魔女基因&#xf…

徒手打造基于Spark的数据工厂(Data Factory):从设计到实现

在大数据处理和人工智能时代&#xff0c;数据工厂&#xff08;Data Factory&#xff09;无疑是一个非常重要的大数据处理平台。市面上也有成熟的相关产品&#xff0c;比如Azure Data Factory&#xff0c;不仅功能强大&#xff0c;而且依托微软的云计算平台Azure&#xff0c;为大…

深度学习框架PyTorch与TensorFlow,谁更胜一筹?

全世界只有3.14 % 的人关注了爆炸吧知识自从2012年深度学习再一次声名鹊起以来&#xff0c;许多机器学习框架都争先恐后地要成为研究人员和行业从业者的新宠。面对如些众多的选择&#xff0c;人们很难判断最流行的框架到底是什么。在某些情况下&#xff0c;深度学习或深度迁移学…

Windows Server 2008 R2 之二十一远程桌面服务RD之二

一、远程桌面授权 远程桌面授权&#xff08;RD 授权&#xff09;以前称为终端服务授权&#xff08;TS 授权&#xff09;&#xff0c;它能够管理每个设备或用户与远程桌面会话主机&#xff08;RD 会话主机&#xff09;服务器连接所需的远程桌面服务客户端访问许可 (RDS CAL)。使…

件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发

微信小程序越来越受欢迎&#xff0c;很多小白也想制作自己的小程序。小白若想自己顺利制作&#xff0c;有两种方法&#xff1a;一种是下载安装微信官方开发者工具&#xff0c;然后写代码开发&#xff1b;一种是使用第三方小程序制作工具&#xff0c;选个现成的小程序模板&#…

Windows 11 预览版 Build 22000.168 发布

微软现已发布第八个 Windows 11 预览版更新 KB5005191&#xff0c;版本号升级至 Build 22000.168。本次更新面向 Beta 频道和 Dev 频道的 Windows 预览体验成员推出&#xff0c;Windows 11 Insider Preview Build 22000.168 主要变化如下。1.微软宣布 Microsoft Teams 现已支持…

都2020年了,翟天临对毕业生论文查重的影响还剩多少?

全世界只有3.14 % 的人关注了爆炸吧知识文内有福利2020年转眼就到了4月&#xff0c;对于20届的毕业生来说&#xff0c;这注定是一个不平凡的毕业季。然而&#xff0c;无论2020年经历了什么&#xff0c;在无数莘莘学子成为“社会人”之前&#xff0c;不得不面对一件事情&#xf…

apache 2.4 httpd.conf 详解_Linux Centos服务子系统详解

1、服务的分类启动与自启动&#xff1a;服务启动&#xff1a;就是在当前系统中让服务运行&#xff0c;并提供功能。服务自启动&#xff1a;自启动是指让服务在系统开机和重启之后&#xff0c;随着系统的启动而自动启动服务查询已安装的服务&#xff1a;RPM包安装的服务[rootloc…

Oracle 常用sql场景应用(未完待续......)

--1、创建一张学生信息表stuinfo&#xff0c;字段包括学号、姓名、性别、年龄、入学日期SQL>CREATE TABLE stuinfo (snochar(4),sname varchar2(10),sex int,age int,sdate date);Table created--2、创建stuinfo表主键约束SQL>ALTER TABLE stuinfo ADD CONSTRAINT pk_stu…

变态公式之如何算出圆的内部被切割成几块?

来来来赶紧拿纸笔出来一起算一个单位圆圆周上均匀分布 n 个点&#xff0c;互相连接&#xff0c;这个圆的内部会被分割为多少块&#xff1f;答案高能预警&#xff1a;来&#xff0c;我们来找规律&#xff0c;大家拿出纸和笔。前三个很简单&#xff0c;1,2,4&#xff0c;所以猜测…

qq截图工具提取_QQ截图隐藏的这些简单又实用的技能,怪我没早告诉你

自从有了微信&#xff0c;很多人逐渐习惯并适应微信办公、学习&#xff0c;远离 QQ。实际上&#xff0c;QQ 后面做了不少实用且高效得功能&#xff0c;往往容易被人忽略&#xff0c;例如强大的截图功能&#xff0c;具体好用在哪呢&#xff1f;看完下面的内容就知道了。01. 精准…

合集 | 我在传统行业做数字化转型

在过去的两年时间里&#xff0c;Edison加入了一家传统行业的家装企业参与了其从0到1的数字化转型的过程&#xff0c;我将其整个过程中的感受与体会记录成了一些文章&#xff0c;分享与你。1我在传统行业做数字化转型&#xff08;1&#xff09;预告篇这篇主要会介绍一下数字化转…

第十周项目1-程序填空与阅读(一)

问题1-阅读下面的程序&#xff0c;在____上填上合适的成份&#xff0c;使程序能够输入“12”形式的式子&#xff0c;并输出相应的结果。 输入switch(oper) /**Copyright (c) 2014,烟台大学计算机学院*All gight reserved.*文件名称&#xff1a;temp.cpp*作者&#xff1a;邵帅*完…

33种化学原理动图, 让你秒懂化学反应原理!

全世界只有3.14 % 的人关注了爆炸吧知识化学的神奇魅力可是不是随便说说的&#xff0c;神奇起来让人叹为观止。下面37张动图&#xff0c;在带领你领略化学之美的同时&#xff0c;也希望能帮助你理解这些化学现象。1 . 硫氰酸汞分解&#xff08;“法老之蛇”&#xff09;原理&am…