php操纵mysqli数据库的实现方法

5年以前  |  阅读数:558 次  |  编程语言:PHP 

从php5.0开始增加mysql(i)支持 , 新加的功能都以对象的形式添加

i表示改进的意思 功能多、效率高、稳定

编译时参数:


    ./configure --with-mysql=/usr/bin/mysql_config \ #使用 Mysql ClientLibrary(libmysql)构建
    --with-mysqli=mysqlnd \ #使用 Mysql Native Dirver 即mysqlnd
    --with-pdo-mysql=mysqlnd #使用 Mysql Native Dirver 即mysqlnd

由于版权问题 从 php5.3开始 php开始用 mysqlnd 替代 libmysql.dll
mysqlnd 是zend公司开发的mysql数据库驱动,相比原来各方面都有所提高

使用mysqlnd编译


    ./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 加上你的参数

mysqli 过程、对象方式都支持

mysqli提供的三个类:

1、mysqli 和连接相关的
2、MySQLi_Result 处理结果集
3、mysqli_stmt 预处理类

设置字符集

set_charset

获取字符集

character_set_name

获取数据库对象


    //创建mysqli对象方式 1
    //屏蔽连接产生的错误
    $mysqli = new mysqli('127.0.0.1', 'root', '', 'test');

    //只能用函数来判断是否连接成功
    if(mysqli_connect_errno())
    {
      echo mysqli_connect_error();
    }

    //创建mysqli对象方式 2 可以设置一些参数
    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
    $mysqli->real_connect('127.0.0.1', 'root', '', 'test'); 

query:失败返回false,select成功返回结果集对象,其他返回true 非false,意味着sql执行成功了

无结果集示例


    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
    $mysqli->real_connect('127.0.0.1', 'root', '', 'test');

    $sql = "insert into limove(`name`, `order`) values('aa', 11)";
    $rst = $mysqli->query($sql);

    $sql = "delete from limove where id = 221";
    $rst = $mysqli->query($sql);

    if($rst === false)
    {
      ee($mysqli->errno);
      ee($mysqli->error);
    }

    #影响条数
    ee($mysqli->affected_rows);
    #插入的id
    ee($mysqli->insert_id);

    ee($mysqli);

有结果集


    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
    $mysqli->real_connect('127.0.0.1', 'root', '', 'test');

    $sql = "select * from limove as limove_as";

    $result = $mysqli->query($sql);
    if($result === false)
    {
      ee($mysqli->errno);
      ee($mysqli->error);
    }

    #行数
    ee($result->num_rows);

    #列数
    ee($result->field_count);

    #字段个数
    ee($result->field_count);

    #获取所有字段的信息
    $field_arr = $result->fetch_fields();

    #移动字段的指针
    // $result->field_seek(1);

    #依次获取字段的信息
    while($field = $result->fetch_field())
    {
      ee($field);
    }

    #移动记录指针
    $result->data_seek(1);

    #一次获取所有数据
    $data = $result->fetch_all(MYSQLI_ASSOC);

    #关联数组方式获取结果集
    $data = array();

    $result->data_seek(0); #重置指针到起始
    while($row = $result->fetch_assoc())
    {
      $data[] = $row;
    }

    ee($data);


    $result->free();
    $mysqli->close();

一次 执行多条语句 multiquery (不推荐使用)

无结果集,此时 affected_rows 只能获取到最后的那条影响的条数


    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
    $mysqli->real_connect('127.0.0.1', 'root', '', 'test');


    $sql_arr = array(
      'insert into limove(id,`name`, `order`) values(null, 1, 2)',    
      'insert into limove(id,`name`, `order`) values(null, 1, 222)',    
      'delete from limove where `order` = 2',    
    );

    $sql = implode(';', $sql_arr);

    $result = $mysqli->multi_query($sql);
    if($result === false)
    {
      ee($mysqli->errno);
      ee($mysqli->error);
    }

    $mysqli->close();

有结果集


    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
    $mysqli->real_connect('127.0.0.1', 'root', '', 'test');

    $sql_arr = array(
      'show tables',    
      'desc select * from limove',    
      'show create table limove',    
    );

    $sql = implode(';', $sql_arr);

    $rst = $mysqli->multi_query($sql);

    if($rst === false)
    {
      ee($mysqli->errno);
      ee($mysqli->error);
    }

    do{
      $result = $mysqli->store_result();#获取当前光标所在的结果集

      $data = $result->fetch_all();

      ee($data);

    }while($mysqli->next_result());#光标移动到下一个结果集

    $mysqli->close();

事务处理:


    $mysqli=new mysqli("localhost", "root", "123456", "xsphpdb");

      //事务处理
      $mysqli->autocommit(0);

      $error=true;

      $price=50;

      $sql="update zh set ye=ye-{$price} where name='zhangsan'";

      $result=$mysqli->query($sql);

      if(!$result){
        $error=false;
        echo "从张三转出失败
    ";
      }else{
        if($mysqli->affected_rows==0){
          $error=false;
          echo "张三的钱没有变化";  
        }else{
          echo "从张三账号中转出成功!
    ";
        }
      }

      $sql="update zh set ye=ye+{$price} where name='lisi1'";

      $result=$mysqli->query($sql);

      if(!$result){
        $error=false;
        echo "从李四转入失败
    ";
      }else{
        if($mysqli->affected_rows==0){
          $error=false;
          echo "李四的钱没有变化";  
        }else{
          echo "向李四账号中转入成功!
    ";
        }
      }

      if($error){
        echo "转账成功!";
        $mysqli->commit();
      }else{
        echo "转账失败!";
        $mysqli->rollback();
      }

      $mysqli->autocommit(1);
      $mysqli->close();

mysqli_stmt:mysqli预处理类(推荐):表示了准备好的一个语句,服务器端只编译一次sql

用mysqli和mysqli_result可以实现同样的功能

优点:效率高,适用于语句相同只是数据不同的情况 ,可以阻止sql注入的产生

mysqli_stmt示例:非select语句


    require 'fns.php';

    //创建mysqli对象方式 
    $mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');

    //只能用函数来判断是否连接成功
    if(mysqli_connect_errno())
    {
      echo mysqli_connect_error();
      die;
    }

    $mysqli->set_charset('utf8');

    $sql = "insert into limove values(?, ?, ?)"; //语句一样值不相同情况



    //mysqli中有直接的方法可用
    $stmt = $mysqli->prepare($sql);

    //绑定参数
    $stmt->bind_param('iss', $id, $name, $order);

    for($i=0;$i<5;$i++){
      $id = 0;
      $name = 'name';
      $order = mt_rand(1, 1000);
      $stmt->execute();

    }

    //最后id
    ee($stmt->insert_id);

    //影响的行数 注:最后一条执行的
    ee($stmt->affected_rows);

    //错误号
    ee($stmt->errno);

    //错误信息
    ee($stmt->error);

    //stmt对象中可以看到更多的信息
    ee($stmt);

    eee($mysqli);

mysqli_stmt示例:select语句 1


    require 'fns.php';

    //创建mysqli对象方式 
    $mysqli = @new mysqli('127.0.0.1', 'root', '', 'test');

    //只能用函数来判断是否连接成功
    if(mysqli_connect_errno())
    {
      echo mysqli_connect_error();
      die;
    }

    $mysqli->set_charset('utf8');

    $sql = "select * from limove where id

以上这篇php操纵mysqli数据库的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
贪吃蛇
文件下载
获取IMEI
双位运算符
发送邮件
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
提取后缀名
年的日历图
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例