PHP 之通过 MySQLi 操作 MySQL 数据库
MySQLi 介绍
MySQLi 扩展使得用户可以利用 MySQL 4.1 及其更高版本的新功能,与 mysql 扩展相比,MySQLi 扩展在以下方面有了明显的提高。
兼容性与维护性:
MySQLi 扩展可以很容易地使用 MySQL 的新功能,所以 MySQLi 拥有与 MySQL 更高的兼容性。即使 MySQL 的新版本又出现了更多功能,MySQLi 扩展也可以很容易的支持。
面向对象:
MySQLi 扩展已封装到一个类中,从而可使用面向对象的方式编程。即使对面向对象不了解,MySQLi 扩展也提供了面向过程的编程方式来供用户选择。
速度和安全性:
MySQLi 扩展执行的速度要比之前版本的 mysql 扩展快了很多。MySQLi 扩展支持 MySQL 新版本的密码杂凑(Password Hashes)和验证程序,更加提高了应用程序的安全性。
预准备语句:
预准备语句可提高重复使用的语句的性能,MySQLi 扩展提供了对预准备语句的支持。
调试功能:
MySQLi 扩展进一步改进了调试功能,提高了开发效率。
MySQLi 安装
Linux 和 Windows: 在 php7 mysql 包安装时 MySQLi 扩展多数情况下是自动安装的。
安装详细信息,请查看: http://php.net/manual/en/mysqli.installation.php
可以通过 phpinfo () 查看是否安装成功:
连接 MySQL
<?php
$servername = "localhost";
$username = "user";
$password = "password";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
?>
关闭连接
连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
mysqli_close($conn);
创建数据库
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 创建数据库
$sql = "CREATE DATABASE myDB";
if (mysqli_query($conn, $sql)) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
创建 MySQL 表
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 使用 sql 创建数据表
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
if (mysqli_query($conn, $sql)) {
echo "数据表 MyGuests 创建成功";
} else {
echo "创建数据表错误: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
插入数据
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if (mysqli_query($conn, $sql)) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
?>
mysqli_multi_query()
函数可用来执行多条 SQL 语句。
使用预处理语句
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
} else {
$sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES(?, ?, ?)";
// 为 mysqli_stmt_prepare() 初始化 statement 对象
$stmt = mysqli_stmt_init($conn);
//预处理语句
if (mysqli_stmt_prepare($stmt, $sql)) {
// 绑定参数
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
// 设置参数并执行
$firstname = 'John';
$lastname = 'Doe';
$email = 'john@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Mary';
$lastname = 'Moe';
$email = 'mary@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Julie';
$lastname = 'Dooley';
$email = 'julie@example.com';
mysqli_stmt_execute($stmt);
}
}
?>
注意参数的绑定。让我们看下 mysqli_stmt_bind_param () 中的代码:
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
该函数绑定参数查询并将参数传递给数据库。第二个参数是 "sss" 。以下列表展示了参数的类型。 s 字符告诉 mysql 参数是字符串。
可以是以下四种参数:
- i - 整数
- d - 双精度浮点数
- s - 字符串
- b - 布尔值
每个参数必须指定类型,来保证数据的安全性。
通过类型的判断可以减少 SQL 注入漏洞带来的风险。
查询读取数据
<?php
$servername = "localhost";
$username = "user";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 输出数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}
mysqli_close($conn);
?>