原文: PHP5: mysqli 插入, 查詢, 更新和刪除 Insert Update Delete Using mysqli (CRUD)
1. PHP 連接 MySQL
__construct ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
要建立與MySQL的連接可以通過其構造方法實例化mysqli類,例如下面的代碼:
- <?php
- $db_host = "localhost"; //連接的服務器地址
- $db_user = "root"; //連接數據庫的用戶名
- $db_psw = "root"; //連接數據庫的密碼
- $db_name = "ikeepstudying"; //連接的數據庫名稱
- // 創建連接
- $conn = new mysqli($db_host,$db_user,$db_psw,$db_name);
- // 檢測連接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- // 或者使用
- // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error);
- }
- echo "連接成功";
- ?>
mysqli還提供了一個連接MySQL的成員方法connect()。當實例化構造方法為空的mysqli類時,用mysqli對象調用connect()方法同樣可連接MySQL,例如,下面的代碼:
- <?php
- $db_host = "localhost"; //連接的服務器地址
- $db_user = "root"; //連接數據庫的用戶名
- $db_psw = "root"; //連接數據庫的密碼
- $db_name = "ikeepstudying"; //連接的數據庫名稱
- $conn = new mysqli();
- $conn->connect($db_host,$db_user,$db_psw,$db_name);
- // 檢測連接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- // 或者使用
- // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error);
- }
- echo "連接成功";
- ?>
關閉與MySQL服務器的連接通過mysqli對象調用close()方法即可,例如:
- $conn->close();
mysqli_connect ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
mysqli_connect()函數的用法與mysql擴展中的mysql_connect()函數用法十分相似,下面是mysqli_connect()函數的用法示例:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $database = "ikeepstudying";
- // 創建連接
- $conn = mysqli_connect($servername, $username, $password, $database);
- // 檢測連接
- if (!$conn) {
- die("Connection failed: " . mysqli_connect_error());
- }
- echo "連接成功";
- ?>
關閉與MySQL服務器的連接使用mysqli_close()函數,例如:
- mysqli_close();
2. PHP MySQL 插入數據
在創建完數據庫和表后,我們可以向表中添加數據。
以下為一些語法規則:
- PHP 中 SQL 查詢語句必須使用引號
- 在 SQL 查詢語句中的字符串值必須加引號
- 數值的值不需要引號
- NULL 值不需要引號
INSERT INTO 語句通常用於向 MySQL 表添加新的記錄:
- INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
以下實例向 "MyGuests" 表添加了新的記錄:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建連接
- $conn = new mysqli($servername, $username, $password, $dbname);
- // 檢測連接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- }
- $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')";
- if ($conn->query($sql) === TRUE) {
- echo "新記錄插入成功";
- } else {
- echo "Error: " . $sql . "<br>" . $conn->error;
- }
- $conn->close();
- ?>
插入多條記錄:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建鏈接
- $conn = new mysqli($servername, $username, $password, $dbname);
- // 檢查鏈接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- }
- $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')";
- if ($conn->multi_query($sql) === TRUE) {
- echo "新記錄插入成功";
- } else {
- echo "Error: " . $sql . "<br>" . $conn->error;
- }
- $conn->close();
- ?>
請注意,每個SQL語句必須用分號隔開。
2.面向過程
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建連接
- $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);
- ?>
插入多條記錄:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建鏈接
- $conn = mysqli_connect($servername, $username, $password, $dbname);
- // 檢查鏈接
- if (!$conn) {
- die("連接失敗: " . mysqli_connect_error());
- }
- $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')";
- if (mysqli_multi_query($conn, $sql)) {
- echo "新記錄插入成功";
- } else {
- echo "Error: " . $sql . "<br>" . mysqli_error($conn);
- }
- mysqli_close($conn);
- ?>
php5和新增了獲取最新插入值的ID的函數:mysqli_insert_id($conn),和之前的mysql_insert_id()類似。
都是用在insert語句之后獲取最新的自動id號,要注意的是mysqli_insert_id(),括號里面的一定要是數據庫連接而不是執行結果$result。
程序實例:
- $conn = new mysqli("127.0.0.1","root","","ikeepstudying") or die("數據庫連接超時!");
- $sql = "insert into my_table (name,url) values('ikeepstudying','http://justcode.ikeepstudying.com')";
- $result = $conn->query($sql) or die("失敗");
- echo mysqli_insert_id($conn); //輸出剛剛插入數據的ID,注意:括號里面的要是$conn而不是$result
3. PHP MySQL 預處理語句
預處理語句對於防止 MySQL 注入是非常有用的。使用預准備語句可提高重復使用語句的性能,在PHP中,使用prepare()方法來進行預准備語句查詢,使用execute()方法來執行預准備語句。PHP有兩種預准備語句:一種是綁定結果,另一種是綁定參數。
預處理語句, 綁定參數及綁定結果
預處理語句用於執行多個相同的 SQL 語句,並且執行效率更高。
預處理語句的工作原理如下:
- 預處理:創建 SQL 語句模板並發送到數據庫。預留的值使用參數 "?" 標記 。例如:
- INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出。
- 執行:最后,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
相比於直接執行SQL語句,預處理語句有兩個主要優點:
- 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。
- 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
- 預處理語句針對SQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。
MySQLi 預處理語句及綁定參數
bool bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
以下實例在 MySQLi 中使用了預處理語句,並綁定了相應的參數:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建連接
- $conn = new mysqli($servername, $username, $password, $dbname);
- // 檢測連接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- }
- // 預處理及綁定
- $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 "新記錄插入成功";
- $stmt->close();
- $conn->close();
- ?>
- "INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"
在 SQL 語句中,我們使用了問號 (?),在此我們可以將問號替換為整型,字符串,雙精度浮點型和布爾值。
接下來,讓我們來看下 bind_param() 函數:
- $stmt->bind_param("sss", $firstname, $lastname, $email);
該函數綁定了 SQL 的參數,且告訴數據庫參數的值。 "sss" 參數列處理其余參數的數據類型。s 字符告訴數據庫該參數為字符串。
字符種類
|
代表的數據類型
|
i
|
integer
|
d
|
double
|
s
|
string
|
b
|
blob
|
通過告訴數據庫參數的數據類型,可以降低 SQL 注入的風險。
注意: 如果你想插入其他數據(用戶輸入),對數據的驗證是非常重要的。
MySQLi 預處理語句及綁定結果
所謂綁定結果就是把PHP腳本中的自定義變量綁定到結果集中的相應字段上,這些變量就代表着所查詢的記錄,綁定結果的示例代碼如下:
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //實例化mysqli
- $query = "select * from MyGuests";
- $result = $mysqli->prepare($query); //進行預准備語句查詢
- $result->execute(); //執行預准備語句
- $result->bind_result($id,$firstname,$lastname,$email); //綁定結果
- while ($result->fetch()) {
- echo $id;
- echo $firstname;
- echo $lastname;
- echo $email;
- }
- $result->close(); //關閉預准備語句
- ?>
在綁定結果的時候,腳本中的變量要與結果集中的字段一一對應,綁定完以后,通過fetch()方法將綁定在結果集中的變量一一取出來,最后將預准備語句和數據庫連接分別關閉。
MySQLi 同時綁定參數和綁定結果
在一個腳本中還可以同時綁定參數和綁定結果,示例代碼如下:
- <?php
- $conn = new mysqli("localhost","root","root","ikeepstudying"); //實例化mysqli
- $query = "select * from MyGuests where id < ?";
- $result = $conn->prepare($query);
- $result->bind_param("i",$id); //綁定參數
- $id=4;
- $result->execute();
- $result->bind_result($id,$number,$name,$age); //綁定結果
- while ($result->fetch()) {
- echo $id;
- echo $firstname;
- echo $lastname;
- echo $email;
- }
- $result->close();
- $conn->close();
- ?>
4. PHP MySQL 讀取數據, 刪除及更新
SELECT 語句用於從數據表中讀取數據:
SELECT column_name(s) FROM table_name
mixed query ( string $query [, int $resultmode ] )
1.面向對象
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //實例化mysqli
- $query = "select * from MyGuests";
- $result = $mysqli->query($query);
- if ($result) {
- if($result->num_rows>0){ //判斷結果集中行的數目是否大於0
- while($row = $result->fetch_array() ){ //循環輸出結果集中的記錄
- echo ($row[0])."<br>";
- echo ($row[1])."<br>";
- echo ($row[2])."<br>";
- echo ($row[3])."<br>";
- echo "<hr>";
- }
- }
- }else {
- echo "查詢失敗";
- }
- $result->free();
- $mysqli->close();
- ?>
對於刪除記錄(delete)、保存記錄(insert)和修改記錄(update)的操作,也是使用query()方法來執行的,下面是刪除記錄的例子:
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //實例化mysqli
- $query = "delete from MyGuests where id=2";
- $result = $mysqli->query($query);
- if ($result){
- echo "刪除操作執行成功";
- }else {
- echo "刪除操作執行失敗";
- }
- $mysqli->close();
- ?>
完整實例:
- <?php
- $servername = "localhost";
- $username = "username";
- $password = "password";
- $dbname = "ikeepstudying";
- // 創建連接
- $conn = new mysqli($servername, $username, $password, $dbname);
- // 檢測連接
- if ($conn->connect_error) {
- die("連接失敗: " . $conn->connect_error);
- }
- $sql = "SELECT id, firstname, lastname FROM MyGuests";
- $result = $conn->query($sql);
- if ($result->num_rows > 0) {
- // 輸出每行數據
- while($row = $result->fetch_assoc()) {
- echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"];
- }
- } else {
- echo "0 個結果";
- }
- $conn->close();
- ?>
更多實例:
INSERT
- $stmt = $mysqli->prepare("INSERT INTO movies(filmName,
- filmDescription,filmImage,filmPrice,filmReview) VALUES (?, ?, ?, ?, ?)");
- $stmt->bind_param('sssdi', $_POST['filmName'],
- $_POST['filmDescription'],
- $_POST['filmImage'],
- $_POST['filmPrice'],
- $_POST['filmReview']);
- $stmt->execute();
- $stmt->close();
Getting Auto Increment Key Values with insert_id
- $stmt = $mysqli->prepare("INSERT INTO movies(filmName,
- filmDescription,filmImage,filmPrice,filmReview) VALUES (?, ?, ?, ?, ?)");
- $stmt->bind_param('sssdi', $_POST['filmName'],
- $_POST['filmDescription'],
- $_POST['filmImage'],
- $_POST['filmPrice'],
- $_POST['filmReview']);
- $stmt->execute();
- $newId = $stmt->insert_id;
- $stmt->close();
UPDATE
- $stmt = $mysqli->prepare("UPDATE movies SET filmName = ?,
- filmDescription = ?,
- filmImage = ?,
- filmPrice = ?,
- filmReview = ?
- WHERE filmID = ?");
- $stmt->bind_param('sssdii',
- $_POST['filmName'],
- $_POST['filmDescription'],
- $_POST['filmImage'],
- $_POST['filmPrice'],
- $_POST['filmReview'],
- $_POST['filmID']);
- $stmt->execute();
- $stmt->close();
DELETE
- $stmt = $mysqli->prepare("DELETE FROM movies WHERE filmID = ?");
- $stmt->bind_param('i', $_POST['filmID']);
- $stmt->execute();
- $stmt->close();
2.面向過程
- <?php
- $con = mysqli_connect("localhost","username","password","ikeepstudying");
- // 檢測連接
- if (mysqli_connect_errno())
- {
- echo "連接失敗: " . mysqli_connect_error();
- }
- $result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName='Peter'");
- while($row = mysqli_fetch_array($result))
- {
- echo $row['FirstName'] . " " . $row['LastName'];
- echo "<br>";
- }
- ?>
5. mysqli 讀取數據庫的幾種方式
mysqli有四種讀取數據庫數據的方式:mysqli_fetch_array(), mysqli_fetch_object(), mysqli_fetch_accoc(), mysqli_fetch_row()。
區別是:
- mysqli_fetch_array(),同時返回關系型數組和計數型數組2種,讀取數據的時候我們可以用比如:$result[1] 或者是$result["username"]。
- mysqli_fetch_accoc(),返回關系型數組,讀取數據的時候我們可以用比如:$result["username"]。
- mysqli_fetch_row(),返回計數型數組,讀取數據的時候我們可以用比如:$result[0]。
- mysqli_fetch_object(),返回一個對象,讀取數據的時候我們可以用比如:$result->username的方式讀取數據。
6. mysqli 一些函數的對比 ( 面向對象 vs 面向過程 )
1. mysqli 連接數據庫:
$db = new mysqli(host,user,password,database);
這是對象導向的連接方法,還有一種過程導向的連接方法。前者返回一個對象,后者返回一個資源。
$db = mysqli_connect(host,user,password,database);
2.mysqli 連接出錯函數:
$db->connect_error
or
mysqli_connect_error();
如果連接出錯,該函數返回一個錯誤號,否則返回0;
3.選擇數據庫:
$db->select_db(dbname);
or
mysqli_select_db(db_resource,db_name);
4.mysqli 執行查詢
$result = $db->query($query);
or
$result = mysqli_query($db,$query);
5.返回結果的行數:
$num_results = $result->num_rows;
or
$num_results = mysqli_num_rows($result);
6.取出每一行的結果(返回關系型數組):
$row = $result->fetch_assoc();
or
$row = mysqli_fetch_assoc($result);
7.取出每一行的結果(返回計數型數組):
$row = $result->fetch_row($result);
or
$row = mysqli_fetch_row($result);
8.取出每一行的結果(返回一個對象):
$row = $result->fetch_object();
or
$row = mysqli_fetch_object($result);
9.釋放查詢結果:
$result->free();
or
mysqli_free_result($result);
10.關閉數據庫連接:
$db->close();
or
mysqli_close($db);
11.一條查詢所影響的行數:
$db->affected_rows;
or
mysqli_affected_rows($result);
12.模式化SQL語句執行:
$query = “insert into books values(?, ?, ?, ?)”;
$stmt = $db->prepare($query);
$stmt->bind_param(“sssd”, $isbn, $author, $title, $price);
$stmt->execute();
echo $stmt->affected_rows.’ book inserted into database.’;
$stmt->close();
在過程化執行方式中,
$db->prepare()對應mysqli_stmt_prepare()函數;
$stmt->bind_param()對應mysqli_stmt_bind_param()函數;
$stmt->execute() 對應mysqli_stmt_execute()函數;
本文轉自: PHP5: mysqli 插入, 查詢, 更新和刪除 Insert Update Delete Using mysqli (CRUD)