预处理语句占位符的使用

原创 2015年11月19日 17:59:01

预处理语句占位符的使用,方法绑定参数,sql注入等..

try{
    $user = "root"; // 这里是你的数据库用户名
    $pwd = "yangli"; // 这是是你的数据库密码
    $pdo = new PDO("mysql:dbname=test;host=127.0.0.1", $user, $pwd);
}catch(PDOException$e){
    echo $e->getMessage();
}
$username = $_POST['username'];
$pwd = md5($_POST['password']);
$sql = "SELECT * FROM  user WHERE `user`=:username AND pwd =:pwd";
$stmt = $pdo->prepare($sql); // 准备一条预处理语句

// 占位符的使用方法一, 这样还可以便面sql注入
$res = $stmt->execute(array(":username"=> $username,":pwd" => $pwd)); 
if(!$res){
    echo exit("错误信息: ".var_dump($stmt->errorInfo()));
}
echo $stmt->rowCount(); // 有记录返回1, 没有返回0

// 占位符使用方法二
$sql = "SELECT * FROM user WHERE `user`=? AND pwd=?"; // 1
//$sql = "SELECT * FROM user WHERE `user`=:username AND pwd=:pwd"; // 2
$stmt = $pdo->prepare($sql);
$stmt->execute(array($username, $pwd));
$stmt->execute(array(':username'=> $username, ':pwd' => $pwd));
echo $stmt->rowCount(); // 有记录返回1,没有返回0

方法绑定参数

$sql = "SELECT * FROM user  WHERE `user`= :username AND `pwd`= :pwd"; // 1
$sql = "SELECT * FROM user WHERE `user`=? AND `pwd`=?";
$stmt = $pdo->prepare($sql);



//对于使用命名占位符的预处理语句,应是类似 :name  形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置, 常用的方式一般会使用 :name形式的参数名,这样看起来比较直观。 

$stmt->bindParam(':username', $username); 
$stmt->bindParam(':pwd', $pwd);

// 使用?问好占位符,索引从一开始, 第二个参数必须是一个变量,不能是直接的值
$stmt->bindParam(1, $username);
$stmt->bindParam(2, $pwd);

$stmt->execute();
echo $stmt->rowCount(); //有记录返回1,没有返回0



// 同时可以插入多条语句
$username = "demo6";
$pwd = md5('demo1');
$email = "test1@test.com";
$sql = "INSERT INTO user (`user`, `pwd`, `email`) VALUES (:username, :pwd, :email)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->bindParam(':pwd', $pwd);
$stmt->bindParam(':email', $email);
if(!$stmt->execute()){
    var_dump($stmt->errorInfo());exit;
}

$username = "demo7";
$pwd = md5('demo1');
$email = "test2@test.com";
$stmt->bindParam(':username', $username);
$stmt->bindParam(':pwd', $pwd);
$stmt->bindParam(':email', $email);
if(!$stmt->execute()){
    var_dump($stmt->errorInfo());exit;
}
echo $stmt->rowCount();

//删除语句
$id = 6;
$user = 'demo6';
//$sql  = "DELETE FROM user WHERE id = :id AND user=:username";
$sql  = "DELETE FROM user WHERE id = ? AND user=?";
$stmt = $pdo->prepare($sql);
//$stmt->bindParam(':id', $id);
//$stmt->bindParam(':username', $user);
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $user);

$stmt->execute();
echo $stmt->rowCount();

//更新语句
$id = 5;
$user = 'demo7';
$sql = "UPDATE user SET user = :user WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':user', $user);
$stmt->bindParam(':id', $id);
$stmt->execute();
echo $stmt->rowCount();

相关文章推荐

预处理语句的使用-代码典型缺陷分析(一)

BAD:          尽管这块代码能够正确执行,能够完成都应的业务逻辑的处理,但这个预处理语句使用是有问题的。因为这个SQL语句是动态拼接而来的,这样处理和Statement直接处理几乎一点...

mysql 的 占位符使用 以及一次执行多行sql语句

占位符的使用:drop PROCEDURE if EXISTS test12; -- 使用drop 来删除存储过程或者表create PROCEDURE test12() -- 创建存储过程 命名为t...

关于使用占位符来解决SQL注入

总结: SQL已经预编译好了,然后替换中间的占位符,这个占位符在编译后就已经确定了它只是一个参数属性。因此,用注入的代码去替换占位符,这个SQL也不会再进行编译了,所以也达不到注入的目的。 S...

占位符,SQL注入?

这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关。他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占...

mysql的动态sql实现变量表名及占位符的使用

MySQL 在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况,如数据量很大的时候就会用到分表。通过在网上查了mysql 5.1以上的版本提供了p...

SQL注入防御之三——SQL语句预处理(PHP)

这篇文章将会告诉你,PHP怎么使用SQL语句预处理,预处理语句有什么优点,以及分析预处理语句如何防止SQL注入...

jdbc之使用占位符的增删改查

package com.hanchao.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java...

[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作

最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑。 方案选择 笔者已知的做批量更新有以下几种方案: 1、逐条更新   这种是最简单的方...

JDBC_使用PreparedStatement执行update操作

1.使用PreparedStatement1)使用Statement 需要进行拼写SQL语句 ,很辛苦 而且容易出错PreparedStatement 是Statement的子接口,可以传入带占位符的...

PDO进行sql语句预处理和操作结果集详细介绍(二)

PDO进行sql语句预处理和操作结果集详细介绍(二)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:预处理语句占位符的使用
举报原因:
原因补充:

(最多只允许输入30个字)