mysqli连接mysql数据库,利用预处理进行数据操作

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();  //关闭数据库连接
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值