首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

封装mysqli预处理

基础概念

mysqli 是 PHP 中用于与 MySQL 数据库进行交互的扩展。预处理语句(Prepared Statements)是一种特殊的 SQL 语句,它允许在执行前对参数进行绑定,从而提高查询的安全性和性能。

相关优势

  1. 安全性:预处理语句可以有效防止 SQL 注入攻击,因为参数值在执行时会被视为纯文本,而不是 SQL 代码的一部分。
  2. 性能:对于需要多次执行的相同 SQL 语句,预处理语句可以减少解析和编译的开销。
  3. 可读性和维护性:预处理语句将 SQL 逻辑与数据分离,使代码更易于阅读和维护。

类型

mysqli 中,预处理语句主要分为两种类型:

  1. 准备语句(Prepare Statement):使用 mysqli_prepare() 函数创建。
  2. 绑定参数(Bind Parameters):使用 mysqli_stmt_bind_param() 函数将参数绑定到准备好的语句上。

应用场景

预处理语句广泛应用于需要执行动态 SQL 查询的场景,如用户输入验证、数据插入、更新和删除等。

示例代码

以下是一个简单的 mysqli 预处理语句的封装示例:

代码语言:txt
复制
<?php
class MysqliDB {
    private $conn;

    public function __construct($host, $user, $password, $database) {
        $this->conn = new mysqli($host, $user, $password, $database);
        if ($this->conn->connect_error) {
            die("连接失败: " . $this->conn->connect_error);
        }
    }

    public function prepare($sql) {
        $stmt = $this->conn->prepare($sql);
        if (!$stmt) {
            throw new Exception("预处理失败: " . $this->conn->error);
        }
        return $stmt;
    }

    public function bindParam($stmt, $types, ...$params) {
        $bind_names = array();
        foreach ($params as $key => $value) {
            $bind_name = 'bind' . $key;
            $$bind_name = $value;
            $bind_names[] = &$$$bind_name;
        }
        call_user_func_array('mysqli_stmt_bind_param', array_merge(array($stmt, $types), $bind_names));
    }

    public function execute($stmt) {
        return $stmt->execute();
    }

    public function close() {
        $this->conn->close();
    }
}

// 使用示例
$db = new MysqliDB('localhost', 'root', 'password', 'testdb');

$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
$stmt = $db->prepare($sql);

$db->bindParam($stmt, 'ss', 'john_doe', 'john@example.com');
$db->execute($stmt);

$db->close();
?>

参考链接

常见问题及解决方法

  1. SQL 注入:确保所有用户输入都通过预处理语句进行处理,避免直接拼接 SQL 语句。
  2. 参数绑定错误:检查 mysqli_stmt_bind_param() 的调用是否正确,确保参数类型和数量与 SQL 语句中的占位符匹配。
  3. 执行错误:使用 mysqli_stmt_error() 函数获取详细的错误信息,以便调试和解决问题。

通过以上封装和示例代码,可以更方便地在项目中使用 mysqli 预处理语句,提高代码的安全性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本。我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容。...而在 MySQLi 中,我们则需要指定 MySQLi_Driver 对象中的报错属性为抛出异常,很明显,MySQLi_Driver 就是 MySQLi 的驱动对象。...// 使用异常处理错误情况 $driver = new mysqli_driver(); $driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT...预处理语句 总体来说,事务的处理和 PDO 的区别不大,但是预处理语句和 PDO 中的使用的区别就有一些了。首先是我们的 MySQLi 中的占位符只有 ? 问号占位。...对于我们来说,还是多以学习了解为主,在自己封装或者使用某些以 MySQLi 为底层数据库操作的框架时不至于晕头转向。

2.4K00

PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句 对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本。...我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容。所以在这里,我们就不再多讲理论方面的东西了,直接上代码来看看 MySQLi 中这两大特性与 PDO 在使用上的区别。...预处理语句 总体来说,事务的处理和 PDO 的区别不大,但是预处理语句和 PDO 中的使用的区别就有一些了。首先是我们的 MySQLi 中的占位符只有 ? 问号占位。...对于我们来说,还是多以学习了解为主,在自己封装或者使用某些以 MySQLi 为底层数据库操作的框架时不至于晕头转向。...的事务与预处理语句.php 参考文档: https://www.php.net/manual/zh/book.mysqli.php

2.2K10
  • PHP中的MySQLi扩展学习(一)MySQLi介绍

    只面向过程 不支持 存储过程 、 多语句执行 、 预处理语句 PHP7 中已经删除了并且完全不支持 然后是 PDO 。...仅支持面向对象方式使用 可以连接多种数据库,切换数据库带来的变更少,甚至可能不用修改代码 支持 存储过程 、 多语句执行 、 预处理语句 最后就是 MySQLi 。...支持面向对象和面向过程两种写法 仅支持 MySQL 数据库 支持 存储过程 、 多语句执行 、 预处理语句 跟随 PHP 及 MySQL 的版本更新,可以更快速地支持更多的 MySQL 高级特性 从它们三个的这些特点来看...本身它们其实并没有什么太大的差别,不过现代化的大型框架中基本都会将 PDO 作为默认的数据库连接来进行封装,毕竟它的可移植性可以方便这些通用框架连接不同的数据库。...$mysqli = mysqli_connect("localhost", "root", "", "blog_test");$res = mysqli_query($mysqli, "SELECT *

    2.9K00

    PHP中的MySQLi扩展学习(一)MySQLi介绍

    只面向过程 不支持 存储过程 、 多语句执行 、 预处理语句 PHP7 中已经删除了并且完全不支持 然后是 PDO 。...仅支持面向对象方式使用 可以连接多种数据库,切换数据库带来的变更少,甚至可能不用修改代码 支持 存储过程 、 多语句执行 、 预处理语句 最后就是 MySQLi 。...支持面向对象和面向过程两种写法 仅支持 MySQL 数据库 支持 存储过程 、 多语句执行 、 预处理语句 跟随 PHP 及 MySQL 的版本更新,可以更快速地支持更多的 MySQL 高级特性 从它们三个的这些特点来看...本身它们其实并没有什么太大的差别,不过现代化的大型框架中基本都会将 PDO 作为默认的数据库连接来进行封装,毕竟它的可移植性可以方便这些通用框架连接不同的数据库。...$mysqli = mysqli_connect("localhost", "root", "", "blog_test"); $res = mysqli_query($mysqli, "SELECT

    2.9K20

    PHP中的MySQLi扩展学习(六)MySQLI_result对象操作

    PHP中的MySQLi扩展学习(六)MySQLI_result对象操作 在之前的文章中,我们就已经接触过 MYSQLI_result 相关的内容。它的作用其实就是一个查询的结果集。...但在 MySQLi 中,会把查询到的结果也放入一个对象中,这就是 MySQLI_result 对象。...MySQLI_result 对象属性 首先,我们要通过一段查询来获得一个 MySQLI_result 对象。...另外还有一个 fetch_assoc() 方法,直接就是返回 MYSQLI_ASSOC 格式的数据,这个方法不需要任何参数,它可以看成是 fetch_array(MYSQLI_ASSOC) 这种使用方式的一个封装...总结 至此,MySQLi 相关扩展的学习我们也就告一段落了,其它的一些类和函数比如 MySQLI_Driver 、 MySQLI_Exception 之类的内容大家可以自行查阅相关的文档,内容都不是很多

    2.9K10

    PHP中操作数据库的预处理语句

    PHP中操作数据库的预处理语句 今天这篇文章的内容其实也是非常基础的内容,不过在现代化的开发中,大家都使用框架,已经很少人会去自己封装或者经常写底层的数据库操作代码了。...操作预处理语句 虽说主流是 PDO ,而且大部分框架中使用的也是 PDO ,但我们在写脚本,或者需要快速地测试一些功能的时候,还是会使用 mysqli 来快速地开发。...当然,mysqli 也是支持预处理语句相关功能的。...// mysqli 预处理 $conn = new mysqli('127.0.0.1', 'root', '', 'blog_test'); $username = 'one'; $stmt = $conn...总结 预处理语句的能力在现在的框架中都已经帮我们封装好了,其实我们并不需要太关心,就像 Laravel 中使用 DB::select() 进行数据库操作时,我们就可以看到预处理语句的应用。

    1.2K40

    通过 PHP Mysqli 扩展与数据库交互

    实际上,我们完全可以把 PHP 应用看作是 MySQL 服务器的客户端,然后通过封装好的 PHP 扩展包提供的 API 与 MySQL 服务器进行交互,就好像我们在命令行和客户端软件中所做的一样,只不过现在这种交互由手动操作转变成了通过编写对应的...扩展中,可以通过构建预处理语句的方式实现: 首先通过 mysqli_prepare 函数构建包含占位符(替代具体参数值)的预处理 SQL 语句; 然后通过 mysqli_stmt_bind_param...函数将参数值绑定到预处理语句; 最后通过 mysqli_stmt_execute 函数执行填充参数值之后的完整 SQL 语句,由于底层做了转化处理,所以这时候执行的 SQL 语句不存在 SQL 注入风险...; // 释放资源 mysqli_stmt_close($stmt); 基本流程后上面介绍的预处理语句执行流程一致,需要注意的是在 mysqli_stmt_bind_param 的第二个参数中,需要指定参数类型...预处理语句执行之后,记得通过 mysqli_stmt_close 函数释放资源。

    3.1K20

    PHP Mysqli 常用代码集合

    PHP5.0开始,不仅可以使用早期的mysql数据库扩展函数,还能使用新扩展的mysqli技术实现与mysql数据库的信息交流,PHP的mysqli扩展被封装在在一个类中,它是一种面向对象技术,只能在PHP5...和MYSQL4,1或更高的版本才能使用,(i)表示该进,使用mysqli,执行速度更快,更方便,更高效,也可以使数据库访问更安全(因为用类模式) 使用mysqli 简单流程 设置PHP.ini 配置文件...类 mysql4.1版本开始提供一种预处理(prepared statement)的机制,它可以见整个命令向MYSQL服务器发送一次,以后只有参数变化,MYSQL只需要对命令做一次的分析就够了,大大减少需要传输的数据量...$res2 or $mysqli->affected_rows !....jpg 以上就是PHP Mysqli 常用代码集合所有详细内容。

    1.8K20

    PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法

    PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法 虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli...$mysqli2 = @new mysqli("xxx", "root", "", "blog_test"); var_dump($mysqli2->connect_errno); // int(2002...除了使用 预处理 功能来解决 SQL 注入之外,MySQLi 还为我们提供了一个 real_escape_string() 方法,可以手工地解决SQL语句中的一些特殊符号问题。...var_dump($mysqli->thread_safe); // NULL var_dump($mysqli->thread_id); // int(600) $thread_id = $mysqli...mysqli 对象 上面说的很多属性其实我们可以直接通过打印 mysqli 对象就可以查看到。

    1.6K10
    领券