每次用到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查詢返回的行數,或者受INSERT、UPDATE或DELET查詢影響的行數。
我們可以使用num_rows和affected_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 ?>