回 HTML跨平台行動網頁設計班 課程時間表

MySQL:PHP操作MySQL

設定

設定php.ini

  • extension = php_mysqli.dll:啟動MySQL的PHP函式庫。

資料庫連線

在存取資料庫之前,必須先與資料庫建立連線,建立連線必須輸入正確的:「資料庫位址」、「帳號、及「密碼」資訊。。

函式格式:

// 建立資料庫連線
資料庫連線識別 mysqli_connect(位址, 帳號, 密碼[, 預設資料庫][, 通訊埠][, Socket]);

提示:

  • 當mysqli_connect的位址傳入NULL時,會直接連線到本地端(localhost)的資料庫。

範例:

<?php
    $db = mysqli_connect("localhost", "root", "12345678");

    if(!$db)
        echo "<br/>連接資料庫失敗。";
    else
        echo "<br/>連接資料庫成功。";
?>

設定資料庫編碼

也就是設定PHP函式與MySQL資料庫連線時的字元集與連線校對。資料編碼必須和資料庫的設定一樣,否則如果資料庫本身的編碼是UTF-8,而PHP函式卻透過BIG-5的編碼方式來操作資料庫資料,將會產生亂碼。

函式格式:

布林值 mysqli_query(連線識別碼, SQL指令字串);

範例:

// 設定編碼為UTF-8(下面兩行程式碼範例擇一即可)
mysqli_query($db, "SET NAMES 'utf8'");
mysqli_query($db, "SET NAMES utf8");

選擇資料庫

當資料庫連線成功,如果在連線時,沒有指定要使用的資料庫,也可以連線成功後再指定要使用的資料庫。

函式格式:

// 直接使用最新的資料庫連線來選擇資料庫
布林值 mysqli_select_db(資料庫連線識別碼, 資料庫名稱字串);

範例:

<?php
    // 建立連線
    $db = mysqli_connect("localhost", "root", "12345678");

    if(!$db)
        echo "<br/>連接資料庫失敗。";
    else
        echo "<br/>連接資料庫成功。";

    // 設定資料編碼
    mysqli_query($db, "SET NAMES 'utf8'");
    
    // 選擇資料庫
    if(mysqli_select_db($db, "myDB"))
        echo '<br/>資料庫選擇成功。';
    else
        echo '<br/>資料庫選擇失敗。';
?>

關閉資料庫連線

在使用完資料庫後,應該將與資料庫的連線關閉,以釋放資料庫連線所佔用的資源。

函式格式:

// 關閉資料庫連線
布林值 mysqli_close(資料庫連線識別);

範例:

<php
    // 建立連線
    $db = mysqli_connect("localhost", "root", "12345678");

    if(!$db)
        echo "<br/>連接資料庫失敗。";
    else
        echo "<br/>連接資料庫成功。";

    // 設定資料編碼
    mysqli_query("SET NAMES 'utf8'");
    
    // 選擇資料庫
    if(mysqli_select_db($db, "myDB"))
        echo '<br/>資料庫選擇成功。';
    else
        echo '<br/>資料庫選擇失敗。';


    ... 資料庫操作 ...


    // 關閉連線
    if(mysqli_close($db))
        echo '<br/>資料庫連線關閉成功。';
    else
        echo '<br/>資料庫連線關閉失敗。';
?>

控制連線相關的錯誤訊息:

當連線資料庫或操作資料庫時,如果連線失敗或其他操作失敗會出現錯誤訊息,而這些錯誤訊息可能會帶有一些敏感性的資訊,可能會引起安全性上的問題。

如下圖登入失敗時:

這些錯誤訊息在開發時對除錯上是非常好的資訊,但當網站正式上線時,建議將這些訊息透過PHP的錯誤抑制指令「@」來讓這些連線相關警告和錯誤訊息不要出現,並透過die()exit()函式來終止程式的執行。

範例:

<?php
    // 建立連線
    $db = @mysqli_connect("localhost", "root", "12345678");

    if(!$db)
    {
        die("<br/>連接資料庫失敗。");
    }
    else
    {
        echo "<br/>連接資料庫成功。";
    }

    // 設定資料編碼
    @mysqli_query("SET NAMES 'utf8'");
    
    // 選擇資料庫
    if(@mysqli_select_db($db, "myDB"))
        echo '<br/>資料庫選擇成功。';
    else
        echo '<br/>資料庫選擇失敗。';


    ... 資料庫操作 ...


    // 關閉連線
    if(@mysqli_close($db))
        echo '<br/>資料庫連線關閉成功。';
    else
        echo '<br/>資料庫連線關閉失敗。';
?>

新增、查詢、修改、刪除

在與資料庫建立連線的工作完成以後就可以開始操作資料庫內的資料,資料庫內資料的「新增」、「查詢」、「更新」、「刪除」操作都是透過mysqli_query()函式搭配SQL語法來完成。

函式格式:

mixed mysqli_query(資料庫連線識別碼, SQL語法字串);

mysqli_query()函式回傳值:

當函式執行失敗時,會回傳False,成功時,如果查詢的SQL與法是SELECT、SHOW、DESCRIBE或EXPLAIN時,會回傳查詢結果的資料,其它則會回傳True表示成功。

新增資料

新增資料可以透過mysqli_query()來搭配SQL語法的INSERT指令。

INSERT指令格式(SQL語法):

INSERT [INTO] 資料表名稱[(欄位名稱1, 欄位名稱2, ...)] VALUES(資料1, 資料2, ...);

提示:

  • 如果插入一筆資料時,VALUES後面的資料有依照欄位順序設定好每一個欄位值,則可以省略欄位名稱的設定。
  • 新增資料成功時,mysqli_query()函式會回傳True,失敗回傳False。
  • 在SQL語法字串內,資料表名稱及欄位名稱建議使用「`」符號包住,尤其是欄位名稱不是文字而是數字的時候,如果沒有用「`」包住將會發生錯誤;該符號不是單引號,而是鍵盤上數字1左邊按鈕的「`」。

範例:

<?php
// 將一筆資料插入資料庫內的資料表class當中
$query_str = "INSERT INTO `class` VALUES('Aaron', 99, 88, 77)";

if(!@mysqli_query($db, $query_str))
{
    echo '資料新增失敗。<br/>';
}
?>

查詢資料

查詢資料可以透過mysqli_query()來搭配SQL語法的SELECT指令,成功時會回傳查詢到的資料識別碼,失敗會回傳False。

<?php
    // 查詢資料表class內的全部資料
    $query_str = "SELECT * FROM `class`";

    $result = @mysqli_query($db, $query_str);

    if($result == false)
    {
        die("<br/>資料查詢失敗");
    }
    else
    {
        echo "<br/>資料查詢成功。";
    }
?>

操作查詢資料結果

當透過SQL語法的SELECT指令來查詢資料庫成功後會取得一個取得的資料的識別碼,該識別碼必須透過其它PHP函式來取得裡面的資料。

函式格式:

// 將查詢到的資料依序將每一列(row)取出成陣列,並且以欄位名稱當成索引值,當資料取到後一列後,將回傳False
資料行陣列 mysqli_fetch_assoc(資料識別碼);

// 取得查詢結果的資料筆數
int mysqli_num_rows(資料識別碼);

// 移動查詢的紀錄指標,從0開始為第一筆資料,以此類推,失敗會回傳False
布林值 mysqli_data_seek(資料識別碼, 新位置);

// 釋放查詢到的資料所佔用的記憶體
void mysqli_free_result(資料識別碼);

範例:

<?php
    $query_str = "SELECT * FROM `class`";

    $result = mysqli_query($db, $query_str);

    if($result == false)
    {
        die("資料查詢失敗");
    }
    else
    {
        // 共幾筆資料
        $count = @mysqli_num_rows($result);

        echo "<br/>資料查詢成功,共{$count}筆資料。";

        // 取出每一列(row)資料
        while($row = @mysqli_fetch_assoc($result))
        {
            foreach($row as $key => $value)
            echo '<br/>key='.$key.' value='.$value;
        }

        // 將$result的紀錄指標移到第2筆資料的位置
        if(!@mysqli_data_seek($result, 1))
        {
            $row = @mysqli_fetch_assoc($result);

            echo '<br/>'.$row['data1'];
            echo '<br/>'.$row['data2'];
            echo '<br/>'.$row['data3'];
        }

        // 釋放查詢資料所佔的記憶體空間
        mysqli_free_result($result);
    }
?>

更新資料

更新資料可以透過mysqli_query()來搭配SQL語法的UPDATE指令,成功回傳True,失敗回傳False。

UPDATE指令格式(SQL語法):

UPDATE 資料表名稱 SET 欄位名稱1=值1, 欄位名稱2=值2, ... WHERE 條件式;

範例:

<?php
    $query_str =  "UPDATE `class` SET `name`='Aaron',";
    $query_str .= "                   `num`=10, ";
    $query_str .= "                   `age`=18 ";
    $query_str .= "               WHERE `id`=0";
    
    if(@mysqli_query($db, $query_str) == true)
    {
        echo "<br/>資料更新成功。";
    }
    else
    {
        die("<br/>資料更新失敗。");
    }
?>

刪除資料

刪除資料可以透過mysqli_query()來搭配SQL語法的DELETE指令,成功回傳True,失敗回傳False。

DELETE指令格式(SQL語法):

DELETE FROM 資料表名稱 WHERE 條件式;

範例:

<?php
    $query_str =  "DELETE FROM `class` WHERE `id`=0";
    
    if(@mysqli_query($db, $query_str) == true)
    {
        echo "<br/>資料刪除成功。";
    }
    else
    {
        die("<br/>資料刪除失敗。");
    }
?>