PHP與MySQL的資料庫互動

PHP版本:7.3.11
MySQL版本:8.0.18
執行環境:Mac OS 10.15.3

資料庫連線 mysqli_connect()

網址127.0.0.1
登入帳號root(預設)
密碼zaq1@WSX

選擇資料庫

選擇test資料庫(帶有水庫圖示的就叫做資料庫,資料庫底下的叫做資料表)

$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');

檢查是否連線成功

if(!$connect){
    echo '連線失敗';
}else{
    echo '連線成功';
}

抓取資料與迴圈處理

test裡面有一張資料表mylist,記載了一些水果的品項與價格

⑴ 抓取資料mysqli_query(),並且存成變數$re

mysqli_query()要放2個參數,
第1個是mysqli_connect的連線資訊
第2個放MySQL的語法
$re=mysqli_query($connect, 'SELECT * FROM mylist');

⑵ 回傳資料處理 mysqli_fetch_array()

mysqli_fetch_array()在沒寫迴圈下只會回傳第一筆符合條件的資料
所以搭配while迴圈,只要條件符合,就會一筆筆將資料丟出來

while($row=mysqli_fetch_array($re)){
    echo $row['name'].'<br/>';
}

進階:處理完整資料

資料表mylist裡面有「水果名」、「序號」、「價格」這3項資訊
更進一步地將所有資料都印出來

$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');
if(!$connect){
    echo '連線失敗';
}else{
    echo '連線成功';
}

echo '<hr>';

echo '<table border="1">';

echo '<caption>水果價目表</caption>';

echo 
    '<thead>
        <tr>
            <th>序號</th>
            <th>水果名</th>
            <th>價格</th>
        </tr>
    </thead>';

echo '<tbody>';

$re=mysqli_query($connect, 'SELECT * FROM mylist');
while($row=mysqli_fetch_array($re)){
    echo '<tr>';

    echo '<td align="center">'.$row['index'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>$'.$row['price'].'元</td>';

}

動態查詢:MySQL指令塞變數

mysqli_query()塞變數$_GET['name'],需注意引號" / '必須要包成以下格式

"SELECT * FROM mylist WHERE name='$_GET[name]'"

水果店今天要做查價網頁,使用者在網頁輸入水果名,系統回傳價格

<h2>請輸入品項名</h2>
<form action="" method="GET">
    <input type="text" name="name" />
    <input type="submit" name="submit" value="查詢" />
</form>
$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');

if(!isset($_GET['submit'])) return;

$re=mysqli_query($connect, "SELECT * FROM mylist WHERE name='$_GET[name]'");
$row=mysqli_fetch_array($re);
if(!$row){
    echo '查無此人';
}else{
    echo '查詢品項:'.$row['name'].'<br>';
    echo '價格:$'.$row['price'].'元';
}

總筆數 mysqli_num_rows()

mysqli_num_rows()會回傳$result總共抓了幾筆資料

$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');
$re=mysqli_query($connect, "SELECT * FROM mylist");
$total=mysqli_num_rows($re);
echo '總共有'.$total.'筆資料';

SQL Injection 資料庫隱碼注入攻擊

假設今天是做水果會員網站,用戶可以用水果ID登入,目前一共有4個ID

<h2>請輸入ID登入</h2>
<form action="" method="GET">
    <input type="text" name="id" />
    <input type="submit" name="submit" value="登入" />
</form>
$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');

if(!isset($_GET['submit'])) return;

$re=mysqli_query($connect, "SELECT * FROM mylist WHERE name='$_GET[id]'");
$row=mysqli_fetch_array($re);
if(!$row){
    echo '登入失敗';
}else{
    echo '您已經登入'.'<br>';
    echo '您的ID:'.$row['name'].'<br>';
}

如果有駭客在前台<input>輸入' OR '1'='1

這時,後端的MySQL搜尋語法就會變成

SELECT * FROM mylist WHERE name='' OR '1'='1'

'1'='1'一定會為true,所以駭客就能騙過程式,成功登入系統

隱碼注入對策 mysqli_escape_string()

mysqli_escape_string()可以讓值變成不具程式碼效力的普通字串
因此建議掛在任何使用者輸入的內容上,以防止被駭客攻擊

$connect=mysqli_connect('127.0.0.1', 'root', 'zaq1@WSX', 'test');

if(!isset($_GET['submit'])) return;

$safe_id=mysqli_escape_string($connect, $_GET['id']);
$re=mysqli_query($connect, "SELECT * FROM mylist WHERE name='$safe_id'");
$row=mysqli_fetch_array($re);
if(!$row){
    echo '登入失敗';
}else{
    echo '您已經登入'.'<br>';
    echo '您的ID:'.$row['name'].'<br>';
}