`
kaozjlin
  • 浏览: 116392 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

mysqli使用prepared语句

    博客分类:
  • php
阅读更多

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

分享到:
评论

相关推荐

    PHP-MySQLi-Database-Class

    描述中提到的"Wrapper for a PHP MySQL class, which utilizes MySQLi and prepared statements"进一步阐述了这个封装类的核心特性。预处理语句是MySQLi的一个重要功能,它能够防止SQL注入攻击,提高查询性能,并使...

    PHP语言中mysql与mysqli应用浅析.pdf

    mysqli 的优点有很多,例如:在面向对象接口、多语句执行、事务支持、prepared 语言支持、嵌入式服务以及调试能力等方面。 在连接方面,mysql 函数拥有非粘合连接功能,每一个请求或者响应都需要单独的发送 TCP ...

    PHP MySQL 预处理语句:读取数据:Where子句.md

    在 PHP 中使用 MySQL 预处理语句(Prepared Statements)是一种非常推荐的方法来执行数据库操作,特别是在涉及到用户输入的情况下。预处理语句通过将数据与 SQL 查询语句分离的方式帮助防止 SQL 注入攻击,这是...

    SQL注入Bypass安全狗4.0.pdf

    1. 使用prepared statements:使用prepared statements可以防止SQL注入攻击,因为攻击者无法修改SQL语句。 2. 输入验证:对用户输入进行验证,可以防止攻击者输入恶意数据。 3. 输出编码:对输出结果进行编码,可以...

    php+mysqli实现批量执行插入、更新及删除数据的方法

    需要注意的是,在实际开发中,为了避免SQL注入等安全问题,应当使用预处理语句(prepared statements)进行数据库操作。同时,对于批量操作应当进行适当的异常捕获和处理,确保数据的一致性和操作的安全性。

    php中数据库连接方式pdo和mysqli对比分析

    PDO与MySQLi在性能上各有千秋,通常PDO在处理预处理语句(Prepared Statements)时能够带来更快的性能,特别是在客户端的预处理语句上。预处理语句是一种有效防止SQL注入的方式,它将SQL语句的结构与数据分开处理,...

    PHP的mysqli_stmt_init()函数讲解

    在PHP的MySQLi扩展中,`mysqli_stmt_init()` 是一个非常重要的函数,它用于初始化预处理语句(Prepared Statements)的过程。预处理语句是一种提高数据库操作性能和安全性的方式,尤其是在执行多次相同或相似查询时...

    PHP mysqli扩展库 预处理技术的使用分析

    预处理语句(Prepared Statements)的基本步骤如下: 1. **建立数据库连接**:通过`new MySQLi()`创建一个数据库连接对象,例如: ```php $mysqli = new MySQLi("localhost", "root", "root", "test"); ``` 2. ...

    解析在PHP中使用mysqli扩展库对mysql的操作

    mysqli扩展库是PHP用来连接和操作MySQL数据库的一个强大扩展,相比传统的mysql扩展,mysqli提供了面向对象的编程接口,以及一些额外的功能,比如支持预处理语句(prepared statements)、存储过程等。这使得mysqli...

    PHP以mysqli方式连接类完整代码实例

    与早先的 MySQL 扩展相比,MySQLi 支持 MySQL 数据库的更多新特性,如面向对象接口、预处理语句(prepared statements)、事务处理等,同时对错误处理也提供了更好的支持。 在本实例中,详细讲解了一个名为 `db_...

    PHP使用mysql与mysqli连接Mysql数据库用法示例

    两个扩展都可以执行相同的数据库操作,但是mysqli提供了额外的功能,比如面向对象的接口、预处理语句(prepared statements)、更复杂的事务控制和存储过程。预处理语句有助于防止SQL注入攻击,并且可以提高重复查询...

    php中转义mysql语句的实现代码

    使用`mysql_real_escape_string()`函数时,有一个重要的注意事项:应该只对传入SQL语句的字符串参数使用该函数,而不是对整条SQL语句使用。如果对整条SQL语句使用`mysql_real_escape_string()`函数,可能会导致SQL...

    php常见问题的汇总

    1. 使用预处理语句(Prepared Statements):预处理语句能确保用户输入的数据不会被解析为 SQL 代码。在 PHP 中,可以使用 PDO(PHP Data Objects)或 MySQLi 扩展的预处理语句功能。 ```php $stmt = $pdo->prepare...

    浅谈php中mysql与mysqli的区别分析

    此外,`mysqli`还支持**预处理语句(Prepared Statements)**,这是一种安全高效的方式来执行SQL查询,可以防止SQL注入攻击。预处理语句允许开发者先定义SQL结构,然后多次绑定不同的参数执行,提高了代码的安全性和...

    php+mysqli批量查询多张表数据的方法

    - **预编译语句**:对于重复执行的SQL,可以使用预编译语句( Prepared Statements),进一步提高性能并防止SQL注入。 通过熟练掌握上述技巧,开发者可以更高效地处理多表数据查询任务,提升PHP应用程序的性能。...

    用PHP3访问MySQL数据库的几种方法.pdf

    4. **MySQLi Prepared Statements**: MySQLi扩展提供了预处理语句,可以防止SQL注入攻击。例如: ```php $stmt = $mysqli->prepare('SELECT * FROM users WHERE id=?'); $stmt->bind_param('i', $id); $stmt->...

    php+mysqli事务控制实现银行转账实例

    此外,对于大型系统,我们可能需要使用预编译语句( Prepared Statements)以提高性能和安全性,以及使用存储过程来封装复杂的业务逻辑。 了解了这个基本的事务控制实例后,开发者可以进一步研究mysqli扩展提供的...

    PHP防止SQL注入的研究.pdf

    1. **预处理语句(Prepared Statements)**:使用PDO或MySQLi扩展的预处理语句可以有效地防止SQL注入。预处理语句将查询结构与用户输入的数据分开,确保即使用户输入恶意代码,也无法改变查询的原始结构。 2. **...

    php资料1.txt

    - **安全性**:在实际应用中,为了防止SQL注入攻击,建议使用预处理语句(prepared statements)来执行SQL查询。这种方法可以有效防止恶意用户通过输入特殊的SQL代码来操控数据库。 - **错误处理**:在开发过程中,...

    SQL注入漏洞演示源代码

    - 使用预编译的SQL语句(如PHP的PDO或MySQLi的 prepared statements),将参数与SQL语句分离,减少注入风险。 - 对用户输入进行严格的验证和过滤,避免特殊字符。 - 使用存储过程,限制直接SQL执行。 - 最小权限...

Global site tag (gtag.js) - Google Analytics