预编译技术可以提高数据库效率,防止sql注入攻击。下面是一个mysqli的预编译查询demo。
数据库情况
这里假设我有一个test库,里面有一个user表,表中有id(int),username(string),money(double),sex(string),age(int)五列。
其中有一条数据是(id=1,username=‘admin’,money=1.23,sex=‘男’,age=18)。
一次简单的查询
下面我将以id和username和money为条件查询sex和age。
<?php
//连接数据库,填写数据库主机、用户、密码、库名
$mysqli=new mysqli(127.0.0.1, root, toor, test);
if($mysqli->connect_error){
die("连接失败!".$mysqli->connect_error);
}
//设置查询编码
$mysqli->query("set names utf8");
//编写sql语句,查询条件处用?占位
$sql = "select sex,age from user where id= ? and username= ? and money= ? ;";
//初始化一个预编译语句
$pre_sql = $mysqli->prepare($sql);
//给$pre_sql绑定参数,即给其输入条件
$id = 1;
$username = 'admin';
$money= 1.23;
//i=>int s=>string d=>double,与后面的参数一一对应
$pre_sql->bind_param('isd', $id,$username,$money);
//绑定结果集 也就是将查询结果直接给某参数,数量要能对应上
$pre_sql->bind_result($result1,$result2);
if($pre_sql->execute()){
echo '<br> 执行成功!';
}else{
echo '<br> 执行失败' . $mysqli->error;
}
//处理查询结果
if(!$pre_sql->fetch()){
//没有内容
die("No User");
}else{
//有内容,直接输出
echo $result1.$result2;
}
//关闭预编译语句
$pre_sql->close();
//关闭连接
$mysqli->close();
?>
第二次查询
两次查询如果想使用同一个预编译变量$pre_sql,在之间要调用close()销毁预编译语句之后才能再次使用。