PDO:php5php
假如如下是一个简单的登陆处理:前端
使用PDO链接mysql首先:mysql
新建数据库sql
new PDO("mysql:host=localhost;dbname=test","root","root");
host:服务器
dbname:数据库名
后面两个分别是账号和密码
默认不是长链接数据库
若是想使用长链接须要在后面加入参数:数组
new PDO("mysql:host=host;dbname=name","user","pw","array(PDO::ATTR_PERSISTENT => true) ");
看以下简单示例,在这里是单独说明,因此我没有加其余的东西:服务器
<?php //接收前端传过来的变量 $name=$_POST['username']; $pwd=$_POST['password']; //这里新建PDO链接,在这里我是本地测试的因此host我使用了localhost 数据库名为test,账号为root密码也是root $stmt = new PDO("mysql:host=localhost;dbname=test","root","root"); //使用prepare进行预处理,其中:name和:pwd是咱们等下要传入的变量值,这些都是占位符 $stmt = $stmt->prepare('SELECT * FROM user1 WHERE user1 = :name and pw1 = :pwd'); //以上的准备都作好了以后,咱们使用execute()方法负责执行准备好的查询 //该方法须要有每次迭代执行中替换的输入参数,在这里就是:name和:pwd 做为数组将值传递给方法 //从而值替换掉其中占位符 //固然也可使用bindParam,可是我仍是喜欢这种简单的方式,毕竟人懒 $stmt->execute(array('name' => $name,'pwd'=>$pwd)); while ($row = $stmt->fetch()) { print_r($row); }
注释已经说明了要说的内容,最后面使用while输出查询到的值,这样就能够防止sql注入,若是不行,那么请自行测试,输入如:’ or 1=1#
咱们看咱们的’ or 1=1#,若是咱们的name输入的是’ or 1=1#,注意 ’ or 1=1# 前面有一个单引号,那么若是咱们的sql语句本是以下:测试
SELECT * FROM user1 WHERE user1='123' AND pw1='234'
把user1的值改成了 ’ or 1=1# 后。
变成了fetch
SELECT * FROM user1 WHERE user1='' OR 1=1# and pw1='234'
其中因为sql中#表明:到此结束,那么说明后面的:and pw1=’234’都将无效,那么咱们的sql语句就等于变成了以下语句:spa
SELECT * FROM user1 WHERE user1='' OR 1=1
因为1=1是确定成立的,那么此句sql语句中的where条件将会永远正确,此时,语句变成或者说就等于了以下语句:
SELECT * FROM user1 WHERE TRUE
或者说:
SELECT * FROM user1
那么就会登陆成功,绕过了这次登陆。