很多对代码不熟悉的朋友总觉得PDO能够有效防止SQL注入,其实真正防止SQL注入的是php预处理,你可以使用mysqli面向对象预处理、面向过程预处理,也可以使用PDO预处理,其实真正起作用的还是预处理。下面的代码会表达出PDO预处理的精髓!

$dbms = 'mysql';
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'root';
$db_name = 'study';
$dsn = "$dbms:host=$db_host;dbname=$db_name";
$conn = new PDO($dsn,$db_user,$db_pass);
//判断数据库是否连接成功
if($conn->errorCode()){
die("filed".$conn->errorInfo());
}

$sql = "select * from users where username = :name";
//预编译语句
$stmt = $conn->prepare($sql);
//定义要传入的变量(可以接收传过来的值)
$username='admin';
//将变量绑定到占位初
$stmt ->bindParam(':name',$username);
//执行sql语句
$stmt->execute();
// pdo预编译 占位符
// $sql = "select * from users where username=? ";
// $stmt = $conn->prepare($sql);
// $username = 'root';
//占位符通过变量绑定
// $stmt -> bindParam(1,$username);
// $stmt->execute();
// $stmt->bindColumn(3,$id);
// $stmt->bindColumn(2,$username);
// 占位符通过数组绑定
// $stmt ->execute([$username]);
// $stmt->bindColumn(3,$id);
// $stmt->bindColumn(2,$username);
//将对应的数据库对应的列绑定到变量上
$stmt->bindColumn(1,$pass);
$stmt->bindColumn(2,$user);
$stmt->bindColumn(3,$id);
//将数据取出
while($stmt->fetch()){
echo $id."<br>";
echo $username."<br>";
}
//释放内存资源
$stmt =null;
//断开连接
$conn = null;