PHP的MySQLi函數庫的使用 以及 表單的字元編碼配置

來源:互聯網
上載者:User

標籤: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();?>

通過以上的預先處理語句,我們也可以實現資料的插入。


那麼預先處理有什麼特點呢?

  • 效率上高,就是如果執行多次相同的語句,只有語句資料不同,因為將一條語句在伺服器端準備好,然後將不同的值傳給伺服器,再讓這條語句執行。相當於編譯一次,使用多次。

  • 安全上:可以防止SQL注入 (?佔位)這樣就可以防止非正常的變數注入。



所以,推薦大家使用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"> &nbsp;<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函數庫的使用 以及 表單的字元編碼配置

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.