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,一经查实,立即删除!

相关文章

Asp.Net Core安全防护-客户端IP白名单限制

前言本篇展示了如何在ASP.NET Core应用程序中设置IP白名单验证的2种方式。你可以使用以下2种方式&#xff1a;用于检查每个请求的远程 IP 地址的中间件。MVC 操作筛选器&#xff0c;用于检查针对特定控制器或操作方法的请求的远程 IP 地址。中间件Startup.Configure方法将自定义…

Win2003中apache2整合tomcat5和iis6

为了能在已经存在iis6的服务器上运行自己的java程序&#xff0c;经过历时半年的尝试&#xff0c;今天终于搞定了&#xff0c;好开心啊。最开始是用iis直接连接tomcat&#xff0c;找遍了网上所有的资料&#xff0c;可是死活也连不通&#xff0c;或许是iis的封闭吧&#xff0c;看…

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;所以许多国内玩家便纷纷涌入日服和韩服。这…

如何用 Linq 进行多重 Orderby ?

咨询区 Sasha&#xff1a;我有两张表&#xff1a;movies 和 categories&#xff0c;我想获取一个先按 categoryid 再按 Name 排序的list。movie 表有三个列&#xff1a;ID,Name,CategoryID。category 表有两个列&#xff1a;ID,Name。我设想的伪代码如下&#xff1a;var movies…

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…

一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第三十集

林晓黎在暗中观察股市行情&#xff0c;设计告发云氏集团暗中控股。证券会派人调查云氏集团&#xff0c;慕容家的股票甚至直接停盘。而完成了这次报复的林晓黎心中却并没有复仇的快感&#xff0c;他觉得空虚、歉疚&#xff0c;没有脸再去见云朵。 在全家精神濒临崩溃的关口&…

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

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

非类型模板参数

对于函数模板与类模板&#xff0c;模板参数并不局限于类型&#xff0c;普通值也可以作为模板参数。在基于类型参数的模板中&#xff0c;你定义了一些具体的细节来加以确定代码&#xff0c;直到代码被调用时这些细节才被真正的确定。但是在这里&#xff0c;我们面对的是这些细节…

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

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

PHP如何防采集方法代码

1 <?php 2 /**3 * FileName:test.php4 * Summary: 防采集5 * Author: sinob6 * CreateTime: 2005-10-18 7 * LastModifed:2005-10-18 8 * 请参见http://mall.yi85.com/9 */10 $HTTP_REFERER$_SERVER["HTTP_REFERER"];11 $HTTP_USER_AGENT$_SERVER["HTTP_USE…

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

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

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

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

php 单例模式的类,用单例模式来设计一个PHP数据库类

class nmdb{private $link;static private $_instance;// 连接数据库private function __construct($host, $username, $password){$this->link mysql_connect($host, $username, $password);$this->query("SET NAMES utf8", $this->link);//echo mysql_er…

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 现已支持…

如何扩展开发团队(转)

原文标题&#xff1a;How To Scale a Development Team 原文链接&#xff1a;http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/ 作者通过自己在Heroku的经验&#xff0c;讨论了开发团队是如何从家庭式作坊发展到专业化团队的过程&#xff0c;在每个阶段中都…