PHP是目前最流行的服务器端脚本语言之一,广泛应用于动态网站和Web应用程序的开发。MySQL作为一个开源关系型数据库系统,与PHP的结合非常紧密,几乎是每个PHP开发者日常工作中不可或缺的一部分。在Web开发中,如何将PHP与MySQL进行连接,是开发过程中最基本、最常见的操作之一。本文将介绍PHP连接MySQL数据库的常见方法,包括传统的mysql_*函数、改进的mysqli扩展以及现代的PDO(PHP Data Objects)扩展。
1. 使用 mysql_* 函数(已弃用)
mysql_* 系列函数曾是PHP中最常用的数据库操作方法之一。但由于其在安全性、性能等方面存在问题,PHP 5.5版本之后官方已宣布弃用,并在PHP 7.0中完全删除。尽管如此,了解这种方法仍然有助于理解PHP历史上的数据库操作方式。
示例:使用 mysql_* 连接数据库
phpCopy Code<?php
// 连接数据库
$conn = mysql_connect("localhost", "username", "password");
// 检查连接是否成功
if (!$conn) {
die("Connection failed: " . mysql_error());
}
// 选择数据库
mysql_select_db("my_database", $conn);
// 执行查询
$result = mysql_query("SELECT * FROM my_table");
// 输出查询结果
while ($row = mysql_fetch_array($result)) {
echo $row['column_name'];
}
// 关闭连接
mysql_close($conn);
?>
注意:如前所述,mysql_* 函数已经过时,强烈建议不要在新的项目中使用。
2. 使用 mysqli 扩展(推荐)
mysqli(MySQL Improved)是PHP在较新的版本中提供的增强型MySQL接口。相比于mysql_*,mysqli支持面向对象的编程方式,同时也支持预处理语句(prepared statements),更有效地防止SQL注入攻击,推荐在实际开发中使用。
使用 mysqli 连接数据库(面向过程)
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// 执行查询
$result = mysqli_query($conn, "SELECT * FROM my_table");
// 输出查询结果
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column_name'];
}
// 关闭连接
mysqli_close($conn);
?>
使用 mysqli 连接数据库(面向对象)
mysqli 也支持面向对象的编程方式,可以创建一个mysqli对象,调用其方法进行数据库操作:
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 执行查询
$result = $conn->query("SELECT * FROM my_table");
// 输出查询结果
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 关闭连接
$conn->close();
?>
预处理语句示例(防止SQL注入)
mysqli 的一个显著优势是支持预处理语句(Prepared Statements),能够有效防止SQL注入攻击。
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 使用预处理语句
$stmt = $conn->prepare("SELECT * FROM my_table WHERE column_name = ?");
$stmt->bind_param("s", $column_value); // "s" 表示参数类型为字符串
$column_value = 'example_value'; // 用户输入值
$stmt->execute();
// 获取结果
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 关闭连接
$stmt->close();
$conn->close();
?>
3. 使用 PDO 扩展(最推荐)
PDO(PHP Data Objects)是PHP提供的一个抽象数据库访问层,支持多种数据库系统,包括MySQL、PostgreSQL、SQLite等。PDO的最大优势是它提供了一种统一的接口,方便在不同数据库之间切换。此外,PDO 还支持预处理语句和事务处理等特性,能够更加灵活和安全地进行数据库操作。
使用 PDO 连接数据库
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 设置PDO连接选项
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 设置异常模式
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 设置默认返回的结果类型
);
// 创建连接
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, $options);
// 设置字符集
$conn->exec("set names utf8");
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
// 执行查询
$stmt = $conn->query("SELECT * FROM my_table");
// 输出查询结果
while ($row = $stmt->fetch()) {
echo $row['column_name'];
}
// 关闭连接
$conn = null;
?>
使用 PDO 预处理语句(防止SQL注入)
PDO 也支持预处理语句,下面是一个通过PDO执行预处理语句的示例:
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 创建连接
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
// 使用预处理语句
$stmt = $conn->prepare("SELECT * FROM my_table WHERE column_name = :value");
$stmt->bindParam(':value', $column_value, PDO::PARAM_STR);
$column_value = 'example_value'; // 用户输入值
$stmt->execute();
// 获取结果
while ($row = $stmt->fetch()) {
echo $row['column_name'];
}
// 关闭连接
$conn = null;
?>
在PHP中,连接MySQL数据库的方法有很多。虽然mysql_*已经被弃用,但mysqli和PDO仍然是两种非常流行的连接方式。以下是对这两者的对比和总结:
mysqli:功能强大,支持面向过程和面向对象两种编程方式,支持预处理语句、事务等,适合专门使用MySQL的项目。
PDO:提供统一的数据库接口,支持多种数据库系统,适合需要数据库抽象层和更高灵活性的项目。PDO在跨数据库开发时尤其有优势。
对于现代PHP开发,推荐使用PDO,因为它更具扩展性和可移植性。同时,PDO的预处理语句和错误处理机制也提供了更好的安全性和代码可维护性。