zoukankan      html  css  js  c++  java
  • PHP PDO prepare()、execute()和bindParam()方法详解

    每次将查询发送给MySql服务器时,都必须解析该查询的语法,确保结构正确并能够执行。这是这个过程的必要步骤,但也确实带来了一些开销。做一次是必要的,但如果反复地执行相同的查询,批量插入多行并只改变列值时会怎么样呢?预处理语句会在服务器上缓存查询的语法和执行过程,而只在服务器和客户端之间传输有变化的列值,以此来消除这些额外的开销。

    PDO为支持此特性的数据库提供了预处理语句功能。因为MySql支持这个特性,所以可以在适当时使用预处理语句。

    预处理语句是使用两个方法实现的:prepare()方法负责准备要执行的查询,execute()方法使用一组给定的列参数反复执行查询。这些参数可以显示地作为数组传递给execute()方法,也可以使用通过bindParam()方法指定的绑定参数提供给execute()方法

    使用预处理语句--prepare()方法:

    Prepare()方法负责准备要执行的查询,语法格式如下:

    PDOStatement PDO::prepare(string statement[,array driver_options]);

    但是,使用准备语句的查询和以往使用的查询略有区别,因为对于每次执行迭代中要改变的值,必须使用占位符而不是具体的列值

    查询支持两种不同的语法:命名参数和问号参数

    使用命名参数的查询如下:

    insert into tb_chengji set xuesheng=:xuesheng,yuwen=:yuwen;

    其中:xuesheng与:yuwen都是列占位符。

    使用问号参数的查询如下:

    insert into tb_chengji set xuesheng=?,yuwen=?;

    其中?也是列占位符。

    选着哪一种语法都可以,但是前者更明确一些。

    下面使用prepare()方法准备一个用于迭代执行的查询:、

    <?php
    $dsn = "mysql:host=$db_host;dbname=$db_name";
    $pdo = new PDO($dsn,$db_user,$db_pwd);
    $query = "insert into tb_chengji set xuesheng=:xuecheng,yuwen=:yuwen";
    $result = $pdo->prepare($query);
    ?> 

    上面的代码将查询准备好了,继续下面的操作。

    执行准备查询--execute()方法

    execute()方法负责执行准备好的查询。语法格式如下:

    bool PDOStatement::execute([array input_parameters]);

    该方法需要有每次迭代执行中替换输入的参数。可以通过两种方法实现:作为数组将值传递给方法,或者通过bindParam()方法把绑定到查询中相应的变量名或位置偏移。

    下面介绍第一种方法,第二种方法在bindParam()方法中介绍。

    实例代码中准备了一条语句并通过execute()方法反复执行,每次使用不同的参数:

    <?php
    $db_host = '127.0.0.1';
    $db_name = 'student';
    $db_user = 'root';
    $db_pwd = '';
    $dsn = "mysql:host=$db_host;dbname=$db_name";
    $pdo = new PDO($dsn,$db_user,$db_pwd);
    $pdo->query('set names utf8');
    $query = "insert into tb_chengji set xuesheng=:xuesheng,yuwen=:yuwen";
    $result = $pdo->prepare($query);
    $result->execute(array(':xuesheng'=>'赵天平',':yuwen'=>90));
    $result->execute(array(':xuesheng'=>'张冬雪',':yuwen'=>115));
    ?> 

    下面通过使用bindParam()方法进行绑定来传递查询参数。

    绑定参数--bindparam()方法

    execute()方法中的input_parameters参数是可选的,虽然很方便,但是如果需要传递多个变量时,以这种方式提供数组会很快变得难以处理(当数组元素过多时,也就是当数据表中的列过多时,代码设计会变得特别难以阅读或出错)。使用bindParam()方法可以解决这个问题。预防格式如下:

    Boolean PDOStatement::bindParam(mixed parameter,mixed &variable[,int datatype[,int length[,mixed driver_options]]]);

    parameter:当在prepare()方法中使用命名参数时,parameter是预处理语句中使用语法(例如:xuesheng)指定的列值占位符的名字;使用问号参数时,parameter是查询中列值占位符的索引偏移。

    variable:该参数存储将赋给占位符的值。它按引用传递,因为结合准备存储过程使用此方法时,可以根据存储过程的某个动作修改这个值。

    下面修改前面的实例,使用bindParam()方法来赋列值:

    <?php
    $db_host = '127.0.0.1';
    $db_name = 'student';
    $db_user = 'root';
    $db_pwd = '';
    $dsn = "mysql:host=$db_host;dbname=$db_name";
    $pdo = new PDO($dsn,$db_user,$db_pwd);
    $pdo->query('set names utf8');
    $query = "insert into tb_chengji set xuesheng=:xuesheng,yuwen=:yuwen";
    $result = $pdo->prepare($query);
     
    $xuesheng = '赵明明';
    $yuwen = 98;
    $result->bindParam(':xuesheng',$xuesheng);
    $result->bindParam(':yuwen',$yuwen);
    $result->execute();
     
    $xuesheng = '王大大';
    $yuwen = 120;
    $result->bindParam(':xuesheng',$xuesheng);
    $result->bindParam(':yuwen',$yuwen);
    $result->execute();
    ?>

  • 相关阅读:
    Tars 服务调服务
    不一样的风格,C#的lambda表达式
    TCP/IP 协议图--传输层中的 TCP 和 UDP
    TCP/IP 协议图--TCP/IP 基础
    TCP/IP 协议图--计算机网络体系结构分层
    HTTP协议图--与 HTTP 协作的 Web 服务器
    HTTP协议图--HTTP 报文实体
    HTTP协议图--HTTP 响应状态码(重点分析)
    HTTP协议图--HTTP 报文首部之首部字段(重点分析)
    HTTP协议图--HTTP 报文首部之请求行、状态行
  • 原文地址:https://www.cnblogs.com/zhouguowei/p/5212994.html
Copyright © 2011-2022 走看看