(转载)http://kaozjlin.iteye.com/blog/890855

mysqli函数库支持prepared语句的使用。它们对于在执行大量具有不同数据的相同查询时,可以提高执行速度。它们也可以免受sql注射风格(injection-style)的攻击。

prepared语句的基本思想是可以向mysql发送一个需要执行的查询模板,然后再单独发送数据。我们可以向相同的prepared语句发送大量的相同数据;这个特性对批量处理的插入操作来说是非常有用的。

例如一个插入操作,可以使用prepared语句,如下所示:

$query = "insert into books values(?,?,?,?)";

$stmt = $db->prepare($query);

$stmt->bind_param("sssd",$isbn,$author,$title,$price);

$stmt->execute();

echo $stmt->affected_rows.' book inserted into database.';

$stmt->close();

下面,我们逐行分析以上代码。

当设置查询时,不是替换前面已经生成的变量,而是在每一段数据的位置设置问号。在这些问号的周围,不能再设置问号或其他分界符号。

第二行是调用 $db->prepare(),在过程版本中,是通过mysqli_stmt_prepare()函数实现的。这一行将构建一个语句对象或需要用来完成实际处理的资源。

语句对象有一个bind_param()方法。(在过程版本中,是mysqli_stmt_bind_param()函数)。

bind_param()的用途是告诉php那些变量应该被问号所替换。第一个参数是一个格式化字符串,与printf()使用的格式化字符串不同。在这里,所传递的值意味着4个参数分别是字符串、字符串、字符串和双精度。格式化字符串中的其他字符还有:i表示整数,b表示blob。在这个参数之后,必须列出与语句中的问号数量相同的变量。他们将依次被替换。

调用$stmt->execute()函数(在过程版本中是mysqli_stmt_execute()函数)将真正运行这个查询。我们可以访问受影响的行数并关闭这个语句。

那么prepared语句的作用如何呢?这里,一个优点是可以改变着4个绑定变量的值,并且在不用准备的情况下重新执行这个语句。这个功能对于循环执行批量插入操作来说是非常有用的。

与绑定参数一样,也可以绑定结果。对于select类型查询,可以使用stmt->bind_result()函数(或mysqli_stmt_bind_result()函数)提供希望填充结果列的变量列表。每次调用$stmt->fetch()函数(或者mysqli_stmt_fetch()函数)时,结果集下一行的列值将被填充到这些绑定变量中。例如,在前面介绍的图书搜索脚本中,可以使用:

$stmt->bind_result($isbn,$author,$title,$price);

将这四个变量绑定到将通过返回的4列。在调用如下语句后:

$stmt->execute();

可以在循环中调用:

$stmt->fetch();

(转载)mysqli使用prepared语句的更多相关文章

  1. 【转载】经典SQL语句大全

    [原文地址]http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库CREATE DATABAS ...

  2. <转载>批处理之FOR语句祥解

    批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...

  3. (转载)用SQL语句创建Access表

    <来源网址:http://www.delphifans.com/infoview/Article_220.html>用SQL语句创建Access表 很久以前弄的,用了一天的时间,没有什么技 ...

  4. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('')在Delphi中进行字符变量连接相加时单引号用('' ...

  5. PHP中MySQL、MySQLi和PDO的用法和区别【原创】

    对于一个初学PHP的自己,对数据库的连接有着很大的疑惑,从Java转到PHP.数据库连接变了,以前只知道JDBC连接数据库,或者直接用框架调用,对于的PHP的数据库连接方式,及其应用.不是很了解,于是 ...

  6. php mysqli扩展之预处理

    在前一篇 mysqli基础知识中谈到mysqli的安装及基础操作(主要是单条sql语句的查询操作),今天介绍的是mysqli中很重要的一个部分:预处理. 在mysqli操作中常常涉及到它的三个主要类: ...

  7. php操作mysqli(示例代码)

    <?php define("MYSQL_OPEN_LOGS",true); class mysqliHelp { private $db; public function _ ...

  8. PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

    PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. P ...

  9. PHP中MySQL、MySQLi和PDO的用法和区别

    PHP的MySQL扩展(优缺点) 设计开发允许PHP应用与MySQL数据库交互的早期扩展.mysql扩展提供了一个面向过程 的接口: 并且是针对MySQL4.1.3或更早版本设计的.因此,这个扩展虽然 ...

随机推荐

  1. 自动显示git分支--安装oh-my-zsh(Ubuntu环境)

    1,安装zsh sudo apt-get install zsh 2,克隆项目 git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh- ...

  2. 如何打包成jar包自己看呢?

    第一步:选择你要导出的部分 第二步:

  3. SqlServer 三级联动、递归表

    SqlServer 省市县三级联动 三张表递归合并成一张表sql如下: insert into table2(area_name,area_parent_id) select province,'0' ...

  4. Animating Layout Changes(展开收起)

    原文地址:https://developer.android.com/training/animation/layout.html#add (1)设置布局文件: <LinearLayout an ...

  5. jsp - 引用 jar包.

    在jsp中使用不同的方式引用jar,准备的工作也不同.我接触过的有两种:1)直接在jsp页面中引用;2)在src下的java类中引用,然后在jsp中调用java类. 1)直接引用:可以将jar包丢到W ...

  6. 2.Oracle11g体系结构

    2.1逻辑存储结构 2.1.1数据块(Data Blocks) 数据块是Oracle逻辑结构中最小的逻辑单位,也是执行数据库输入输出最小的存储单位.通常Oracle数据库是操作系统块的整数倍,如果操作 ...

  7. 原生Javascript实现控制DIV属性

    写在前面: 从事前端工作已有一年之久,因为工作的性质,不太涉及JS方面,所以自己的JS水平一直处于小白阶段,工作闲暇之余,在网上找了一些小项目,希望练练手,促进自己成长.这是第一篇,后续还会有很多记录 ...

  8. Codeforces 549B Looksery Party

    Looksery Party Solution: 仔细分析一下会发现每个人都会发一条消息给自己这个条件非常重要! 这个条件保证了一定会有解,而且解法也要从这里入手. 当我们拿到一个猜测的答案序列的时候 ...

  9. tp接支付宝接口签名不相等解决办法 接口版本3.3 tp版本3.1

    (2)在Core.php和Notify.php文件中添加了去掉TP的URL中的'_URL_'参数的函数.这个是必须的,否则会导致验证失败问题.具体改变为: function paraFilter改为 ...

  10. jQuery 个人随笔

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...