PHP操作MySQL数据库(连接、增删改操作)
MySQL 是跟 PHP 配套使用的最流行的開源數據庫系統,我們知道MySQL是PHP的最佳搭檔,下面是系統的總結PHP與MySQL聯合使用的方法。主要是使用MySQL擴展,下面就通過歸納總結來提升。
MySQL概述
MySQL 是一種在 Web 上使用的數據庫系統。
MySQL 是一種在服務器上運行的數據庫系統。
MySQL 不管在小型還是大型應用程序中,都是理想的選擇。
MySQL 是非??焖?#xff0c;可靠,且易于使用的。
MySQL 支持標準的 SQL。
MySQL 在一些平臺上編譯。
MySQL 是免費下載使用的。
MySQL 是由 Oracle 公司開發、發布和支持的。
MySQL 是以公司創始人 Monty Widenius’s daughter: My 命名的。
PHP 與 MySQL 結合是跨平臺的。(您可以在 Windows 上開發,在 Unix 平臺上應用。)
數據庫連接
PHP 使用 MySQL 數據庫前,需要先將它們連接。
PHP連接MySQL的四種方式:
- MySQL 擴展
- MySQLi 擴展 (“i” 意為 improved)
- PDO (PHP Data Objects)
PHP 使用 ODBC 連接數據庫
PHP 5 及以上版本推薦使用MySQLi 擴展和PDO。在 PHP 早起版本中我們使用 MySQL 擴展。但該擴展在 2012 年開始不建議使用。
MySQLi | PDO
—|—
只針對 MySQL 數據庫 | 應用在 12 種不同數據庫中
面向對象(還提供API接口) | 面向對象
支持預處理語句 | 支持預處理語句預處理語句可以防止SQL注入,對于web項目的安全性是非常重要的。
PHP的MySQL擴展(優缺點)
設計開發允許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口;
并且是針對MySQL4.1.3或更早版本設計的。因此,這個擴展雖然可以與MySQL4.1.3或更新的數據庫服務端 進行交互,但并不支持后期MySQL服務端提供的一些特性。
PHP的mysqli擴展
mysqli擴展,我們有時稱之為MySQL增強擴展,可以用于使用 MySQL4.1.3或更新版本中新的高級特性;
mysqli擴展在PHP 5及以后版本中包含;
mysqli擴展有一系列的優勢,相對于mysql擴展的提升主要有:面向對象接口、 prepared語句支持、多語句執行支持、事務支持、增強的調試能力、嵌入式服務支持。
PHP數據對象(PDO)
PHP數據對象,是PHP應用中的一個數據庫抽象層規范。PDO提供了一個統一的API接口可以,使得你的PHP應用不去關心具體要 連接的數據庫服務器系統類型。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換數據庫服務器。
PHP 使用 ODBC 連接數據庫
ODBC 是一種應用程序編程接口(Application Programming Interface,API),使我們有能力連接到某個數據源(比如一個 MS Access 數據庫)。
(1)創建 ODBC 連接
通過一個 ODBC 連接,您可以連接到您的網絡中的任何計算機上的任何數據庫,只要 ODBC 連接是可用的。
(2)連接到 ODBC
odbc_connect() 函數用于連接到 ODBC 數據源。該函數有四個參數:數據源名、用戶名、密碼以及可選的指針類型。
odbc_exec() 函數用于執行 SQL 語句。
(3)取回記錄
odbc_fetch_row() 函數用于從結果集中返回記錄。如果能夠返回行,則函數返回 true,否則返回 false。該函數有兩個參數:ODBC 結果標識符和可選的行號,如:odbc_fetch_row($rs)。
(4)從記錄中取回字段
odbc_result() 函數用于從記錄中讀取字段。該函數有兩個參數:ODBC 結果標識符和字段編號或名稱。$compname=odbc_result($rs,1);從記錄中返回第一個字段的值;compname=odbc_result($rs,"CompanyName");返回名為 “CompanyName” 的字段的值。
(5)關閉 ODBC 連接
odbc_close() 函數用于關閉 ODBC 連接,odbc_close($conn);。
MySQL擴展連接數據庫
mysql_connect() 函數打開非持久的 MySQL 連接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<?php
$host = "localhost"; //MySQL服務器名稱
$user = "root"; //用戶名
$password = "123456"; //訪問密碼
$db_name = "dsplab"; //數據庫名稱
$conn = mysql_connect($host,$user,$password) or
die ("連接到MySQL服務器失敗。".mysql_error()); //返回錯誤信息
mysql_select_db($db_name,$conn) or
die ("連接數據庫失敗。".mysql_error()); //返回錯誤信息
// 設置數據格式,解決中文亂碼
mysql_query('set names utf8');
mysql_close($con); // 關閉連接
?>mysql_close()關閉連接,通常不必要,因為PHP在腳本終止時自動關閉打開的連接;
mysql_pconnect() 函數打開一個到 MySQL 服務器的持久連接
1
2
3
4
5
6
7<?php
$con = mysql_pconnect("localhost","mysql_user","mysql_pwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
?>
區別。mysql_pconnect() 和 mysql_connect() 非常相似,但有兩個主要區別:
當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。
其次,當腳本執行完畢后到 SQL 服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close() 不會關閉由 mysql_pconnect() 建立的連接)。
MySQLi擴展連接數據庫
MySQLi - 面向對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 創建連接
$conn = new mysqli($servername, $username, $password);
// 檢測連接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
// 關閉連接
$conn->close();
?>MySQLi - 面向過程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 創建連接
$conn = mysqli_connect($servername, $username, $password);
// 檢測連接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
// 關閉連接
mysqli_close($conn);
?>
PDO連接數據庫
PDO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
echo "Connected successfully";
}
catch(PDOException $e) {
echo $e->getMessage();
}
// 關閉連接
$conn = null;
?>注意在以上 PDO 實例中我們已經指定了數據庫 (myDB)。PDO 在連接過程需要設置數據庫名。如果沒有指定,則會拋出異常。
增刪改(創建數據庫、數據表,增刪改操作 )
這些操作,增刪改三種操作除了返回操作成功與否的信息,沒有其他結果返回,操作基本相同,只需要記住增刪改操作的SQL語句即可。將SQL語句用雙引號包含,賦值給變量$sql,之后用PHP代碼操作:
面向對象
1
2
3
4
5if ($conn->query($sql) === TRUE) {
echo "操作成功";
} else {
echo "存在錯誤: " . $conn->error;
}面向過程
1
2
3
4
5if (mysqli_query($conn, $sql)) {
echo "操作成功";
} else {
echo "存在錯誤: " . mysqli_error($conn);
}PHP 中 SQL 查詢語句語法規則
- PHP 中 SQL 查詢語句必須使用引號
- 在 SQL 查詢語句中的字符串值必須加引號
- 數值的值不需要引號
- NULL 值不需要引號
創建數據庫、數據表
面向對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 創建數據庫
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "Database created successfully";
} else {
echo "Error creating database: " . $conn->error;
}
// 創建數據表
$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 ($conn->query($sql) === TRUE) {
echo "Table MyGuests created successfully";
} else {
echo "Error creating table: " . $conn->error;
}創建一個名為 “MyGuests” 的表,有 5 個列: “id”, “firstname”, “lastname”, “email” 和 “reg_date”
面向過程
1
2
3
4
5
6
7
8
9
10
11
12
13// 創建數據庫,$sql語句同上
if (mysqli_query($conn, $sql)) {
echo "Database created successfully";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
// 創建數據表,$sql語句同上
if (mysqli_query($conn, $sql)) {
echo "Table MyGuests created successfully";
} else {
echo "Error creating table: " . mysqli_error($conn);
}
插入記錄
INSERT INTO 語句通常用于向 MySQL 表添加新的記錄:
1 INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...) 注意: 如果列設置 AUTO_INCREMENT (如 “id” 列) 或 TIMESTAMP (如 “reg_date” 列),,我們就不需要在 SQL 查詢語句中指定值; MySQL 會自動為該列添加值。
插入一條記錄,采用下列SQL語句
1
2
3
4
5
6
7// 插入一條記錄
// 方法一,按照表字段一一對應添加,缺一不可
$sql = "INSERT INTO table_name VALUES ('value1', 'value2', ...)";
// 方法二,按指定的字段添加數據
$sql = "INSERT INTO table_name (column1, column2, ...)
VALUES ('value1', 'value2', ...)";插入多條記錄,采用下列SQL語句
1
2
3
4
5
6
7
8
9// 插入多條記錄
$sql = "INSERT INTO
MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO
MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO
MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')";
刪除
刪除數據庫、數據表、記錄
1
2
3
4
5
6
7
8
9
10// 刪除數據庫
$sql = "drop database if exists <database_name>"
// 刪除數據表
$sql = "drop tabel if exists <table_name>"
// 刪除記錄
$sql = "DELETE FROM table_name" // 刪除所有的數據
// or
$sql = "DELETE FROM table_name WHERE some_column = some_value" // 刪除特定的數據
改(修改記錄)
修改記錄
1
2
3
4
5// 修改表名
$sql = "alter table old_table_neme rename new_table_neme"
// 修改記錄
$sql = "UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value"
查詢
查詢記錄
1
2
3
4
5
6
7
8
9// 讀取所有的數據
$sql = "SELECT id, column1, column2 FROM table_name";
// where子句
$sql = "SELECT field FROM table_name WHERE column_name operator value";
$result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName='Peter'"); // 示例
// order by
$sql = "UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value"
擴展——預處理語句及綁定參數
預處理語句用于執行多個相同的 SQL 語句,并且執行效率更高。
預處理語句的工作原理如下:
- 預處理:創建 SQL 語句模板并發送到數據庫。預留的值使用參數 “?” 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 數據庫解析,編譯,對SQL語句模板執行查詢優化,并存儲結果不輸出
- 執行:最后,將應用綁定的值傳遞給參數(”?” 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
相比于直接執行SQL語句,預處理語句有兩個主要優點:
- 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)
- 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句
- 預處理語句針對SQL注入是非常有用的,因為 參數值發送后使用不同的協議,保證了數據的合法性。
MySQLi預處理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26// prepare and bind
// 在 SQL 語句中,我們使用了問號 (?),在此我們可以將問號替換為整型,字符串,雙精度浮點型和布爾值。
// 該函數綁定了 SQL 的參數(每個參數都需要指定類型),且告訴數據庫參數的值。 "sss" 參數列處理其余參數的數據類型。s 字符告訴數據庫該參數為字符串。
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 設置參數并執行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();綁定參數(bind_param)有以下四種類型:
- i - integer(整型)
- d - double(雙精度浮點型)
- s - string(字符串)
- b - BLOB(布爾值)
如果你想插入其他數據(用戶輸入),對數據的驗證是非常重要的。
關于查詢的返回結果,詳見博客《php數據庫中數據查詢》
總結
以上是生活随笔為你收集整理的PHP操作MySQL数据库(连接、增删改操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: my97中文乱码问题
- 下一篇: mysql中as用法