原文: PHP5: mysqli 插入, 查詢, 更新和刪除 Insert Update Delete Using mysqli (CRUD)php
PHP 5 及以上版本建議使用如下方式鏈接 MySQL :mysql
- MySQLi extension ("i" 意爲 improved)
- PDO (PHP Data Objects)
Mysqli提供了
面向對象和
面向過程兩種方式來與數據庫交互,分別看一下這兩種方式。
1. PHP 鏈接 MySQL
1.面向對象
在面向對象的方式中,mysqli被封裝成一個類,它的構造方法以下:
__construct ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
在上述語法中涉及到的參數說明以下。
l host:鏈接的服務器地址。
l username:鏈接數據庫的用戶名,默認值是服務器進程全部者的用戶名。
l passwd:鏈接數據庫的密碼,默認值爲空。
l dbname:鏈接的數據庫名稱。
l port:TCP端口號。
l socket:UNIX域socket。
要創建與MySQL的鏈接能夠經過其構造方法實例化mysqli類,例以下面的代碼:sql
- <?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);
-
-
- }
- 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);
-
-
- }
- echo "鏈接成功";
- ?>
關閉與MySQL服務器的鏈接經過mysqli對象調用close()方法便可,例如:數組
2.面向過程
在面向過程的方式中,mysqli擴展提供了函數mysqli_connect()與MySQL創建鏈接,該函數的語法格式以下:
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()函數,例如:併發
2. PHP MySQL 插入數據
在建立完數據庫和表後,咱們能夠向表中添加數據。socket
如下爲一些語法規則:函數
- PHP 中 SQL 查詢語句必須使用引號
- 在 SQL 查詢語句中的字符串值必須加引號
- 數值的值不須要引號
- NULL 值不須要引號
INSERT INTO 語句一般用於向 MySQL 表添加新的記錄:性能
- INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
如下實例向 "MyGuests" 表添加了新的記錄:
1.面向對象
- <?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語句必須用分號隔開。
- <?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);
3. PHP MySQL 預處理語句
預處理語句對於防止 MySQL 注入是很是有用的。使用預準備語句可提升重複使用語句的性能,在PHP中,使用prepare()方法來進行預準備語句查詢,使用execute()方法來執行預準備語句。PHP有兩種預準備語句:一種是綁定結果,另外一種是綁定參數。
預處理語句, 綁定參數及綁定結果
預處理語句用於執行多個相同的 SQL 語句,而且執行效率更高。
預處理語句的工做原理以下:
- 預處理:建立 SQL 語句模板併發送到數據庫。預留的值使用參數 "?" 標記 。例如:
- INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出。
- 執行:最後,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用能夠屢次執行語句,若是參數的值不同。
相比於直接執行SQL語句,預處理語句有兩個主要優勢:
- 預處理語句大大減小了分析時間,只作了一次查詢(雖然語句屢次執行)。
- 綁定參數減小了服務器帶寬,你只須要發送查詢的參數,而不是整個語句。
- 預處理語句針對SQL注入是很是有用的,由於參數值發送後使用不一樣的協議,保證了數據的合法性。
MySQLi 預處理語句及綁定參數
所謂綁定參數就是把PHP腳本中的自定義變量綁定到SQL語句中的參數(參數使用 「?」代替)上,綁定參數使用bind_param()方法,該方法的語法格式以下:
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 字符告訴數據庫該參數爲字符串。
types:綁定的變量的數據類型,它接受的字符種類包括4個,如表所示。
字符種類
|
表明的數據類型
|
i
|
integer
|
d
|
double
|
s
|
string
|
b
|
blob
|
參數types接受的字符的種類和綁定的變量須要一一對應。
經過告訴數據庫參數的數據類型,能夠下降 SQL 注入的風險。
注意: 若是你想插入其餘數據(用戶輸入),對數據的驗證是很是重要的。
MySQLi 預處理語句及綁定結果
所謂綁定結果就是把PHP腳本中的自定義變量綁定到結果集中的相應字段上,這些變量就表明着所查詢的記錄,綁定結果的示例代碼以下:
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying");
- $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");
- $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
在mysqli中,執行查詢使用query()方法,該方法的語法格式以下:
mixed query ( string $query [, int $resultmode ] )
在上述語法中涉及到的參數說明以下。
l query:向服務器發送的SQL語句。
l resultmode:該參數接受兩個值,一個是MYSQLI_STORE_RESULT,表示結果做爲緩衝集合返回;另外一個是MYSQLI_USE_RESULT,表示結果做爲非緩衝集合返回。
下面是使用query()方法執行查詢的例子:
1.面向對象
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying");
- $query = "select * from MyGuests";
- $result = $mysqli->query($query);
- if ($result) {
- if($result->num_rows>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();
- ?>
在上面代碼中,num_rows爲結果集的一個屬性,返回結果集中行的數目。方法fetch_array()將結果集中的記錄放入一個數組中並將其返回。最後使用free()方法將結果集中的內存釋放,使用close()方法將數據庫鏈接關閉。
對於刪除記錄(delete)、保存記錄(insert)和修改記錄(update)的操做,也是使用query()方法來執行的,下面是刪除記錄的例子:
- <?php
- $mysqli = new mysqli("localhost","root","root","ikeepstudying");
- $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)