一個簡單有登入機制的留言版 (缺點就是把 php 和 html 寫在一起 XD)
資料表
為了方便(ㄊㄡㄌㄢ ˇ)我直接用 mysql 的介面建立了資料表
member 表
mes 表
view
分成五個檔案 : 首頁 index.php、登入 login.php、註冊 signup.php、新增頁面 add_mes.php、更新頁面 update_mes.php
首頁 index.php
- 在載入頁面的時候要去資料庫裡面撈 mes 資料出來
<?php
include_once "database.php";
session_start();
$sql = "SELECT * FROM `mes`";
$result = mysqli_query($con , $sql) or die('MySQL query error');
?>
- 塞進去留言版裡面
<?php
while($row = mysqli_fetch_array($result)){
?>
<div class="card">
<h4 class="card-header">標題:<?php echo $row['title'];?>
<?php if(@$_SESSION["id"]===$row["uid"]){?>
<a href="mes.php?method=del&id=<?php echo $row["id"]?>" class="btn btn-danger mybtn">刪除</a>
<a href="update_mes.php?id=<?php echo $row["id"]?>" class="btn btn-primary mybtn">編輯</a>
<?php }?>
</h4>
<div class="card-body">
<h5 class="card-title">作者:<?php echo $row["uid"];?></h5>
<p class="card-text">
<?php echo $row["content"];?>
</p>
</div>
</div>
<?php
}
?>
- 特別判斷這篇留言的主人跟現在登入的人是不是同一個人,是的話才可以編輯和刪除
- 刪除連結利用 get 的方式,傳到 mes.php,而且帶兩個參數 method=del 和 id=該留言的 id
- 編輯連結利用 get 的方式,傳到 update.php,而且帶一個參數 id=該留言的 id
<?php if(@$_SESSION["id"]===$row["uid"]){?>
<a href="mes.php?method=del&id=<?php echo $row["id"]?>" class="btn btn-danger mybtn">刪除</a>
<a href="update_mes.php?id=<?php echo $row["id"]?>" class="btn btn-primary mybtn">編輯</a>
<?php }?>
- 在載入頁面的時候判斷有沒有登入狀態,顯示不同的功能按鈕
- 有登入就顯示 => 登出、新增留言
- 沒登入就顯示 => 登入、註冊
<?php if(isset($_SESSION["id"])){?>
<a href="config.php?method=logout">登出</a>
<a href="add_mes.php">新增留言</a>
<?php }else{?>
<a href="login.php">登入</a>
<a href="signup.php">註冊</a>
<?php }?>
登入 login.php
- 當網頁載入後,如果有登入的話,就不能再登入啦! 所以把用戶導到首頁
<?php include_once "database.php";
session_start();
if(isset($_SESSION["id"])){
header("Location: index.php");
}
?>
- 表單利用 post 的方式,傳到 config.php,而且帶一個 get 參數 method=login
<form role="form" action="config.php?method=login" method="post">
<div class="form-group">
<label for="username">帳號</label>
<input
type="text"
class="form-control"
id="username"
placeholder="username"
name="username"
/>
</div>
<div class="form-group">
<label for="password">密碼</label>
<input
type="password"
class="form-control"
id="password"
placeholder="Password"
name="password"
/>
</div>
<button type="submit" class="btn btn-primary">登入</button>
<a href="signup.php">註冊</a>
</form>
註冊 signup.php
- 當網頁載入後,如果有登入的話,就不能再註冊啦! 所以把用戶導到首頁
<?php
include_once "database.php";
session_start();
if(isset($_SESSION["id"])){
header("Location: index.php");
}
?>
- 表單利用 post 的方式,傳到 config.php,而且帶一個 get 參數 method=signup
<form role="form" action="config.php?method=signup" method="post">
<div class="form-group">
<label for="username">帳號</label>
<input
type="text"
class="form-control"
id="username"
placeholder="username"
name="username"
/>
</div>
<div class="form-group">
<label for="password">密碼</label>
<input
type="password"
class="form-control"
id="password"
placeholder="Password"
name="password"
/>
</div>
<div class="form-group">
<label for="name">綽號</label>
<input
type="text"
class="form-control"
id="name"
placeholder="name"
name="name"
/>
</div>
<button type="submit" class="btn btn-primary">註冊</button>
<a href="login.php">已有帳號想登入</a>
</form>
新增頁面 add_mes.php
- 當網頁載入後,如果沒登入的話,就不能新增留言了! 所以把用戶導到登入頁面
<?php
include_once "database.php";
session_start();
if(!isset($_SESSION["id"])){
header("Location: login.php");
}
?>
- 表單利用 post 的方式,傳到 mes.php,而且帶一個 get 參數 method=add
<form role="form" action="mes.php?method=add" method="post">
<div class="form-group">
<label for="title">標題</label>
<input
type="text"
class="form-control"
id="title"
placeholder="title"
name="title"
/>
</div>
<div class="form-group">
<label for="content">文章內容</label>
<input
type="text"
class="form-control"
id="content"
placeholder="content"
name="content"
/>
</div>
<button type="submit" class="btn btn-primary">新增</button>
</form>
更新頁面 update_mes.php
-
按下編輯按鈕會帶一個 get 參數
-
當網頁載入後,如果不是登入的用戶和該留言的主人不一樣的話,就不能更新留言了! 所以把用戶導到登入頁面
<?php
include_once "database.php";
session_start();
$id = $_GET["id"];
$sql="SELECT * FROM `mes` WHERE id = '$id'";
$result = mysqli_query($con , $sql) or die('MySQL query error');
$row = mysqli_fetch_array($result);
if($_SESSION["id"]!=$row["uid"]){
header("Location: login.php");
}
?>
- 表單利用 post 的方式,傳到 mes.php,而且帶兩個 get 參數 method=add 和 id=該留言的 id
<form role="form" action="mes.php?method=update&id=<?php echo $row["id"]?>" method="post">
<div class="form-group">
<label for="title">標題</label>
<input type="text" class="form-control" id="title" placeholder="title" name="title" value="<?php echo $row["title"]?>">
</div>
<div class="form-group">
<label for="content">文章內容</label>
<input type="text" class="form-control" id="content" placeholder="content" name="content" value="<?php echo $row["content"]?>">
</div>
<button type="submit" class="btn btn-primary">修改</button>
</form>
controller + model
分成三個檔案 : 資料庫連結 database.php、
資料庫連結 database.php、會員機制 config.php、訊息機制 mes.php
<?php
$server='localhost';
$id='root';
$pwd='1234';
$dbname='mes_board';
$con = mysqli_connect($server , $id , $pwd);
if (!$con){
die("Could not connect: " . mysql_error());
}
mysqli_select_db($con , $dbname);
mysqli_query($con ,"SET NAMES utf8");
// mysql_close($con);
?>
會員機制 config.php
- 判斷我傳過來的 method 參數,代表我要執行的動作
<?php
include_once "database.php";
switch ($_GET["method"]) {
case "login":
login();
break;
case "signup":
signup();
break;
case "logout":
logout();
break;
default:
break;
}
- 如果是登入的話,要先找資料庫 member 表裡面是否帳號、密碼和使用者輸入的帳號、密碼一樣,如果一樣才能登入,登入要給用戶一個 session,$_SESSION[“id”] 設成使用者的 id
function login(){
$sql="SELECT * FROM `member`
WHERE username = '$_POST[username]' && password = '$_POST[password]'";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
$row = mysqli_fetch_array($result);
if($row==""){
echo "<script type='text/javascript'>";
echo "alert('帳密錯誤');";
echo "location.href='login.php';";
echo "</script>";
}else{
session_start();
$_SESSION["id"] = $row['id'];
echo "<script type='text/javascript'>";
echo "alert('登入成功');";
echo "location.href='index.php';";
echo "</script>";
}
}
- 如果是註冊的話,要先找資料庫 member 表裡面是否帳號和使用者輸入的帳號一樣,如果一樣的話就代表已經註冊過帳號了。如果沒有一樣的話,就把他填的資料存進資料庫 member 表裡
- 註冊成功後要給用戶一個 session,$_SESSION[“id”] 設成使用者的 id
function signup(){
$sql="SELECT * FROM `member`
WHERE username = '$_POST[username]'";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
$row = mysqli_fetch_array($result);
if($row!=""){
echo "<script type='text/javascript'>";
echo "alert('已經辦過帳號囉');";
echo "location.href='login.php';";
echo "</script>";
}
else{
$sql="INSERT INTO `member` (username, password, name)
VALUES ('$_POST[username]','$_POST[password]','$_POST[name]')";
global $con;
$result = mysqli_query($con , $sql) or die("MySQL query error");
$sql="SELECT * FROM `member`
WHERE username = '$_POST[username]' && password = '$_POST[password]'";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
$row = mysqli_fetch_array($result);
session_start();
$_SESSION["id"] = $row["id"];
echo "<script type='text/javascript'>";
echo "alert('註冊成功');";
echo "location.href='index.php';";
echo "</script>";
}
}
- 如果是登出的話,就把用戶的 SESSION 清除掉
function logout(){
session_start();
if(isset($_SESSION["id"])){
session_unset();
echo "<script type='text/javascript'>";
echo "alert('登出成功');";
echo "location.href='index.php';";
echo "</script>";
}
}
訊息機制 mes.php
- 判斷我傳過來的 method 參數,代表我要執行的動作
<?php
include_once "database.php";
session_start();
switch ($_GET["method"]) {
case "add":
add();
break;
case "update":
update();
break;
case "del":
del();
break;
default:
break;
}
- 如果是新增訊息的話,把表單的東西新增到資料庫 mes 表裡面
function add(){
$uid = $_SESSION["id"];
$title = $_POST["title"];
$content = $_POST["content"];
$sql = "INSERT INTO `mes` (uid, title, content)
VALUES ('$uid', '$title', '$content')";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
echo "<script type='text/javascript'>";
echo "alert('新增留言成功');";
echo "location.href='index.php';";
echo "</script>";
}
- 如果是更新訊息的話,把表單的東西更新到資料庫 mes 表裡面
function update(){
$id = $_GET["id"];
$title = $_POST["title"];
$content = $_POST["content"];
$sql = "UPDATE `mes` SET title = '$title', content = '$content' WHERE id = $id";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
echo "<script type='text/javascript'>";
echo "alert('編輯留言成功');";
echo "location.href='index.php';";
echo "</script>";
}
- 如果是刪除訊息的話,把表單的東西從資料庫 mes 表裡面刪除
function del(){
$id = $_GET["id"];
$sql = "DELETE FROM `mes` WHERE id = $id";
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
echo "<script type='text/javascript'>";
echo "alert('刪除留言成功');";
echo "location.href='index.php';";
echo "</script>";
}
心得
-
主要是伺服器的架設,因為我之前裝了一堆 appserv 和 wamp 導致我的 port 還有 mysql 死掉,不要問我為什麼..我也不知道我怎麼搞得 XD,後來就把他們全部移除,重裝 xampp 就好了…
-
再是連接資料庫,因為新版的 php 連結 mysql 語法不同
$con = mysql_connect($server , $id , $pwd);
改成
$con = mysqli_connect($server , $id , $pwd);
- 還有 global 變數的抓不到… 要加一個 global $con; 才抓得到我 include 的變數
global $con;
$result = mysqli_query($con , $sql) or die('MySQL query error');
- 想下載完整程式碼,也可以去我的 github 傳送門