博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)mysqli使用prepared语句
阅读量:5024 次
发布时间:2019-06-12

本文共 1379 字,大约阅读时间需要 4 分钟。

(转载)

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();

转载于:https://www.cnblogs.com/Robotke1/p/3197542.html

你可能感兴趣的文章
树的递归与非递归遍历方法
查看>>
每天一个Linux命令(6):rmdir命令
查看>>
oracle连接的三个配置文件(转)
查看>>
Vim配置文件(Vimrc)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>