• mysqli 预处理


    应用环境 mysqli预处理功能(大量数据处理时使用)
    步骤  
    a)mysqli连接数据库 $conn= new mysqli('localhost','root','123456','apple');
    b)设置编码 $conn->set_charset('utf8');
    c)发送query语句

    使用$conn->prepare($sql)这个方法表示是预处理,如果涉及到取值,必须指定查询字段

    $sql = "select * from product_info where product_id=?";

    $stmt = $conn->prepare($sql);

    d)提供条件

    比如上句用了?作为不确定的值,就需要指定

    $stmt->bind_param('i',$product_id);        用变量绑定?表示的值,i表示整型,d表示浮点型,b代表二进制,s代表其它的所有

    1. //参数绑定->给?号赋值 这里类型和顺序要一致,类型、赋值和??的顺序要一致  
    2. //参数有以下四种类型:  
    3. //i - integer(整型)  
    4. //d - double(双精度浮点型)  
    5. //s - string(字符串)  
    6. //b - BLOB(binary large object:二进制大对象)  

    $product_id=$_GET['product_id'];           指定变量的值

    e)绑定结果格式并执行

    $stmt->bind_result($product_id,$product_info,$product_trans,$product_price);   绑定结果格式

    $stmt->execute();                发送变量,此时服务器的语句已经完整了

     f)从sql服务器中取回结果  

    预处理语句会将结果集保存在sql开辟的内存中,php开辟的内存无法直接使用(count是php函数,不是sql函数,无法直接与sql内存交互),默认情况是每次执行fetch()会从sql内存中取出一行,但是不使用store_result()就无法获取行数.当然如果你的结果只有一行,可以无视这一句.请记住:在mysqli预处理中取出数据,只能使用fetch()这是因为mysqli_stmt类并没有其它取值方法

    $stmt->store_result();     //如果用变量接收的话,会发现成功了显示1,否则显示0(所以用变量接受的值并不是结果集)

     g)获取结果集行数  $count = $stmt->num_rows();
     h)输出结果
    while($field=$result->fetch_field()){
    echo $field->name."--"; //输出数据库字段信息
    }
    while($stmt->fetch()){
    echo "$product_id--$product_info--$product_trans--$product_price"; //输出取出数据信息
    }

    前面说了,既然要取值,当然前面query指定了查询字段,上句的变量用上了
     i)关闭mysqli链接  
    $conn->close();
       

    !!!!!!!!非常重要,如果一个php块中需要进行多次mysqli预处理语句,在前一个预处理结束后,必须要关闭前一个预处理,才能绑定后一个预处理语句,非常重要!!!否则报错:Fatal error: Call to a member function bind_param() on boolean

    原因:mysqli是一个持久连接,需要手动关闭。

    前篇转载自 http://www.cnblogs.com/lyf-blog/p/5728341.html

    ------------------------------------------------------------------------------------------------------  华丽的分割线  ------------------------------------------------------------------------------------------

    跟mysqli和mysqli_result相比:
      1.此二者能完成的功能,都可以使用mysqli_stmt完成
      2.效率高:如果执行多次相同的SQL语句,只是语句中的数据不同,因为将一条语句在服务器端准备好 ,然后将不同的值传给服务器,再让此语句执行

        编译一次,使用多次
      3.安全上:防SQL注入(?占位),后期传的值不会当成SQL语句


      总的来说,安全,高效,所以推荐使用

    <?php
      //连接并创建一个stmt对象
      $mysqli=new mysqli("localhost","root","snail","mysqldb");

    /* 方法一
      $stmt=$mysqli->stmt_init();
      
      //准备好一条语句放到服务器中,如insert
      $sql="insert into shop(name,price)values(?,?)";
      $stmt->prepare($sql);
    */

      //方法二:准备好一条语句放到服务器中,如insert,同时创建stmt对象
    //  $sql="insert into shop(name,price)values(?,?)";

      $sql="update shop set name=?,price=? where id=?";
      $stmt=$mysqli->prepare($sql);

      //给每个占位符?传值(也叫参数绑定) i(整型) d(double) s(string) b(二进制,如图片、声音)
      $stmt->bind_param("sdi",$name,$price,$id);
      
      $name="zhangsan11111111";
      $price=525.15;
      $id=121;

      $stmt->execute();

      $name="zhangsa2222222";
      $price=58.15;
      $id=120;

      $stmt->execute();

      $name="zhangs786733333";
      $price=88.15;
      $id=119;

      $stmt->execute();

      echo "最后ID:".$stmt->insert_id."<br>";
      echo "影响行数:".$stmt->affected_rows."<br>";

      $stmt->close();

    ?>

    处理有结果集的

    <?php
      //连接并创建一个stmt对象
      $mysqli=new mysqli("localhost","root","snail","mysqldb");

      $stmt=$mysqli->prepare("select id,name,price from shop where id>?");
      $stmt->bind_param("i",$id);
      $stmt->bind_result($id,$name,$price);
      $id=120;

      $stmt->execute();

      $stmt->store_result();  //一次性将结果都取出来,然后就可以使用$stmt->data_seek();了

    //  $stmt->data_seek(2);  //在返回的结果集中移动指针
       

      //字段信息
      $result=$stmt->result_metadata();
      while($field=$result->fetch_field()){
        echo $field->name."--";
      }

      echo "<br>";
      while($stmt->fetch()){
        echo "$id--$name--$price<br>";
      }
      
      echo "记录总数:".$stmt->num_rows;

      $stmt->free_result();
      $stmt->close();
      
    ?>

    后篇转载自 http://blog.163.com/info_technology/blog/static/127815054201222135618224/

    搭配食用更佳哦 

    既不回头,何必不忘; 既然无缘,何须誓言; 今日种种,逝水无痕; 明夕何夕,君已陌路;
  • 相关阅读:
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    Java实现无向图的欧拉回路判断问题
    _stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l 比较函数
    ring3下利用WMI监视进程创建(vc版)
    更改当前电源策略(使用SetActivePwrScheme API函数),自定义电源按钮动作(设置GLOBAL_POWER_POLICY)
    zyltimer与ZylIdleTimer
    QtCreator源码分析—2.启动主程序(4篇)
  • 原文地址:https://www.cnblogs.com/zyjfire/p/6768477.html
Copyright © 2020-2023  润新知