zoukankan      html  css  js  c++  java
  • mysqli 操作数据库

    从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 "从张三转出失败<br>";
        }else{
            if($mysqli->affected_rows==0){
                $error=false;
                echo "张三的钱没有变化";    
            }else{
                echo "从张三账号中转出成功!<br>";
            }
        }
    
        $sql="update zh set ye=ye+{$price} where name='lisi1'";
    
        $result=$mysqli->query($sql);
    
        if(!$result){
            $error=false;
            echo "从李四转入失败<br>";
        }else{
            if($mysqli->affected_rows==0){
                $error=false;
                echo "李四的钱没有变化";    
            }else{
                echo "向李四账号中转入成功!<br>";
            }
        }
    
        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(?, ?, ?)"; //语句一样值不相同情况
    
    /*
    //获取stmt对象
    $stmt = $mysqli->stmt_init();
    
    //准备一条sql语句,放到服务器端
    $stmt->prepare($sql);
    */
    
    //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<?";
    $stmt = $mysqli->prepare($sql);
    
    $stmt->bind_param('i', $i);
    $stmt->bind_result($a, $b, $c);
    
    $i=40;
    $stmt->execute();
    
    //把结果都取过来
    $stmt->store_result();
    
    //获取字段信息
    $result = $stmt->result_metadata();//只能获取一些字段信息
    while($field = $result->fetch_field())
    {
        ee($field->name);
    }
    
    //$stmt->data_seek(2); //移动指针的位置,只有执行 store_result 后才能生效
    
    while($stmt->fetch()){
        ee("{$a}|{$b}|{$c}");
    }
    
    //记录的条数 ,只有执行 store_result 后才能生效
    ee($stmt->num_rows);
    ee($stmt);
    $stmt->free_result();
    $stmt->close();

       mysqli_stmt示例:select语句 2

    <?php 
    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<?";
    $stmt = $mysqli->prepare($sql);
    
    $stmt->bind_param('i', $i);
    $stmt->bind_result($a, $b, $c);
    
    $i=40;
    $stmt->execute();
    
    //获取结果
    $result = $stmt->get_result();
    $data = $result->fetch_all(MYSQLI_ASSOC);
    
    ee($data);
    debug();
  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/baocheng/p/5736634.html
Copyright © 2011-2022 走看看