博客列表 >Mysqli的使用、特点、多语句查询、类的封装及事务处理和预处理(*)

Mysqli的使用、特点、多语句查询、类的封装及事务处理和预处理(*)

福哥的博客
福哥的博客原创
2017年07月24日 21:21:161045浏览

1、和mysql扩展库的区别:

     (1   安全性、稳定性更高

     (2  提供了面向对象和面向过程两种风格

2、php.ini  中的  extension=php_mysqli.dll 解除封印

3、面向对象:查询列表

<?php
 
    //mysqli ***作数据(面向对象风格)
   
  #1、创建Mysql对象
   
    $mysqli=new MySQLi("127.0.0.1","root","daomul","test");
    if(!$mysqli)
    {
        die("连接失败!".$mysqli->connect_error);
   }
   
   #2、***作数据库
   
   $sql="select * from user1";
   $res=$mysqli->query($sql);
   
   #3、处理结果
   
   while($row=$res->fetch_row())
   {
       foreach($row as $key=> $val)
       {
           echo "-- $val";
       }
       echo "<br/>";
   }
   #4、关闭资源
   $res->free();//释放内存
   $mysqli->close();//关闭连接
   
 ?>

4、面向对象:封装类后实现

    4.1 Sqliconnect.class.php

<?php
  
     Class Sqliconnect
     {
          private $mysqli;
          private static $host="127.0.0.1";
          private static $root="root";
          private static $password="daomul";
          private static $db="test";
         
         function __construct()
         {
              $this->mysqli=new MySQLi(self::$host,self::$root,self::$password,self::$db);
              if(!$this->mysqli)
              {
                    die("数据库连接失败!".$this->mysqli->connect_error);
              }
              
              $this->mysqli->query("set names utf8");
         }
         
         //查询***作
         public function excute_dql($sql)
         {
               $res=$this->mysqli->query($sql) or die("数据查询失败".$this->mysqli->error);
               return $res;
               
         }
         
         //增删改***作
         public function excute_dml($sql)
         {
               $res=$this->mysqli->query($sql) or die("数据***作失败".$this->mysqli->error);
               if(!$res)
               {
                    echo "数据***作失败";
               }
               else
               {
                    if($this->mysqli->affected_rows>0)
                    {
                          echo "***作成功!";
                    }
                    else
                    {
                         echo "0行数据受影响!";
                    }
               }
         }
         
    }
 ?>

     4.2 调用页面startsqli.php

<?php
  
    //mysqli ***作数据(面向对象风格)
    
    require_once "Sqliconnect.class.php";
    
    $Sqliconnect=new Sqliconnect();
    
   //$sql="insert into user1(name,password,email,age) values('帝都',md5('gg'),'sd@sohu.com',23)";
   //$sql="delete from user1 where id=11";
   //$res=$Sqliconnect->excute_dml($sql);
   
   $sql="select name from user1;";
   $res=$Sqliconnect->excute_dql($sql);
   while($row=$)
   
   $res->free();
 ?>

5、同时执行多条数据库语句 multiQuery.php

<?php
  
    //mysqli ***作数据(面向对象风格)
    
    #1、创建Mysql对象
    
    $mysqli=new MySQLi("127.0.0.1","root","daomul","test");
    if(!$mysqli)
    {
        die("连接失败!".$mysqli->connect_error);
   }
   
   #2、***作数据库
   
   $sqls="select * from user1;";
   $sqls.="select * from user2";
   
   #3、处理结果
   
   if($res=$mysqli->multi_query($sqls))
   {
        echo "211";
      do 
      {
           //从mysqli连续取出第一个结果集
           $result=$mysqli->store_result();
           
           //显示mysqli result对象
           while($row=$result->fetch_row())
           {
             foreach($row as $key=> $val)
             {
                 echo "-- $val";
             }
            echo "<br/>";
          }
          
        $result->free();//及时释放当前结果集,并进入下一结果集
          
          //判断是否有下一个结果集
          if(!$mysqli->more_results())
          {
            break;
          }
        echo "<br/>************新的结果集**************";
        
      }while($mysqli->next_result());
  }
  
   #4、关闭资源
   $mysqli->close();//关闭连接  
   
   
 ?>

6、事务控制

<?php
  
    //mysqli ***作数据(面向对象风格)
    
   
     // 数据库 :create table account(id int primary key,balance float);
     
    $mysqli=new MySQLi("127.0.0.1","root","daomul","test");
    if(!$mysqli)
   {
        die("数据库连接失败!".$mysqli->connect_error);
   }
   //将提交设为false
   $mysqli->autocommit(false);
   
   $sql1="update account set balance=balance+1 where id=1;";//没错的语句
   $sql2="update accounterror2 set balance=balance-1 where id=2";//有错的语句
   
   $res1=$mysqli->query($sql1);
   $res2=$mysqli->query($sql2);
   
   if(!$res1||!$res2)
   {
       //回滚:其中一个不成功即回滚不提交
        echo "有错,回滚,请重新提交!";
        $mysqli->rollback();//die("***作失败!".$mysqli->error);
   }
   else
   {
       //所有均成功则提交
        echo "所有提交成功!";
        $mysqli->commit();
   }
   
   $mysqli->close();
 /* 
     1、 start transaction; 开启事务
     2、svaepoint a;    做保存点
     3、执行***作1; 
     4、 svaepoint b;
     5、执行***作2;
     ...
     6、rollback to a/b; 回滚或者是提交
     7、commit 
     
     事务控制特点acid  原子性/一致性/隔离性/持久性
    */
    ?>

7、预处理技术

  主要在连接和编译过程精简,还可以SQL防止注入

    7.1 预编译插入多个数据

 <?php
  
    //mysqli 预编译演示
    
    #1、创建mysqli对象
    $mysqli=new MySQLi("127.0.0.1","root","daomul","test");
    if(!$mysqli)
    {
         die("数据库连接失败!".$mysqli->connect_error);
   }
   
   #2、创建预编译对象
   $sql="insert into user1(name,password,email,age) values(?,?,?,?);";//暂时不赋值,用问号代替
   $stmt=$mysqli->prepare($sql) or die($mysqli->error);
  
   /********************************可重复执行时需要的代码start*********************************/
   #3、绑定参数
   $name='小明5';
   $password='34f';
   $email='ssd@qq.com';
   $age='1';
   
   #4、参数赋值(第一个参数指代参数的类型缩写,string-s,int-i,double-d,bool-b
   $stmt->bind_param("sssi",$name,$password,$email,$age);
   
   #5、执行代码(返回布尔类型)
   $flag=$stmt->execute();
   
  /********************************可重复执行时需要的代码 end************************************/
   
   #6、结果以及释放
   
   if(!$flag)
   {
       die("***作失败".$stmt->error);
   }
   else
   {
       echo "***作成功!";
   }
   
   $mysqli->close();
   
  
 ?>

     7.2 预编译查询多个数据

<?php
  
    //mysqli 预编译演示
    
    #1、创建mysqli对象
    $mysqli=new MySQLi("127.0.0.1","root","daomul","test");
    if(!$mysqli)
    {
         die("数据库连接失败!".$mysqli->connect_error);
   }
   
    /********************************可重复执行时需要的代码 start*******************************/
  
   #2、创建预编译对象
   $sql="select id,name,email from user1 where id>?;";//id,name,email和后面的结果集bind_result()对应
   $stmt=$mysqli->prepare($sql) or die($mysqli->error);
  
   #3、绑定参数
   $id=5;
   
   #4、参数赋值(第一个参数指代参数的类型缩写,string-s,int-i,double-d,bool-b
   $stmt->bind_param("i",$id);//绑定参数
   $stmt->bind_result($id,$name,$email);//绑定结果集
   
   #5、执行代码(返回布尔类型)
   $stmt->execute();
   
   #6、取出结果集显示
   while($stmt->fetch())
   {
       echo "<br/>$id--$name--$email";
   }
   
   /********************************可重复执行时需要的代码 end*******************************/
   
   #7、结果以及释放
   
   //释放结果
   $stmt->free_result();
   //关闭预编译语句
   $stmt->close();
   //关闭数据库连接
   $mysqli->close();
   
   ?>

8、其他函数

  (1  获取行数和列数  num_rows   field_count

  (2  获取结果集的一列 :表头 例如

              $result=$mysqli->query();

              $result->fetch_field();

    (3 取出数据

             $row=$result->fetch_row(); //获得每一行数据

             再通过 foreach($row as $val){} 取出每一个数据-->


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议