@(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

Paste_Image.png

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

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

返回值:

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

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

PDOStatement::bindParam

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

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

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();

}

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

  1. mysql预处理语句_MYSQL 预处理语句

    一.预处理语句介绍 MySQL支持服务端预处理语句,预处理语句利用高效的客户端/服务端二进制协议.用占位符替换参数值的预处理语句有下列两个好处: 每次执行语句时,解析语句的开销更小.通常,数据库应用程 ...

  2. mysql 预处理语句_预处理语句

    MySQL 8.0支持服务器端预处理语句.这种支持利用了有效的客户端/服务器二进制协议.对参数值使用带占位符的预处理语句具有以下好处:每次执行语句时解析语句的开销都较小.通常,数据库应用程序处理大量几 ...

  3. dapper mysql 多参数查询_使用Dapper进行参数化查询

    在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入 ...

  4. C语言sql参数化查询,使用LIKE的sql参数化查询

    我试图将参数传递给quert,但它不起作用.什么是最好的方式来做到这一点?我不想连接字符串.这里是我的查询:使用LIKE的sql参数化查询 string cmd = @" SELECT * ...

  5. java 预处理语句_预处理语句PreparedStatement到底咋用啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我自己试了一下直接查询id为1的语句,有一条结果出来,但是用了PreparedStatement后就没有结果了,有大佬知道为什么吗orz package ...

  6. php mysql 预处理_PHP MySQL 预处理语句

    PHP MySQL 预处理语句 在本教程中,您将学习如何使用PHP在MySQL中使用预处理语句. 预处理语句是什么 预处理语句(也称为参数化语句)只是一个SQL查询模板,其中包含占位符而不是实际参数值 ...

  7. php mysql预处理_PHP MySQL 预处理语句

    预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下:预处理:创建 SQL 语句模板并发送 ...

  8. php mysql 占位符_PDO中预处理语句占位符的使用

    摘要:占位符在php程序中有着非常重要的作用,对数据安全也有着非常重要的意义,通过占位符我们可以有效验证传入参数的有效性,从而防止恶意的SQL注入攻击. 使用PDO时不使用预处理语句占位符也可以防止S ...

  9. deallocate mysql_Mysql预处理语句prepare、execute、deallocate

    前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...

  10. php使用mysql预处理语句防止sql注入 简单讲解及代码实现

    目录 前言 sql注入简单介绍 一个例子 使用预处理语句 简介 预处理语句的查询 预处理语句获取查询结果 总结 前言 最近在做一个小项目的后台,牵扯到登录等等需要操作数据库的地方,为了安全起见,特地来 ...

最新文章

  1. 还在苦恼机器学习和线性回归?这篇总结拿走不谢 | 原力计划
  2. SQLAlchemy的使用---外键ForeignKey数据库创建与连接
  3. zoj - 3502 Contest
  4. Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
  5. 【C++】Visual Studio教程(八) -修复 Visual Studio
  6. 多个div并排居中显示
  7. 技术分享 | 一条神奇的曲线——贝塞尔曲线在前端的应用
  8. [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路
  9. LwIP Application Developers Manual9---LwIP and multithreading
  10. scrapy使用crawlspider
  11. Linux下如何编写和使用自定义的Shell函数和函数库
  12. Jquery 对象求和
  13. 常用类 String,Stringbuffer,Stringbuilder 包装类 日期类
  14. 安全合规/法案--35--《APP收集使用个人信息自评估指南(征求意见稿)》原文及解读
  15. 2017人人都是产品经理年度作家评选结果公告
  16. 第16周收录103起融资,芯片创企为热点丨潜在周波啊
  17. svg html g标签id,svg是什么?svg常用的方法(附代码)
  18. pycharm不显示一部分下划线和删除线(pep8,typo引起)
  19. 解决 ERROR: Could not find a version that satisfies the requirement 的一种思路
  20. postgresql等待锁排查——ShareLock ExclusiveLock

热门文章

  1. .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI
  2. EventBus In eShop -- 解析微软微服务架构eShopOnContainers(四)
  3. 用JWT来保护我们的ASP.NET Core Web API
  4. 使用StyleCop 进行代码评审
  5. 统一设置网站html文件输出编码为utf-8,以解决乱码问题
  6. [转]白话阿里巴巴Java开发手册高级篇
  7. 【计算机图形学】实验:C#.net环境下的图形变换完整实验操作流程
  8. NPOI 将DataGridView导出到Excel
  9. dell服务器报内存配置不正确,DELL 服务器系统提示错误解决的若干办法
  10. 目瞪口呆!137亿年的宇宙演化,竟然如此震撼!简直颠覆想象....