最近写接口过程中需要用到php和mysql,使用过程中发现了一般的操作方法有sql注入风险,后来使用了PDO,PDO是什么呢?
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
使用PDO我们可以用bindValue函数,它可以有效防止sql注入,这样便于我们基础开发
首先当然是连接数据库喽!可以写一个公共的数据库信息文件定义常量
<?php
/**
* PDO数据库连接
* @author 捕风阁
* @time 2020.2.1
*/
// include "config.php";
$dsn = "mysql:dbname=test;host=localhost";
$user = 'root';
$password = 'root';
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
} catch (PDOException $e) {
echo '数据库连接失败' . $e->getMessage();
}
接下来就到了紧张刺激的操作环节了
查询
$sql = "select * from test where iuser = :name";
$res = $dbh->prepare($sql);
//使用bindValue()绑定参数防止注入
$res->bindValue(":name",$username);
$res->execute();
$row = $res->fetch(PDO::FETCH_ASSOC);
这里顺带要说一下这两个函数,不对还有一个
fetch() 返回单个的元组,也就是一条记录(row)
fetchAll() 返回多个元组,即返回多个记录(rows)
rowCount() 返回结果行数 $row = $res->rowCount();
另外还得说一下里面的PDO方法
PDO::FETCH_ASSOC 从结果集中获取以列名为索引的关联数组。
PDO::FETCH_NUM 从结果集中获取一个以列在行中的数值偏移量为索引的值数组。
PDO::FETCH_BOTH 这是默认值,包含上面两种数组
PDO::FETCH_OBJ 从结果集当前行的记录中获取其属性对应各个列名的一个对象。
PDO::FETCH_BOUND 使用fetch()返回TRUE,并将获取的列值赋给在bindParm()方法中指定的相应变量。
PDO::FETCH_LAZY 创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这 三种接口中任选一种。
新增
$sql="insert into test (user,trade,time,money,state) values (:user,:trade,:time,:money,:state)";
$res = $dbh->prepare($sql);
//防止注入
$res->bindValue(":user",$username);
$res->bindValue(":trade",$trade);
$res->bindValue(":time",$time);
$res->bindValue(":money",$money);
$res->bindValue(":state",$state);
$res->execute();
$row = $res->rowCount();
修改
$sql="update test set i=0,vip=0,flag=0 where user = :user";
$res = $dbh->prepare($sql);
$res->bindValue(":user",$username);
$res->execute();
$row = $res->rowCount();
删除
$sql="delete from test where id>5"; $res = $dbh->prepare($sql); $res->execute(); $row = $res->rowCount();
最后可以用json_encode($row)输出json形式的数据
echo(json_encode($row));
goodbye,今天 你戴口罩了吗?
![图片[1] - php操作mysql及防注入基础 - 捕风阁](https://oss.osuu.net/uploads/2020/02/76860ed5d6b04c41b98d20c64e2d48bf.png)








暂无评论内容