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

使用PDO时不使用预处理语句占位符也可以防止SQL注入,我们可以使用quote()方法来防止SQL注入。quote()为输入的字符串添加引号(如果有需要),并对特殊字符进行转义,且引号的风格和底层驱动适配。

虽然quote()可以通过加引号及对特殊字符处理,但在官方文档中并不建议用这个方法来防SQL注入如果使用此函数构建 SQL 语句,强烈建议使用 PDO::prepare() 配合参数构建,而不是用 PDO::quote() 把用户输入的数据拼接进 SQL 语句。 使用 prepare 语句处理参数,不仅仅可移植性更好,而且更方便、免疫 SQL 注入;相对于拼接 SQL 更快,客户端和服务器都能缓存编译后的 SQL 查询。

下面来看看预处理语句prepare()占位符的使用

prepare()中的占位符有两种形式

①冒号‘:’加关键字:(建议使用)<?php

header('content-type:text/html;charset=utf-8');

$username="testuser1";

$email="testuser1@qq.com";

try{

$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');

$sql='select * from test_pdo where username=:username and email=:email';

$stm = $pdo->prepare($sql);

$stm->execute(array(':username'=>$username,':email'=>$email));

//rowCount 返回受影响的行数

echo $stm->rowCount();

}catch(PDOException $e){

echo $e->getMessage();

}

②问号‘?’占位符:<?php

header('content-type:text/html;charset=utf-8');

$username="testuser1";

$email="testuser1@qq.com";

try{

$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');

$sql='select * from test_pdo where username=? and email=?';

$stm = $pdo->prepare($sql);

$stm->execute(array($username,$email));

//rowCount 返回受影响的行数

echo $stm->rowCount();

}catch(PDOException $e){

echo $e->getMessage();

}

在使用问号‘?’占位符时,在execute()中的数组参数需要注意参数的顺序,要与对应问号一致,比如第一个问号对应的是'username',array()中的第一个也必须是'username'的参数值。

在上面的占位符介绍案例中,参数是通过execute()绑定并执行的,其实PDO中有另外一个专门绑定参数的方法——bindParam(),bindParam()方法可以一次绑定多次执行sql语句,如果下次的参数值不一样也只需要重新给定参数值即可,此时的execute()无须传递任何参数。PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] ) : bool

执行成功时返回 TRUE, 或者在失败时返回 FALSE。

参数说明:parameter

参数标识符。对于使用命名占位符的预处理语句,应是类似 :name 形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。

variable

绑定到 SQL 语句参数的 PHP 变量名。

data_type

使用 PDO::PARAM_* 常量明确地指定参数的类型。要从一个存储过程中返回一个 INOUT 参数,需要为 data_type 参数使用按位或操作符去设置 PDO::PARAM_INPUT_OUTPUT 位。

length

数据类型的长度。为表明参数是一个存储过程的 OUT 参数,必须明确地设置此长度。

driver_options

在实际使用中,大多数情况下只需给定前两个或三个参数

①冒号‘:’占位符绑定参数:(建议使用)<?php

header('content-type:text/html;charset=utf-8');

try{

$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');

$sql="INSERT test_pdo(username,password,email) VALUES(:username,:password,:email)";

$stmt=$pdo->prepare($sql);

$stmt->bindParam(":username",$username,PDO::PARAM_STR);

$stmt->bindParam(":password",$password,PDO::PARAM_STR);

$stmt->bindParam(":email",$email);

$username='testuser11';

$password='123456';

$email='testuser11@qq.com';

$stmt->execute();

$username='testuser22';

$password='123456';

$email='testuser22@qq.com';

$stmt->execute();

echo $stmt->rowCount();

}catch(PDOException $e){

echo $e->getMessage();

}

②问号‘?’占位符绑定参数:<?php

header('content-type:text/html;charset=utf-8');

try{

$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');

$sql="INSERT test_pdo(username,password,email) VALUES(?,?,?)";

$stmt=$pdo->prepare($sql);

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

$stmt->bindParam(2,$password,PDO::PARAM_STR);

$stmt->bindParam(3,$email);

$username='testuser33';

$password='123456';

$email='testuser11@qq.com';

$stmt->execute();

$username='testuser44';

$password='123456';

$email='testuser22@qq.com';

$stmt->execute();

echo $stmt->rowCount();

}catch(PDOException $e){

echo $e->getMessage();

}

问号‘?’占位符在使用时需要注意参数顺序问题,因此,在实际项目中建议使用冒号‘:’加关键字形式的占位符,清楚明了,不易出错。

php mysql 占位符_PDO中预处理语句占位符的使用相关推荐

  1. java sql in 占位符_Java中SQL语句占位符的使用

    使用占位符的好处 在SQL语句中使用?来代替具体的数值,可除去繁琐的字符串拼接操作,且可避免SQL注入的风险String sql="SELECT * FROM user_login WHER ...

  2. DB2中sql语句占位符问题

    初到公司实习,让做一个网站,使用struts2+spring框架,数据库使用的是DB2,以前没接触过DB2,对它不了解.在写sql语句的时候遇到一些问题,首先就是在mysql下的limit到了DB2中 ...

  3. deallocate mysql_MySQL中预处理语句prepare、execute与deallocate的使用教程

    前言 MySQL官方将prepare.execute.deallocate统称为PREPARE STATEMENT,我习惯称其为[预处理语句],其用法十分简单,下面话不多说,来一起看看详细的介绍吧. ...

  4. mysql cte递归_SQLSERVER中CTE语句结构及CTE递归查询

    SQL SERVER中CTE语句结构及CTE递归查询 CTE语句结构 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语 ...

  5. scala 访问修饰符_Scala中的访问修饰符

    scala 访问修饰符 Access modifiers are used in order to restrict the usage of a member function to a class ...

  6. java中访问修饰符_Java中的访问修饰符介绍

    java中访问修饰符 什么是访问修饰符? (What are Access Modifiers?) Have you ever wanted to define how people would ac ...

  7. mysql 重复数据 distinct_MySQL中distinct语句去查询重复记录及相关的性能讨论

    在 MySQL 查询中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值,就是去重啦.用法也很简单: SELE ...

  8. python中df占位符_PYTHON 中的%s %占位符用法

    官方文档 解释说明 一种字符串格式化的语法, 基本用法是将值插入到%s占位符的字符串中. %%,表示输出一个% %s,表示格式化一个对象为字符 "%±(正负号表示)3(数字表示字符串的长度) ...

  9. mysql not in null_MySQL中NOTIN语句对NULL值的处理

    顺便提一下MySQL中正则表达式匹配的简单使用:SELECT COUNT(alarmID)FROM AlarmWHERE (CVE NOT RLIKE mysql> SELECT COUNT(n ...

最新文章

  1. 前端面试题整理(定期更新)
  2. android dialog横屏,解决dialog在横竖屏切换时消失
  3. parentNode,parentElement,childNodes,children的区别
  4. 点对点 客户端-服务器 聊天程序
  5. 存储过程学习笔记(一)
  6. VC++CopyFile函数的用法
  7. Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
  8. windows计算机桌面隐藏文件,成功隐藏Windows电脑文件的四种方法
  9. 求2020 CFA二级notes资源,谢谢!
  10. 【1401】机器翻译
  11. 中国出海50强,华为超越阿里得亚军,第一名居然是它?
  12. 睡地板的女高管,也被马斯克裁了!推特丧心病狂的第八轮裁员来了
  13. SEGMENT_VARIABLE什么意思?
  14. JOJ 上的典型题目分类以及参考书目 (以及我的整理)
  15. java计算机毕业设计社区健康信息管理系统源程序+mysql+系统+lw文档+远程调试
  16. Java 基础 面试题
  17. xshell安装及使用
  18. 2020-02-10
  19. 时代周刊:谷歌微软争夺高校电子邮件外包市场
  20. SAP上云——助力制造业数字化转型

热门文章

  1. 一分钟完全关闭Antimalware Service Executable(windows defender)任务管理器程序
  2. [ctfshow]web入门——文件上传(web156-web163)
  3. 服务器上显示叹号是什么意思,服务器上显示黄色叹号
  4. On-Demand Resources Guide中文版(按需加载资源--下)
  5. mysql 13位时间戳转时间戳_时间戳换算(13位时间戳转换工具 在线)
  6. Shardingsphere 简介
  7. Java实现上传图片到阿里云对象存储OSS
  8. python2的lambda函数的基础学习
  9. python爬虫爬取豆瓣电影信息城市_Python爬虫入门 | 2 爬取豆瓣电影信息
  10. 华为智慧屏SE55通过FTP远程文件管理-实简FTP v1.6.30