Mysqli 操作資料庫

来源:http://www.cnblogs.com/qiutianjia/archive/2016/06/14/5582632.html
-Advertisement-
Play Games

每次用到mysql_connect連接資料庫的時候都會提示: 作為一個高要求高完美的男人,實在受不了這提示。躲著他也不行——解決他心裡的小石頭才能碎掉 那麼就先學習下使用Mysqli操作資料庫: 1. 與Mysql資料庫交互時,首先要建立連接,最後要斷開連接,這包括與伺服器連接並選擇一個資料庫,以及 ...


每次用到mysql_connect連接資料庫的時候都會提示:

1 Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in E:\wamp\www\myquote\includes\mysql_connect.php on line 5

作為一個高要求高完美的男人,實在受不了這提示。躲著他也不行——解決他心裡的小石頭才能碎掉

那麼就先學習下使用Mysqli操作資料庫:

1.  與Mysql資料庫交互時,首先要建立連接,最後要斷開連接,這包括與伺服器連接並選擇一個資料庫,以及最後關閉連接。與Mysql幾乎所有的特性一樣,這一點可以使用面向對象的方法來完成,也可以採用過程的方式完成。

1.1  創建一個Mysqli的對象

1 <?php
2 $mysqli=new mysqli();//實例化mysqli
3 ?>

1.2  連接Mysql的主機、用戶、密碼、資料庫

1 <?php
2 $mysqli=new mysqli();//實例化mysqli
3 $mysqli->connect('localhost','root','admin','test');
4 ?>

1.3  創建連接參數的Mysqli對象

1 <?php
2 $mysqli=new mysqli('localhost','root','admin','test');//實例化mysqli
3 //$mysqli->connect('localhost','root','admin','test');
4 ?>

1.4  更換預設連接的資料庫

1 <?php
2 $mysqli=new mysqli();//實例化mysqli
3 $mysqli->connect('localhost','root','admin','test');
4 $mysqli->select_db('abc');//更換連接預設的資料庫為abc資料庫
5 $mysqli->close();//別忘了關閉你的"小資源";
6 ?>

2  處理連接錯誤

2.1  如果無法連接Mysql資料庫,那麼這個頁面不太可能繼續完成預期的工作,因此,一定要註意監視連接錯誤並相應地做出反應。Mysqli拓展包含有很多特性可以用來抓取錯誤信息,例如:mysqli_connect_errno() 和 mysqli_connect_error()方法。

1 mysqli_connect_errno()函數返回鏈接資料庫返回的錯誤號。
2 mysqli_connect_error()函數返回連接資料庫返回的錯誤代碼。

使用方法:

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     echo'資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error();
 6     exit();
 7 }else{
 8     echo '資料庫連接成功';
 9 }
10 $mysqli->close();//別忘了關閉你的"小資源";
11 ?>

 

  這裡用了面向過程的方法來判斷資料庫是否連接成功。那麼為什麼不用面向對象的方法判斷呢?我的理解是 判斷資料庫連接成功 之前首先要證明你要實例化的對象是否可用。。所以用了面向過程的方法來判斷。(如果有不對的地方大家也可以一起討論討論,我自己也是個小學渣)

 

2.2  mysqli_error——返回資料庫操作錯誤信息。mysqli_errno——返回資料庫操作錯誤代碼

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     echo'資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error();
 6     exit();
 7 }else{
 8     echo '資料庫連接成功<br/>';
 9 }
10 if (!$mysqli->query("SET a=1")) {//$mysqli->query()執行sql語句
11     echo "錯誤信息是: ".$mysqli->error.'<br/>';
12     echo "錯誤代碼是: ".$mysqli->errno;
13 }
14 $mysqli->close();//別忘了關閉你的"小資源";
15 ?>

輸出:

資料庫連接成功
錯誤信息是: Unknown system variable 'a'
錯誤代碼是: 1193

 

3  與資料庫進行交互。

① 絕大多數查詢都與創建(Creation)、獲取(Retrieval)、更新(Update)和刪除(Deletion)任務有關,這些任務統稱為CRUD。

② 獲取數據網頁程式大多數工作都是在獲取和格式化所請求的數據。為此,要向資料庫發送SELECT查詢,再對結果進行迭代處理,將各行輸出給瀏覽器,並按照自己的要求輸出。 

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 print_r($result->fetch_row());//將結果集的第一行輸出
11 $result->free();//釋放查詢記憶體(銷毀)
12 $mysqli->close();//別忘了關閉你的"小資源";
13 ?>

 

 

輸出:

Array ( [0] => 1 [1] => 秋田嘉 [2] => 123456 )

3.1  解析查詢結果

一旦執行了查詢並準備好結果集,下麵就可以解析獲取到的結果行了。你可以使用多個方法來獲取各行中的欄位,具體選擇哪一個方法主要取決於個人喜好,因為只是引用欄位的方法有所不同。

3.1.1  將結果集放到對象中由於你可能會使用mysqli的面向對象的語法,所以完全可以採用面向對象的方式管理結果集。

可以使用  fetch_object()  方法來完成。

 

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 /*
11 $row = $result->fetch_object();//將結果集包裝成對象
12 echo $row->user;//輸出對象中的一個欄位(屬性)
13 */
14 while (!!$row = $result->fetch_object()){////遍歷所有的用戶名稱
15 echo $row->user."<br>";
16 var_dump($row);
17 }
18 $result->free();//釋放查詢記憶體(銷毀)
19 $mysqli->close();//別忘了關閉你的"小資源";
20 ?>

輸出:

 

秋田嘉 

object(stdClass)#3 (3) { ["id"]=> string(1) "1" ["user"]=> string(9) "秋田嘉" ["psw"]=> string(6) "123456" }
劉德華 

object(stdClass)#4 (3) { ["id"]=> string(1) "2" ["user"]=> string(9) "劉德華" ["psw"]=> string(6) "654321" }

 

3.1.2  使用索引數組和關聯數組  fetch_array();

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 
11 $row = $result->fetch_array();//將結果集包裝成數組(索引+關聯)
12 echo $row[1].'<br/>';//輸出下標是1的欄位(屬性)
13 var_dump($row);
14 /*
15 while (!!$row = $result->fetch_array()){//遍歷全部
16 echo $row[1]."<br/>";
17 }*/
18 
19 $result->free();//釋放查詢記憶體(銷毀)
20 $mysqli->close();//別忘了關閉你的"小資源";
21 ?>

 

輸出:

秋田嘉
array(6) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(9) "秋田嘉" ["user"]=> string(9) "秋田嘉" [2]=> string(6) "123456" ["psw"]=> string(6) "123456" }

 

3.1.3  使用索引數組  fetch_row();

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 $row = $result->fetch_row();//將結果集包裝成索引數組
11 echo $row[2];
12 $result->free();//釋放查詢記憶體(銷毀)
13 $mysqli->close();//別忘了關閉你的"小資源";
14 ?>

 

輸出:

123456

3.1.4  使用關聯數組  fetch_assoc();

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 $row = $result->fetch_assoc();//將結果集包裝成關聯數組
11 echo $row['psw'];
12 $result->free();//釋放查詢記憶體(銷毀)
13 $mysqli->close();//別忘了關閉你的"小資源";
14 ?>

 

輸出:

123456

4  確定所選擇的行和受影響的行

  通常希望能夠確定SELECT查詢返回的行數,或者受INSERTUPDATEDELET查詢影響的行數。

我們可以使用num_rowsaffected_rows兩個屬性

 

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 echo $result->num_rows;//當使用查詢時,想瞭解SELECT查詢了多少行,可以使用num_rows。
11 echo"<br/>";
12 echo $mysqli->affected_rows;//當使用查詢時,想瞭解SELECT、INSERT、UPDATE、DELETE查詢時影響的行數,可以使用affected_rows;註意,它是$mysqli下的屬性
13 $result->free();//釋放查詢記憶體(銷毀)
14 $mysqli->close();//別忘了關閉你的"小資源";
15 ?>

 

輸出:

2
2

5  移動指針的操作和獲取欄位

  當你並不想從第一條數據開始獲取,或者並不想從第一個欄位獲取,你可以使用數據指針移動或者欄位指針移動的方式調整到恰當的位置。當然,你還可以獲取欄位的名稱及其相關的屬性

  

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 $sql='select * from user';//創建一句SQL語句
 9 $result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
10 echo $result->field_count;//計算有多少條欄位
11 echo"<br/>";//輸出 3
12 $field = $result->fetch_field();//獲取欄位的名稱
13 echo $field->name;//輸出id
14 echo '<br/>';
15 while (!!$field = $result->fetch_field()) {//遍歷欄位
16 echo $field->name.'<br />';
17 }
18 $result->free();//釋放查詢記憶體(銷毀)
19 $mysqli->close();//別忘了關閉你的"小資源";
20 ?>

 

 

輸出:

3
id
user
psw

5.1

<?php
$mysqli=new mysqli();//實例化mysqli
$mysqli->connect('localhost','root','admin','test');
if(mysqli_connect_error()){
    exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
}
$mysqli->set_charset("UTF8");//設置資料庫編碼
$sql='select * from user';//創建一句SQL語句
$result=$mysqli->query($sql);//執行sql語句把結果集賦給$result
print_r($result->fetch_fields());//一次性取得欄位數組
$result->free();//釋放查詢記憶體(銷毀)
$mysqli->close();//別忘了關閉你的"小資源";
?>

 

 

輸出:

 1 Array
 2 (
 3     [0] => stdClass Object
 4         (
 5             [name] => id
 6             [orgname] => id
 7             [table] => user
 8             [orgtable] => user
 9             [def] => 
10             [db] => test
11             [catalog] => def
12             [max_length] => 1
13             [length] => 11
14             [charsetnr] => 63
15             [flags] => 49667
16             [type] => 3
17             [decimals] => 0
18         )
19 
20     [1] => stdClass Object
21         (
22             [name] => user
23             [orgname] => user
24             [table] => user
25             [orgtable] => user
26             [def] => 
27             [db] => test
28             [catalog] => def
29             [max_length] => 9
30             [length] => 765
31             [charsetnr] => 33
32             [flags] => 4097
33             [type] => 253
34             [decimals] => 0
35         )
36 
37     [2] => stdClass Object
38         (
39             [name] => psw
40             [orgname] => psw
41             [table] => user
42             [orgtable] => user
43             [def] => 
44             [db] => test
45             [catalog] => def
46             [max_length] => 6
47             [length] => 765
48             [charsetnr] => 33
49             [flags] => 4097
50             [type] => 253
51             [decimals] => 0
52         )
53 
54 )

 

5.2  

1 $result->data_seek(1);//移動數據指針
2 $result->field_seek(1);//移動欄位指針

 

 6  執行多條SQL語句

  有的時候,我們需要在一張頁面上同時執行多條SQL語句,之前的方法就是分別創建多個結果集然後使用。但這樣資源消耗很大,也不利於管理。 PHP提供了執行多條SQL語句的方法$mysqli->multi_query();

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 //創建多條SQL語句
 9 $sql .= "SELECT * FROM user;";
10 $sql .= "SELECT * FROM photo;";
11 $sql .= "SELECT * FROM article";
12 if ($mysqli->multi_query($sql)) {//開始執行多條SQL語句
13 $result = $mysqli->store_result();
14 print_r($result->fetch_array());//開始獲取第一條SQL語句的結果集
15 $mysqli->next_result();//將結果集指針移到下一個
16 $result = $mysqli->store_result();
17 print_r($result->fetch_array());
18 $mysqli->next_result();
19 $result = $mysqli->store_result();
20 print_r($result->fetch_array());
21 } else {
22 echo 'sql語句有誤!';
23 }
24 $result->free();//釋放查詢記憶體(銷毀)
25 $mysqli->close();//別忘了關閉你的"小資源";
26 ?>

 

7  執行資料庫事務

事務(transaction)是作為整個一個單元的一組有序的資料庫操作。如果一組中的所有操作都成功,則認為事務成功,即使只有一個失敗操作,事務也不成功。如果所有操作成功完成,事務則提交(commit),其修改將作用於所有其他資料庫進程。如果一個操作失敗,則事務將回滾(roll back),該事務所有操作的影響都將取消。首先,您的MySQL是InnoDB或BDB引擎的一種,一般來說,你安裝了AppServ的集成包,你選擇InnoDB的引擎的資料庫即可。如果你建立的表不是InnoDB,可以在phpmyadmin里修改

 1 <?php
 2 $mysqli=new mysqli();//實例化mysqli
 3 $mysqli->connect('localhost','root','admin','test');
 4 if(mysqli_connect_error()){
 5     exit('資料庫連接錯誤,錯誤信息是.'.mysqli_connect_error());
 6 }
 7 $mysqli->set_charset("UTF8");//設置資料庫編碼
 8 //首先你必須關閉自動提交數據
 9 $mysqli->autocommit(false);
10 //創建一個SQL語句,必須同時運行成功,不能出現一個成功,一個失敗
11 $sql .= "UPDATE `friend` SET state=state+5 WHERE id=1;";
12 $sql .= "UPDATE `flower` SET tg_flower=flower-5 WHERE id=1;";
13 //執行兩條SQL語句
14 if ($mysqli->multi_query($sql)) {
15 //獲取第一條SQL一影響的行數
16 $success = $mysqli->affected_rows == 1 ? true : false;
17 //下移,第二條SQL
18 $mysqli->next_result();
19 //獲取第二條SQL影響的行數
20 $success2 = $mysqli->affected_rows == 1 ? true : false;
21 //判斷是否都正常通過了,兩個SQL
22 if ($success && $success2) {
23 $mysqli->commit();
24 echo '完美提交!';
25 } else {
26 $mysqli->rollback();
27 echo '程式出現異常!';}
28 } else {
29 echo "SQL語句有誤:".$mysqli->errno.$mysqli->error;
30 }
31 //最後還必須開啟自動提交
32 $mysqli->autocommit(true);
33 $result->free();//釋放查詢記憶體(銷毀)
34 $mysqli->close();//別忘了關閉你的"小資源";
35 ?>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 引言 在應用程式的設計中,經常需要讀取Excel數據或將Excel數據導入轉換到其他數據載體中,例如將Excel數據通過應用程式導入SQL Sever等資料庫中以備使用。筆者在開發“汽車產業鏈ASP協同商務平臺”中遇到了類似需求。某汽車整車生產企業需要將其車輛發車信息發佈到汽車產業鏈平臺上去,其 ...
  • 紅色字體是現階段比較火的 奇虎360 https://github.com/Qihoo360 1.MySQL中間層 Atlas Atlas是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版 ...
  • 本文是Linux Shell系列教程的第(十一)篇,更多Linux Shell教程請看:Linux Shell系列教程 在上一篇Linux Shell系列教程之(十)Shell for迴圈中,我們已經對Shell 迴圈語句的for迴圈進行了介紹,本篇給大家介紹下Shell 中另一種迴圈語句:Shel ...
  • 一、版本信息 Firefox 最新版本V46.0.1 Fiddler 最新版本V4.6.2.3 二、錯誤信息 開啟fiddlers的https協議捕獲的方法,百度上可以查到不再贅述,直接放張圖(Tools - Fiddlers Options……)。 開啟https協議捕獲之後,用firefox訪問 ...
  • 1. 建立Python的開發環境 2.第一個Python程式,還是從Hello World開始 3. debug一下python程式 <1>. 建立Python的開發環境; 這裡使用的Python的開發環境是eclipse + pydev插件來配置python的開發環境,如果想要在命令行下使用pyt ...
  • 編寫良好的代碼是一種藝術。如果一個程式員遵循一些良好的編程習慣,那麼他就可以成為一個優秀的程式員。實際上,相對於你寫代碼的時間,你很可能會花更多的時間在代碼維護上;更不用說整個應用程式的維護。建立良好的編碼習慣,能夠提高像模塊化這樣的設計因素,你的代碼也將更容易理解,因此,維護起來更容易、成本更低。 ...
  • 很久之前參加過一次面試,記得當時面試官問過我一個很基礎的代碼題:實現string類的四大基本函數! 一個C++類一般至少有四大函數,即構造函數、拷貝構造函數、析構函數和賦值函數,一般系統都會預設。但是往往系統預設的並不是我們所期望的,為此我們就有必要自己創造他們。在創造之前必須瞭解他們的作用和意義, ...
  • 引言 為什麼需要鎖(併發控制)? 在多用戶環境中,在同一時間可能會有多個用戶更新相同的記錄,這會產生衝突。這就是著名的併發性問題。 典型的衝突有: 丟失更新:一個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如:用戶A把值從6改為2,用戶B把值從2改為6,則用戶A丟失了他的更新。 臟讀: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...