php mysql 占位符_PDO中预处理语句占位符的使用
摘要:占位符在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中预处理语句占位符的使用相关推荐
- java sql in 占位符_Java中SQL语句占位符的使用
使用占位符的好处 在SQL语句中使用?来代替具体的数值,可除去繁琐的字符串拼接操作,且可避免SQL注入的风险String sql="SELECT * FROM user_login WHER ...
- DB2中sql语句占位符问题
初到公司实习,让做一个网站,使用struts2+spring框架,数据库使用的是DB2,以前没接触过DB2,对它不了解.在写sql语句的时候遇到一些问题,首先就是在mysql下的limit到了DB2中 ...
- deallocate mysql_MySQL中预处理语句prepare、execute与deallocate的使用教程
前言 MySQL官方将prepare.execute.deallocate统称为PREPARE STATEMENT,我习惯称其为[预处理语句],其用法十分简单,下面话不多说,来一起看看详细的介绍吧. ...
- mysql cte递归_SQLSERVER中CTE语句结构及CTE递归查询
SQL SERVER中CTE语句结构及CTE递归查询 CTE语句结构 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语 ...
- scala 访问修饰符_Scala中的访问修饰符
scala 访问修饰符 Access modifiers are used in order to restrict the usage of a member function to a class ...
- java中访问修饰符_Java中的访问修饰符介绍
java中访问修饰符 什么是访问修饰符? (What are Access Modifiers?) Have you ever wanted to define how people would ac ...
- mysql 重复数据 distinct_MySQL中distinct语句去查询重复记录及相关的性能讨论
在 MySQL 查询中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值,就是去重啦.用法也很简单: SELE ...
- python中df占位符_PYTHON 中的%s %占位符用法
官方文档 解释说明 一种字符串格式化的语法, 基本用法是将值插入到%s占位符的字符串中. %%,表示输出一个% %s,表示格式化一个对象为字符 "%±(正负号表示)3(数字表示字符串的长度) ...
- mysql not in null_MySQL中NOTIN语句对NULL值的处理
顺便提一下MySQL中正则表达式匹配的简单使用:SELECT COUNT(alarmID)FROM AlarmWHERE (CVE NOT RLIKE mysql> SELECT COUNT(n ...
最新文章
- 前端面试题整理(定期更新)
- android dialog横屏,解决dialog在横竖屏切换时消失
- parentNode,parentElement,childNodes,children的区别
- 点对点 客户端-服务器 聊天程序
- 存储过程学习笔记(一)
- VC++CopyFile函数的用法
- Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
- windows计算机桌面隐藏文件,成功隐藏Windows电脑文件的四种方法
- 求2020 CFA二级notes资源,谢谢!
- 【1401】机器翻译
- 中国出海50强,华为超越阿里得亚军,第一名居然是它?
- 睡地板的女高管,也被马斯克裁了!推特丧心病狂的第八轮裁员来了
- SEGMENT_VARIABLE什么意思?
- JOJ 上的典型题目分类以及参考书目 (以及我的整理)
- java计算机毕业设计社区健康信息管理系统源程序+mysql+系统+lw文档+远程调试
- Java 基础 面试题
- xshell安装及使用
- 2020-02-10
- 时代周刊:谷歌微软争夺高校电子邮件外包市场
- SAP上云——助力制造业数字化转型
热门文章
- 一分钟完全关闭Antimalware Service Executable(windows defender)任务管理器程序
- [ctfshow]web入门——文件上传(web156-web163)
- 服务器上显示叹号是什么意思,服务器上显示黄色叹号
- On-Demand Resources Guide中文版(按需加载资源--下)
- mysql 13位时间戳转时间戳_时间戳换算(13位时间戳转换工具 在线)
- Shardingsphere 简介
- Java实现上传图片到阿里云对象存储OSS
- python2的lambda函数的基础学习
- python爬虫爬取豆瓣电影信息城市_Python爬虫入门 | 2 爬取豆瓣电影信息
- 华为智慧屏SE55通过FTP远程文件管理-实简FTP v1.6.30