標籤:php5 php mysqli mysql sql 函數庫
1.什麼是mysqli
PHP-MySQL 函數庫是 PHP 操作 MySQL 資料庫最原始的擴充庫,PHP-MySQLi 的 i 代表 Improvement ,相當於前者的改進增強版,也包含了相對進階的功能,另外本身也增加了安全性,比如可以大幅度減少 SQL 注入等問題的發生。
2. mysql與mysqli的概念相關
(1)mysql與mysqli都是php方面的函數集,與mysql資料庫關聯不大。
(2)在php5版本之前,一般是用php的mysql函數去驅動mysql資料庫的,比如mysql_query()的函數,屬於面向過程
(3)在php5版本以後,增加了mysqli的函數功能,某種意義上講,它是mysql系統函數的增強版,更穩定更高效更安全,與mysql_query()對應的有mysqli_query(),屬於物件導向,用對象的方式操作驅動mysql資料庫
3. mysql與mysqli的主要區別
(1)mysql是非持繼串連函數,mysql每次連結都會開啟一個串連的進程,所以mysqli耗費資源少一些。
(2)mysqli是永遠串連函數,mysqli多次運行mysqli將使用同一串連進程,從而減少了伺服器的開銷。mysqli封裝了諸如事務等一些進階操作,同時封裝了DB操作過程中的很多可用的方法。
(3)mysqli支援物件導向編程方式和面向過程編程方式,而mysql則只可以面向過程。
例如如下代碼分別是mysqli的物件導向編程方式和面向過程方式
物件導向方式
<?php$mysqli = new mysqli("localhost","db_user","db_passwd","database");# check connectionif (mysqli_connect_errno()) { printf ("Connect failed: %s\n",mysql_connect_error()); exit;}printf ("Host infomation: %s\n",$mysqli->host_info);# close connection$mysqli->close();?>
面向過程的方式
<?php$link = mysqli_connect("localhost","db_user","db_passwd","database");# check connectionif (!$link) { printf("Connect failed: %s\n",mysqli_connect_error()); exit;}printf("Host infomation: %s\n",mysqli_get_host_info($link));#close connectionmysqli_close($link);?>
(4)mysqli 可以通過預先處理語句來減少開銷和SQL注入的風險,而mysql則做不到。
綜上所述,如果大家用的是PHP5,而且mysql版本在5.0以上,希望大家以後能用mysqli的就盡量使用mqsqli,不僅高效,而且更安全,而且推薦大家使用物件導向編程方式。
在這裡,我們也只介紹物件導向編程方式。
物件導向方式函數使用
1,串連資料庫並擷取相關資訊
<?php $mysqli = new mysqli("localhost","root","","mysql"); #如果串連失敗 if (mysql_connect_errno()){ echo "資料庫連接失敗:".mysql_connect_error(); $mysqli = null; exit(); } #擷取當前字元集 echo $mysqli->character_set_name()."<br>"; #擷取用戶端資訊 echo $mysqli->get_client_info()."<br>"; #擷取mysql主機資訊 echo $mysqli->host_info."<br>"; #擷取伺服器資訊 echo $mysqli->server_info."<br>"; #擷取伺服器版本 echo $mysqli->server_version."<br>"; #關閉資料庫連接,嚴格來說,這並不是必要的,因為指令碼執行完畢的時候他們將被自動關閉 $mysqli->close();?>
以上代碼如果串連成功則運行結果
latin1mysqlnd 5.0.10 – 20111026 – $Id: e707c415db32080b3752b232487a435ee0372157 $localhost via TCP/IP5.6.12-log50612
如果串連失敗則結果可能為
串連資料庫失敗:Access denied for user ‘root’@’localhost’ (using password: YES)串連資料庫失敗:Unknown database ‘hello’
2.查詢資料
<?php $mysqli = new mysqli("localhost","root","","test"); #如果串連失敗 if (mysql_connect_errno()){ echo "資料庫連接失敗:".mysql_connect_error(); $mysqli = null; exit(); } #構造SQL語句 $query = "SELECT * FROM test ORDER BY id LIMIT 3"; #執行SQL語句 $result = $mysqli->query($query); #遍曆結果 while ($row = $result->fetch_array(MYSQLI_BOTH)){ echo "id".$row["id"]."<br>"; } #釋放結果集 $result=free(); #關閉串連 $mysqli->close();?>
運行結果
id10062id10063id10064
在這裡需要注意的是
fetch_array(MYSQLI_BOTH)
這個方法,參數有三個,分別是MYSQLI_BOTH,MYSQLI_NUM,MYSQLI_ASSOC。
如果傳入了MYSQLI_BOTH,返回資料的索引既包括數字和名稱
array(size=26) 0=>string ‘10062‘(length=5) ‘id‘ => string ‘10062‘ (length=5) 1 => string ‘??‘ (length=2) ‘name‘ => string ‘??‘ (length=2) 2 => string ‘[email protected]‘ (length=17) ‘email‘ => string ‘[email protected]‘ (length=17) 3 => string ‘18366119732‘ (length=11) ‘phone‘ => string ‘18366119732‘ (length=11)
其實還有等價的方法fetch_row(),fetch_assoc()
它們之間的關係如下
$result->fetch_row() = mysql_fetch_row() = $result->fetch_array(MYSQLI_NUM) = mysql_fetch_array(MYSQLI_NUM) 返回索引數組$result->fetch_assoc() = mysql_fetch_assoc() = $result->fetch_array(MYSQLI_ASSOC) = mysql_fetch_array(MYSQLI_ASSOC) 返回索引列名
如果fetch_array()方法什麼也不傳,則預設傳入的是MYSQLI_BOTH
3,插入資料
<?php $mysqli = new mysqli("localhost","root","","test"); #如果串連失敗 if (mysql_connect_errno()){ echo "資料庫連接失敗:".mysql_connect_error(); $mysqli = null; exit(); } #插入資料 $sql = "INSERT INTO test(name,phone) values ("hello","10086")"; #執行插入語句 $result = $mysqli->query($sql); #如果執行錯誤 if (!$result){ echo "SQL語句有誤<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果插入成功,則返回影響的行數 echo $mysqli->affected_rows; #關閉資料庫連接 $mysqli->close();?>
如果插入成功,那麼結果則會是1 ,如果失敗,則會報錯。
4,修改內容
<?php $mysqli = new mysqli("localhost","root","","test"); #如果串連失敗 if (mysql_connect_errno()){ echo "資料庫連接失敗:".mysql_connect_error(); $mysqli = null; exit(); } #執行語句 $sql = "update test set name = ‘hello‘ where id = 10062"; #執行修改語句 $result = $mysqli->query($sql); #如果執行錯誤 if (!$result){ echo "SQL語句有誤<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果修改成功,則返回影響的行數 echo $mysqli->affected_rows; #關閉資料庫連接 $mysqli->close();?>
如果修改成功,同樣返回被修改的行數。
5,預先處理語句
<?php $mysqli = new mysqli("localhost","root","","test"); #如果串連失敗 if (mysql_connect_errno()){ echo "資料庫連接失敗:".mysql_connect_error(); $mysqli = null; exit(); } #準備好一條語句放到伺服器中,比如插入語句 $sql = "INSERT INTO test(name,email) values (?,?)"; #產生預先處理語句 $stmt = $mysqli->prepare($sql); #給站位符號每個 ? 號傳值(綁定參數)i d s b,沒一個參數為格式化字元,ss代表兩個字串,d代表數字 $stmt = bind_param("ss",$name,$email); #執行 $stmt->excute(); #為變數賦值 $name = "Mike"; $email = "[email protected]"; #執行 $stmt->execute(); #執行輸出 echo "最後ID".$stmt->insert_id."<br>"; echo "影響了".$stmt->affected_rows."行<br>"; #關閉資料庫連接 $mysqli->close();?>
通過以上的預先處理語句,我們也可以實現資料的插入。
那麼預先處理有什麼特點呢?
所以,推薦大家使用mysqli 的預先處理語句方式,不僅效率高,而且更安全。
面向過程風格
<?php$link = mysqli_connect(‘localhost‘, ‘my_user‘, ‘my_password‘, ‘test‘);/* check connection */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}/* change character set to utf8 */if (!mysqli_set_charset($link, "utf8")) { printf("Error loading character set utf8: %s\n", mysqli_error($link));} else { printf("Current character set: %s\n", mysqli_character_set_name($link));}mysqli_close($link);?>
-------------------------------------------------------------------
關於html表單提交字元到MySQL中字元編碼的問題
首先我們來看看html檔案裡面的代碼
<html><body><form action="tt.php" method="post"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache">Test input values to MySQL<br></head><br><input type="text" name="isbn" maxlength="13" size="13"> <input type="submit" value="提交"></body></html>
這裡定義了一個表單,名稱是isbn ,允許的資料類型為text
使用post方法傳遞到後端 tt.php 指令碼頁面中。
tt.php檔案代碼
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache"></head><title> Input to MySQL page!</title><h1> 返回結果:</h1><?php//create short variable names$v = $_POST[‘isbn‘]; //擷取表單傳遞過來的值#判斷如果值為空白,那麼列印錯誤資訊,並退出。if (!$v) { echo "you must input some values <br> Please go back and try again."; exit;}#檢查是否經過php的魔術字元轉換if (!get_magic_quotes_gpc()){ $isbn = addslashes($v);}#定義一個資料庫連接對象@ $db = new mysqli(‘211.162.188.60‘,‘test‘,‘123.com‘,‘test‘);#設定字元if ( $db->set_charset("utf8") ){ //注意這裡是utf8 並不是utf-8 printf("Current charset is: %s <br>",$db->character_set_name());} else { echo "Error: Could not set this charset !";}#檢查是否串連資料庫錯誤if (mysqli_connect_errno()) { echo "Error: Could not connect to database. Please try again later."; exit;}#插入資料$insert = "insert into ttt set S22 = ‘".$isbn."‘";#執行插入操作$result = $db->query($insert);#檢測是否執行成功if ($result) { echo $db->affected_rows." values inserted into database."; //列印影響行數} else { echo "An error has occurred. The item was not added.";}#關閉串連$db->close();?>
執行結果:
返回結果:Current charset is: utf8 .1 values inserted into database.
查看資料庫
+----+------+--------------+| s1 | tax | s22 |+----+------+--------------+| 0 | 1.00 | 測試資料 || 0 | 1.00 | 測試資料 || 0 | 1.00 | 測試資料 || 0 | 1.00 | 測試資料 || 0 | 1.00 | 測試資料 |+----+------+--------------+5 rows in set (0.02 sec)
PHP的MySQLi函數庫的使用 以及 表單的字元編碼配置