PHP是目前最流行的服務(wù)器端腳本語(yǔ)言之一,廣泛應(yīng)用于動(dòng)態(tài)網(wǎng)站和Web應(yīng)用程序的開發(fā)。MySQL作為一個(gè)開源關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng),與PHP的結(jié)合非常緊密,幾乎是每個(gè)PHP開發(fā)者日常工作中不可或缺的一部分。在Web開發(fā)中,如何將PHP與MySQL進(jìn)行連接,是開發(fā)過(guò)程中最基本、最常見(jiàn)的操作之一。本文將介紹PHP連接MySQL數(shù)據(jù)庫(kù)的常見(jiàn)方法,包括傳統(tǒng)的mysql_*函數(shù)、改進(jìn)的mysqli擴(kuò)展以及現(xiàn)代的PDO(PHP Data Objects)擴(kuò)展。
1. 使用 mysql_* 函數(shù)(已棄用)
mysql_* 系列函數(shù)曾是PHP中最常用的數(shù)據(jù)庫(kù)操作方法之一。但由于其在安全性、性能等方面存在問(wèn)題,PHP 5.5版本之后官方已宣布棄用,并在PHP 7.0中完全刪除。盡管如此,了解這種方法仍然有助于理解PHP歷史上的數(shù)據(jù)庫(kù)操作方式。
示例:使用 mysql_* 連接數(shù)據(jù)庫(kù)
phpCopy Code<?php
// 連接數(shù)據(jù)庫(kù)
$conn = mysql_connect("localhost", "username", "password");
// 檢查連接是否成功
if (!$conn) {
die("Connection failed: " . mysql_error());
}
// 選擇數(shù)據(jù)庫(kù)
mysql_select_db("my_database", $conn);
// 執(zhí)行查詢
$result = mysql_query("SELECT * FROM my_table");
// 輸出查詢結(jié)果
while ($row = mysql_fetch_array($result)) {
echo $row['column_name'];
}
// 關(guān)閉連接
mysql_close($conn);
?>
注意:如前所述,mysql_* 函數(shù)已經(jīng)過(guò)時(shí),強(qiáng)烈建議不要在新的項(xiàng)目中使用。
2. 使用 mysqli 擴(kuò)展(推薦)
mysqli(MySQL Improved)是PHP在較新的版本中提供的增強(qiáng)型MySQL接口。相比于mysql_*,mysqli支持面向?qū)ο蟮木幊谭绞?,同時(shí)也支持預(yù)處理語(yǔ)句(prepared statements),更有效地防止SQL注入攻擊,推薦在實(shí)際開發(fā)中使用。
使用 mysqli 連接數(shù)據(jù)庫(kù)(面向過(guò)程)
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 創(chuàng)建連接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 檢查連接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// 執(zhí)行查詢
$result = mysqli_query($conn, "SELECT * FROM my_table");
// 輸出查詢結(jié)果
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column_name'];
}
// 關(guān)閉連接
mysqli_close($conn);
?>
使用 mysqli 連接數(shù)據(jù)庫(kù)(面向?qū)ο?
mysqli 也支持面向?qū)ο蟮木幊谭绞?,可以?chuàng)建一個(gè)mysqli對(duì)象,調(diào)用其方法進(jìn)行數(shù)據(jù)庫(kù)操作:
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 創(chuàng)建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢查連接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 執(zhí)行查詢
$result = $conn->query("SELECT * FROM my_table");
// 輸出查詢結(jié)果
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 關(guān)閉連接
$conn->close();
?>
預(yù)處理語(yǔ)句示例(防止SQL注入)
mysqli 的一個(gè)顯著優(yōu)勢(shì)是支持預(yù)處理語(yǔ)句(Prepared Statements),能夠有效防止SQL注入攻擊。
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 創(chuàng)建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢查連接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 使用預(yù)處理語(yǔ)句
$stmt = $conn->prepare("SELECT * FROM my_table WHERE column_name = ?");
$stmt->bind_param("s", $column_value); // "s" 表示參數(shù)類型為字符串
$column_value = 'example_value'; // 用戶輸入值
$stmt->execute();
// 獲取結(jié)果
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 關(guān)閉連接
$stmt->close();
$conn->close();
?>
3. 使用 PDO 擴(kuò)展(最推薦)
PDO(PHP Data Objects)是PHP提供的一個(gè)抽象數(shù)據(jù)庫(kù)訪問(wèn)層,支持多種數(shù)據(jù)庫(kù)系統(tǒng),包括MySQL、PostgreSQL、SQLite等。PDO的最大優(yōu)勢(shì)是它提供了一種統(tǒng)一的接口,方便在不同數(shù)據(jù)庫(kù)之間切換。此外,PDO 還支持預(yù)處理語(yǔ)句和事務(wù)處理等特性,能夠更加靈活和安全地進(jìn)行數(shù)據(jù)庫(kù)操作。
使用 PDO 連接數(shù)據(jù)庫(kù)
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 設(shè)置PDO連接選項(xiàng)
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 設(shè)置異常模式
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 設(shè)置默認(rèn)返回的結(jié)果類型
);
// 創(chuàng)建連接
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, $options);
// 設(shè)置字符集
$conn->exec("set names utf8");
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
// 執(zhí)行查詢
$stmt = $conn->query("SELECT * FROM my_table");
// 輸出查詢結(jié)果
while ($row = $stmt->fetch()) {
echo $row['column_name'];
}
// 關(guān)閉連接
$conn = null;
?>
使用 PDO 預(yù)處理語(yǔ)句(防止SQL注入)
PDO 也支持預(yù)處理語(yǔ)句,下面是一個(gè)通過(guò)PDO執(zhí)行預(yù)處理語(yǔ)句的示例:
phpCopy Code<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "my_database";
// 創(chuàng)建連接
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());
}
// 使用預(yù)處理語(yǔ)句
$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();
// 獲取結(jié)果
while ($row = $stmt->fetch()) {
echo $row['column_name'];
}
// 關(guān)閉連接
$conn = null;
?>
在PHP中,連接MySQL數(shù)據(jù)庫(kù)的方法有很多。雖然mysql_*已經(jīng)被棄用,但mysqli和PDO仍然是兩種非常流行的連接方式。以下是對(duì)這兩者的對(duì)比和總結(jié):
mysqli:功能強(qiáng)大,支持面向過(guò)程和面向?qū)ο髢煞N編程方式,支持預(yù)處理語(yǔ)句、事務(wù)等,適合專門使用MySQL的項(xiàng)目。
PDO:提供統(tǒng)一的數(shù)據(jù)庫(kù)接口,支持多種數(shù)據(jù)庫(kù)系統(tǒng),適合需要數(shù)據(jù)庫(kù)抽象層和更高靈活性的項(xiàng)目。PDO在跨數(shù)據(jù)庫(kù)開發(fā)時(shí)尤其有優(yōu)勢(shì)。
對(duì)于現(xiàn)代PHP開發(fā),推薦使用PDO,因?yàn)樗邤U(kuò)展性和可移植性。同時(shí),PDO的預(yù)處理語(yǔ)句和錯(cuò)誤處理機(jī)制也提供了更好的安全性和代碼可維護(hù)性。