PHP的mysqli扩展和mysql扩展的区别是什么?底层原理是什么?

在 PHP 中,mysqli 扩展和 mysql 扩展都是用于连接和操作 MySQL 数据库的工具,但它们在功能、性能和使用方式上有一些显著的区别。

区别

  1. 面向对象 vs 过程化

    • mysqli:全称 MySQL Improved,是面向对象(OOP)的扩展。它提供了面向对象和过程化两种方式来操作数据库,支持更多现代化的 MySQL 功能。
    • mysql:过时的扩展,提供了仅仅过程化的接口,不支持面向对象的方法。在 PHP 5.5.0 版本后已不推荐使用,并在 PHP 7.0.0 版本中完全移除。
  2. 功能支持

    • mysqli:提供了事务支持、存储过程、预处理语句(prepared statements)、多语句查询等先进的 MySQL 功能。
    • mysql:功能相对较少,不支持事务、存储过程和预处理语句,因此在安全性和功能扩展上不如 mysqli
  3. 性能优化

    • mysqli:通过使用预处理语句和绑定参数可以提高性能和安全性,同时支持多语句查询,减少了网络开销。
    • mysql:由于不支持预处理语句,每次执行 SQL 查询都需要将 SQL 字符串和参数发送到 MySQL 服务器,可能导致性能较低,特别是在频繁查询时。

底层原理

  1. 连接和执行 SQL 查询

    • mysqli
      • 使用面向对象或过程化方式连接 MySQL 数据库,通过 mysqli_connect()new mysqli() 创建连接对象。
      • 执行 SQL 查询时,可以使用 mysqli_query() 方法执行普通查询,或者使用 prepare() 方法创建预处理语句,再通过 bind_param() 绑定参数并执行。
  2. 预处理语句

    • mysqli 提供了预处理语句的支持,这是一种将 SQL 查询语句预编译成一种特定格式,然后在执行时只需传入参数即可执行的技术。这种方法可以提高性能和安全性,因为参数是通过绑定的方式传递,可以防止 SQL 注入攻击。
  3. 事务支持

    • mysqli 支持事务操作,可以通过 begin_transaction()commit()rollback() 方法来开启、提交和回滚事务,确保数据库操作的原子性和一致性。
  4. 安全性考虑

    • mysqli 提供了绑定参数和预处理语句的机制,可以有效防止 SQL 注入攻击,因为参数不会直接插入到 SQL 查询语句中,而是在执行时动态绑定。
    • mysql 没有预处理语句的支持,因此开发者需要自行处理输入数据,防止恶意 SQL 注入。

通过理解 mysqlimysql 的区别和底层原理,可以选择更合适的扩展来连接和操作 MySQL 数据库,同时提高代码的安全性和性能效率。