mysqli是啥
- mysqli(mysql improvement)是mysql的扩展增强版,它使用的是面向对象的语法形式,也支持面向过程的写法。并且较mysql而言,mysql每次链接都会打开一个连接的进程,但是mysqli多次运行会使用同一连接进程,从而减少了服务器的开销
- 主要的类有三个:
mysqli类 - 连接、选择数据库,设置字符集等(与连接有关的处理)
mysqli_result类 - 获取记录、字段信息(处理返回的结果集)
mysqli_stmt类 - 定义和执行参数化的SQL命令(预处理类) & 防SQL注入
预处理
在php脚本中通常会有参数不同,结构相同的查询语句,当我们在使用的时候,每次都需要将整个命令进行传输。而预处理则是为了解决这个问题应运而生的,它可以将整个命令向MySQL服务器发送一次,以后只有参数发生变化,MySQL服务器只需对命令的结构做一次分析就够了。不仅能减少数据传输量,并且能提高处理效率。
预处理语句需要以下步骤:
1.初始化语句
$stmt = $conn->stmt_init()
2.把SQL查询传递给预处理语句,以确保它是有效的
$stmt->prepare($sql)
3.把变量绑定到查询中
$stmt->bind_param(string $types , mixed &$var1 [, mixed &$… ] ) 说明SQL语句中的”?“占位符所体态的变量,第一个参数是类型,第二个参数是变量名
例如: \$stmt->bind_param(‘sssd’ , \$code , \$language , \$official , \$percent ) 【i : int , s : string , d : double , b : blob/数据包】
(ps:此行\$前的\ ,是次编辑器的显示问题=.=)
4.把结果绑定到变量中(可选)
$stmt->bind_result() 参数为字段名
5.执行语句
$stmt->execute()
6.存储结果(可选)
$stmt->store_result()
7.提取结果
$stmt->fetch()
安装和配置
- 打开php.ini文件,将php_mysqli.dll前的 ; 去掉,开启mysqli操作类
- 可以访问php.info查看是否开启成功
连接mysql数据库
面向对象:
$mysqli = new mysqli('localhost', 'user', 'password', 'db_name'); //代参实例化对象,包括地址,用户,密码,数据库名
if($mysqli->mysqli_errno){ //判断连接是否出错
echo "连接失败". $mysqli -> connect_errno;
exit;
}
$mysqli->query("set name utf8"); //定义操作数据库时的字符编码
面向过程:
$mysqli = mysqli_connect('localhost', 'user', 'password', 'db_name');
if(!$mysqli){
echo "连接失败". mysqli_connect_errno ();
exit;
}
mysqli_query("set names 'utf8'");
查找数据
$stmt = $mysqli->stmt_init();
$sql = "select image_id,filename,caption from images where caption like ?";
$searchterm = '%'.$_GET['search'].'%'; //在获取到的用户输入前后加上%占位符,进行模糊查找
if($stmt->prepare($sql)){
$stmt->bind_param('s',$searchterm);
$stmt->bind_result($image_id,$filename,$caption);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows){ //计算返回的记录行数
while($stmt->fetch()){ //逐条取出来
echo $image_id.$filename.$caption;
}
}
}else{
echo $stmt->error;
}
插入数据
$stmt = $mysqli->stmt_init();
$sql = "insert into blog(title,article,created) values (?,?,now())";
if($stmt->prepare($sql)){
$stmt->bind_param('ss',$_POST['title'],$_POST['article']);
$stmt->execute();
if($stmt->affected_rows > 0){ //查询影响的行
echo "写入成功";
}else{
echo "写入失败";
}
}
//要考虑先查再插
//以上代码可以对SQL注入起到一定的防护作用
修改数据
$sql = "update blog set title = ?,article = ? where article_id = ?";
if($stmt->prepare($sql)){
$stmt->bind_param('ssi',$_POST['title'],$_POST['article'],$_POST['article_id']);
$done = $stmt->execute();
if($done){
echo "修改成功";
}
}
//同样,要先查再改
删除数据
$sql = "delete from blog where article_id = ?";
if($stmt->prepare($sql)){
$stmt->bind_param('i',$_POST['article_id']);
$stmt->execute();
if($stmt->affected_rows > 0){
echo "删除成功";
}else{
echo "删除失败";
}
}
收尾
$stmt->free_result(); //释放结果资源
$mysqli->close(); //关闭数据库连接