MySQL 从 mysql 连接到 mysqli 的迁移

MySQL 从 mysql 连接到 mysqli 的迁移

阅读更多:MySQL 教程

背景

MySQL 是一款广受欢迎的关系型数据库管理系统,常用于 Web 开发中。mysqli 是 MySQL 官方提供的一个支持面向对象编程的数据库扩展库,相较于 mysql,mysqli 更加安全、更加强大、更加简单易用,因此被广泛采用。如果你正在使用 mysql 连接,那么这篇文章将介绍如何迁移到 mysqli,以更好地应对 MySQL 的使用和安全问题。

MySQLi 是什么

MySQLi 是 MySQL 官方推荐的扩展库,全称 MySQL Improved Extension,它支持面向对象编程、预处理语句、存储过程和多结果集等更多高级功能。相比 mysql 连接,mysqli 连接更加安全、更加强大、更加简单易用。

使用 mysqli 不仅能够让我们的代码更简洁,而且还可以提高程序的执行效率,减少代码中的 SQL 注入风险。下面我们将分别介绍如何使用 mysqli 安全连接数据库、使用 mysqli 预处理语句等基础操作。

安全连接数据库

PHP 应用程序中,如果我们使用 mysql 连接,则需要把数据库用户名和密码明文保存在 PHP 文件中,这样非常不安全。恶意用户很容易窃取这些敏感信息,然后对你的数据库造成极大的破坏。如下是使用 mysql 连接时连接数据库的样例:

<?php
conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('dbname',conn);
res = mysql_query("SELECT * FROM table",conn);
while (row = mysql_fetch_assoc(res)) {
    print_r(row);
}
mysql_close(conn);
?>

如果我们使用 mysqli 连接,在连接数据库时,可以避免用户名和密码明文放置的风险。如下是使用 mysqli 连接时连接数据库的样例:

<?php
conn = mysqli_connect('localhost', 'username', 'password', 'dbname');res = mysqli_query(conn, "SELECT * FROM table");
while (row = mysqli_fetch_assoc(res)) {
    print_r(row);
}
mysqli_close($conn);
?>

可以看到,使用 mysqli 连接时将用户名和密码等敏感信息保存在连接字符串中,这样可以使 PHP 代码更加安全。

使用 mysqli 预处理语句

当我们需要向数据库中插入一条新的记录时,应该使用 mysqli 预处理语句来避免 SQL 注入攻击。预处理语句可以帮助我们将变量与 SQL 语句分离开来,从而防止注入攻击。下面是使用 mysqli 预处理语句时的样例。

<?php
conn = mysqli_connect("localhost", "username", "password", "dbname");stmt = conn->prepare("INSERT INTO table (name, age, sex) VALUES (?, ?, ?)");stmt->bind_param("sis", name,age, sex);name = "Lily";
age = 18;sex = "female";
$stmt->execute();
?>

上述样例中的 ? 即为占位符。在执行 bind_param() 方法时,它的第一个参数表示绑定的变量类型,”sis” 分别代表字符串、整型、字符串。这样我们就可以安全地向数据库中插入新的一条记录。

使用 mysqli 存储过程

在 MySQL 中,存储过程(Stored Procedure)是一段预先定义好的 SQL 代码,可以根据需要调用这些代码。MySQLi 扩展支持使用 mysqli 存储过程功能。下面是使用 mysqli 存储过程的样例,存储过程的功能是向 table 表中插入一条新的记录。

<?php
conn = new mysqli("localhost","username", "password", "dbname");
if (conn->connect_errno) {
    printf("Connect failed: %s\n", conn->connect_error);
    exit();
}
if (!conn->query("DROP PROCEDURE IF EXISTS insert_table") ||
    !conn->query("CREATE PROCEDURE insert_table (IN name CHAR(20), IN age INT, IN sex CHAR(10)) INSERT INTO table (name, age, sex) VALUES (name, age, sex)")) {
    echo "Stored procedure creation failed: (" .conn->errno . ") " . conn->error;
}
if (!conn->query("CALL insert_table('Lily', 18, 'female')")) {
    echo "CALL failed: (" . conn->errno . ") " .conn->error;
}
res =conn->query("SELECT * FROM table");
while (row =res->fetch_assoc()) {
    print_r(row);
}conn->close();
?>

上述样例中,首先使用 mysqli 连接到数据库,然后使用 conn->query() 方法创建存储过程,并执行存储过程。最后使用conn->query() 方法查询 table 表中的记录。当然存储过程功能更加强大,我们可以按需编写存储过程,利用存储过程实现复杂的数据库操作。

总结

MySQLi 是 MySQL 官方推荐的扩展库,相较于 mysql 连接更加安全、更加强大、更加简单易用,广泛被应用于 PHP 项目中。在使用 mysqli 时,可以通过安全连接数据库、使用 mysqli 预处理语句、使用 mysqli 存储过程等方式,实现更加灵活、安全的数据库操作。如果你正在使用 mysql 连接,那么强烈建议你迁移到 mysqli 连接上来,以更好地应对 MySQL 的使用和安全问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程