標籤彙整:MySQL

PHP 會員留言板系統

延續前篇:PHP 會員登入系統

結構

  • MySQL留言資料庫(message)
  • 留言板頁面(msg.php)
  • 留言新增功能(msg-add.php)
  • 留言刪除功能(msg-del.php)

MySQL留言資料庫(message)

編碼:utf8_unicode_ci

名稱 型態 備註
id int AI
guest_id int
content text
date date

留言板頁面(msg.php)

  • 結合 message 的 guest_id 與 member 的 id
    在 message 的提取迴圈裡面,寫下指令 mysql_query( 讀取 member 資料表,WHERE條件設定 id=’$row[guest_id]’ )
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("hahow");
mysql_query("SET NAMES UTF8");

//如果沒有登入的SESSION,就轉址
if (isset($_SESSION["email"])==FALSE) {
 header('Location: login.php');
}
?>
<!DOCTYPE html>
<html>
<head>
 <title>Message Board</title>
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<br><br><br><br>
<div class="container">
 <h3 class="text-center">會員留言板</h3>
 <hr>

<?php
$re=mysql_query("SELECT * FROM message");
//檢査有沒有留言數( message 資料表的資料筆數是否大於0):參考
if(mysql_num_rows($re)>0){
 //如果有留言,一筆一筆印出留言
 //使用 while 迴圈從 message 資料表一筆一筆讀取留言的方法:參考
 while($row=mysql_fetch_array($re))
 {
 //mysql_query() 括弧裡面的指令,使用變數時,要用單引號包起來,參考
 $memberRe=mysql_query("SELECT * FROM member WHERE id='$row[guest_id]'");
 $memberRow=mysql_fetch_array($memberRe);

 echo "<div class=\"panel panel-default\">
 <div class=\"panel-heading\">$memberRow[name] 
 <span class=\"pull-right\">$row[date]
 //以更改網址的方式強制讀取GET表單資料
 //正常的流程:使用者在GET表單輸入資料→送出轉址→新網址裡面有使用者輸入的資料
 //轉址到有特定 GET 表單 id 的 msg-del.php
 <a href=\"msg-del.php?id=$row[id]\" class=\"btn btn-danger btn-xs\">
 DELETE
 </a>
 </span>
 </div>
 <div class=\"panel-body\"> $row[content]
 </div>
 </div>";
 }
}

else{
 //沒有留言的話
 echo "<p class=\"text-center\">沒有任何訊息!</p>";
}
?>
 <hr>
 <p class="pull-right">以 <?php echo $_SESSION["name"]; ?> 的身份留言</p>
 <h4>新增留言</h4>
 <form action="msg-add.php" method="post">
 <textarea name="msg" class="form-control"></textarea>
 <br>
 <input type="submit" name="submit" value="送出" class="btn btn-primary btn-sm pull-right">
 </form>
</div>
</body>
</html>

留言新增功能(msg-add.php)

<?php
require("msg.php");

//設定日期格式
$date=date("Y-m-d");

$SaveNewMsg=mysql_query("INSERT INTO message(guest_id, content, date) 
//對應 msg.php 新增留言區的 POST表單
VALUES('$_SESSION[id]','$_POST[msg]','$date')");

//檢査
if(!$SaveNewMsg){
 echo "留言失敗";
}else{
 echo "留言成功";
}

//新增完畢轉回留言板
header('Location: msg.php');
?>

留言刪除功能(msg-del.php)

<?php
require("msg.php");

//抓取 msg.php 布好的GET表單的刪除ID
mysql_query("DELETE FROM message WHERE id='$_GET[id]'");

//刪除完畢轉回留言板
header('Location: msg.php');
?>

範例:會員登入網站

測試用帳號:123@123
測試用密碼:123

結語

  • 善用 Sublime + SFTP,存檔即上傳主機可以節省時間
  • bug 可能出現在各種地方,資料庫連線,上一份檔案的 session 沒有寫好,都可能有錯,必須小心

PHP + MySQL 中文字亂碼問題

解説

建立PHP網頁讀取MySQL資料庫時,如果資料庫裡面有中文,讀取出來放到網頁上會變成問號

解決方法

MySQL資料庫編碼設定

點選資料庫右邊的小水庫圖案,在編碼與排序設定【utf8_unicode_ci】

php中的head設定

在php的html部分裡面的,之中插入這行程式碼

<head>
mysql_query("SET NAMES 'UTF8'");
</head>

讀取資料庫設定

php讀取資料前,設定這一行

mysql_query("SET NAMES 'UTF8'");

PHP結合MySQL

資料庫連線

<?php

//網址:localhost 因為網頁跟資料庫的伺服器在電腦上面
//登入帳號:root(預設)
//密碼:留空
mysql_connect("localhost", "root", "");

?>

檢査資料庫連線是否成功

<?php

$Connect=mysql_connect("localhost", "root", "");

if (!$Connect) {
 die("連線失敗,錯誤訊息:".mysql_error());
}
echo "連線成功";
mysql_close($Link);

?>

選擇資料庫

<?php

//DB:DataBase
//member是要操作的資料庫名稱
mysql_select_db("hahow");

?>

資料庫長得像這樣
左邊這排外排的就是資料庫 (hahow, information_schema, mysql, performance_schema, phpmyadmin, test)
内縮的是資料表 (mem, member)

phpmyadmin

SQL査詢指令

<?php

//SELECT後面接欄位,*代表所有欄位
//FROM後面接資料表,從member這個資料表裡面讀取
//mysql_query()裡面的東西用""包起來
//査詢member這個資料表裡面所有内容
//將mysql_query()的回傳値存在$re裡面
$re=mysql_query("SELECT * FROM member");

?>

回傳資料處理  mysql_fetch_array()

<?php

$re=mysql_query("SELECT * FROM member");
//在回傳値$re中擷取其中一筆資料出來
$row=mysql_fetch_array($re);
//提取第一筆name資料
//如果要提取很多資料,必須寫成迴圈

echo $row["name"];
//資料會存成陣列

/************寫成迴圈版本**************/

$re=mysql_query("SELECT * FROM member");
while($row=mysql_fetch_array($re)){
 echo $row["name"];
 //只要條件符合,就會一筆一筆地把資料處裡過去
}

?>

MySQL指令使用變數

<?php

//mysql_query()裡面的MySQL指令中的變數
//要用單引號'包起來
//並且變數裡面不能有雙引號"
$re=mysql_query("SELECT * FROM member" WHERE email='$_GET[email]'");

?>

抓取資料總筆數 mysql_num_rows()

<?php

$re=mysql_query("SELECT * FROM member");

//mysql_num_rows()裡面放存mysql_fetch_array()的變數
$dataNum=mysql_num_rows($re);

echo $dataNum;
//會顯示總共有幾筆資料

?>

SQL Injection 資料庫隱碼注入攻擊

<?php

//沒有防護措施的原始php
//"$_GET["email"]"是要産生MySQL指令的片段
SELECT * FROM member WHERE id="$_GET["email"]"

//正常的情況下:使用者填入正常的email
SELECT * FROM member WHERE id="MingWang@gmail.com"
//SQL query査詢功能會回傳符合id="MingWang@gmail.com"的資料

//受到攻擊:有人輸入" OR "1"="1
SELECT * FROM member WHERE id="" OR "1"="1"
//id不一定等於空値,但是1永遠等於1,所以true
//所有資料都符合id="" OR "1"="1",所以會回傳所有資料

//結果:不論帳號密碼是對或錯,都可以直接登入

?>

防止SQL Injection:mysql_escape_string()

<?php

//$q=使用者輸入的資料
//使用SQL query査詢指令之前先過濾
$q=mysql_escape_string($q);

//然後開始査詢
SELECT * FROM member WHERE id="$q"

?>