PHP是目前最流行的服務(wù)器端腳本語言之一,廣泛應(yīng)用于動態(tài)網(wǎng)站和Web應(yīng)用程序的開發(fā)。MySQL作為一個開源關(guān)系型數(shù)據(jù)庫系統(tǒng),與PHP的結(jié)合非常緊密,幾乎是每個PHP開發(fā)者日常工作中不可或缺的一部分。在Web開發(fā)中,如何將PHP與MySQL進(jìn)行連接,是開發(fā)過程中最基本、最常見的操作之一。本文將介紹PHP連接MySQL數(shù)據(jù)庫的常見方法,包括傳統(tǒng)的mysql_*函數(shù)、改進(jìn)的mysqli擴(kuò)展以及現(xiàn)代的PDO(PHP Data Objects)擴(kuò)展。
1. 使用 mysql_* 函數(shù)(已棄用)
mysql_* 系列函數(shù)曾是PHP中最常用的數(shù)據(jù)庫操作方法之一。但由于其在安全性、性能等方面存在問題,PHP 5.5版本之后官方已宣布棄用,并在PHP 7.0中完全刪除。盡管如此,了解這種方法仍然有助于理解PHP歷史上的數(shù)據(jù)庫操作方式。
示例:使用 mysql_* 連接數(shù)據(jù)庫
phpCopy Code<?php
// 連接數(shù)據(jù)庫
$conn = mysql_connect("localhost", "username", "password");
// 檢查連接是否成功
if (!$conn) {
die("Connection failed: " . mysql_error());
}
// 選擇數(shù)據(jù)庫
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)過時,強(qiáng)烈建議不要在新的項(xiàng)目中使用。
2. 使用 mysqli 擴(kuò)展(推薦)
mysqli(MySQL Improved)是PHP在較新的版本中提供的增強(qiáng)型MySQL接口。相比于mysql_*,mysqli支持面向?qū)ο蟮木幊谭绞剑瑫r也支持預(yù)處理語句(prepared statements),更有效地防止SQL注入攻擊,推薦在實(shí)際開發(fā)中使用。
使用 mysqli 連接數(shù)據(jù)庫(面向過程)
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ù)庫(面向?qū)ο?
mysqli 也支持面向?qū)ο蟮木幊谭绞?,可以?chuàng)建一個mysqli對象,調(diào)用其方法進(jìn)行數(shù)據(jù)庫操作:
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ù)處理語句示例(防止SQL注入)
mysqli 的一個顯著優(yōu)勢是支持預(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ù)處理語句
$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提供的一個抽象數(shù)據(jù)庫訪問層,支持多種數(shù)據(jù)庫系統(tǒng),包括MySQL、PostgreSQL、SQLite等。PDO的最大優(yōu)勢是它提供了一種統(tǒng)一的接口,方便在不同數(shù)據(jù)庫之間切換。此外,PDO 還支持預(yù)處理語句和事務(wù)處理等特性,能夠更加靈活和安全地進(jìn)行數(shù)據(jù)庫操作。
使用 PDO 連接數(shù)據(jù)庫
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ù)處理語句(防止SQL注入)
PDO 也支持預(yù)處理語句,下面是一個通過PDO執(zhí)行預(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ù)處理語句
$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ù)庫的方法有很多。雖然mysql_*已經(jīng)被棄用,但mysqli和PDO仍然是兩種非常流行的連接方式。以下是對這兩者的對比和總結(jié):
mysqli:功能強(qiáng)大,支持面向過程和面向?qū)ο髢煞N編程方式,支持預(yù)處理語句、事務(wù)等,適合專門使用MySQL的項(xiàng)目。
PDO:提供統(tǒng)一的數(shù)據(jù)庫接口,支持多種數(shù)據(jù)庫系統(tǒng),適合需要數(shù)據(jù)庫抽象層和更高靈活性的項(xiàng)目。PDO在跨數(shù)據(jù)庫開發(fā)時尤其有優(yōu)勢。
對于現(xiàn)代PHP開發(fā),推薦使用PDO,因?yàn)樗邤U(kuò)展性和可移植性。同時,PDO的預(yù)處理語句和錯誤處理機(jī)制也提供了更好的安全性和代碼可維護(hù)性。