後端環境建置
XAMPP 官網:https://www.apachefriends.org/zh_tw/index.html
後端三要素
- 伺服器 Apache : 需要有一個伺服器來處理 Request 跟 Response
- Server => 程式,專門處理 request & response 的程式
- 寫程式 PHP : 需要寫程式來處理
- PHP => 接收 request 處理成 output,通常是 html
- 資料庫 MySQL : 需要有資料庫可以儲存資料
- 資料庫系統 => 程式,專門處理有關資料的程式,提供一些更有效率查找、修改資料的方法。
資料處理流程
- 接收 request
- server 轉給 php 處理 (重要)
- php 處理轉成 html
- html 傳給 server
- server 回傳 response
request => apache => php => output(html) => apache => response
CLI 開啟 php
- 使用指令:
php <file-name>.php
- 使用指令:
php 的網址規則是由 server 決定的,預設的規則: php 的網址的結構就是按照資料夾目錄。
- 如果要改 Apache 預設根目錄:
- 打開設定檔,路徑: apache2/ => conf/ => httpd.conf
- 如果要改 Apache 預設根目錄:
基礎 PHP 語法
- 要用 <?php ?> 包起來
- 每一步指令完成後一定要加
;
- 不用宣告變數,使用變數要用
$
開頭 - 字串連接用
.
而不是+
<?php
$sum = 0;
for ($i = 0; $i < 3; $i++) {
echo $i . '<br>';
}
?>
- 陣列 array
- 設定陣列:
$arr = array(1,2,3,4,5)
- 取得陣列元素:
echo $arr[i];
- 取得陣列長度:
echo sizeof($arr);
- 輸出完整陣列 (沒辦法透過
echo $arr;
輸出陣列),需使用以下方式:- var_dump : 輸出每一個內容的型態跟值: type, value
- print_r : 比較簡潔、沒有輸出型態: value
- 設定陣列:
<?php
$arr = array(1, 2, 3, 4, 5);
$length = sizeof($arr); // 陣列長度
echo $arr[$length - 1]; // 印出最後一個
var_dump($arr); // 輸出 type, value
print_r($arr); // 輸出 value
/* var_dump 輸出結果 */
array(4) {
[0]=>string(3) "one"
[1]=>int(2)
[2]=>string(5) "three"
[3]=>bool(false)
}
/* print_r 輸出結果 */
Array
(
[0] => one
[1] => 2
[2] => three
[3] =>
)
?>
初探 php
- 開始執行 php 之前,記得打開 devTool,將 NetWork 中的
Disable cache
打勾。
前端傳資料給後端
query string 方法
將資料夾帶在 URL 後面
- 夾帶的 query string 會被塞入
$_GET
當中
- 夾帶的 query string 會被塞入
//語法
http://localhost:8080/php/index.php?id=1&name=Alex&age=35
<?php
echo print_r($_GET) . '<br>';
echo $_GET['id'] . '<br>';
echo $_GET['name'] . '<br>';
echo $_GET['age'] . '<br>';
?>
//執行結果
Array ( [id] => 1 [name] => Alex [age] => 35 ) 1
1
Alex
35
- 可以加個條件來判斷有資料才 echo
isset()
可以確認 key 是否存在
<?php
if (isset($_GET['id']) {
echo $_GET['id'] . '<br>';
}
if (isset($_GET['name']) {
echo $_GET['name'] . '<br>';
}
if (isset($_GET['age']) {
echo $_GET['age'] . '<br>';
}
?>
或者更推薦的方式是:
<?php
if (empty($_GET['id'] || empty($_GET['name'] || empty($_GET['age']) {
echo '資料有缺,請再次填寫<br>';
exit(); // 跳出
}
echo $_GET['id'] . '<br>';
echo $_GET['name'] . '<br>';
echo $_GET['age'] . '<br>';
?>
form 方法:
- 在 form 標籤中將資料帶到後端
- form 當中要加入
method
跟action
兩個屬性- method: HTTP method
- action: 要帶入的檔案
// 將內容帶入 data.php 這個檔案當中
<form method="GET" action="data.php">
id: <input type="text" name="id"/>
name: <input type="text" name="name"/>
age: <input type="text" name="age"/>
<input type="submit"/>
</form>
送出 submit 的時候,系統會自動把
name
屬性的資料變成 query string 的key
加在 URL 後面。(跟上面 query string 方法一樣)若使用 method
POST
,不會把資料以 query string 的形式夾帶在 URL 後面,會直接被塞入$_POST
當中
接收 request
- $_GET['key-name'] 是一個物件,可以取得 get 的值(記得用引號)
- $_POST['key-name'] 是一個物件,可以取得 post 的值(記得用引號)
- isset() 檢查是否有此參數
<?php
$username = $_GET['username'];
if (isset($_GET['username'])) {
// do something...
}
?>
php 與 MySQL 的溝通
php 連線到 MySQL
- 一般會把連線的動作寫在另一個 php 檔,可以叫做
conn.php
,與處理資料用的data.php
分開。 - 在
data.php
需要連線資料庫時,只需要在開頭加上require_once('conn.php');
就可以執行該 conn.php 的連線動作
// conn.php
<?php
$server_name = 'localhost'; // server 名稱
$username = 'huli'; // 帳號
$password = 'huli'; // 密碼
$db_name = 'huli'; // db 名稱
$conn = new mysqli($server_name, $username, $password, $db_name);
if ($conn->connect_error) {
die('資料庫連線錯誤:' . $conn->connect_error); // die = 印出括號內文字 + 阻止底下程式執行
}
$conn->query('SET NAMES UTF8'); // 加上編碼,顯示中文才不會有問題
$conn->query('SET time_zone = "+8:00"'); // 設定為台灣時區
?>
// data.php
<?php
require_once('conn.php');
if (empty($_GET['id'] || empty($_GET['name'] || empty($_GET['age']) {
echo '資料有缺,請再次填寫<br>';
exit(); // 跳出
}
echo $_GET['id'] . '<br>';
echo $_GET['name'] . '<br>';
echo $_GET['age'] . '<br>';
?>
- 注意:
conn.php
內涵帳號密碼等重要資料,務必放在 git.ignore 不可上傳至 GitHub
php 讀取 MySQL 的資料
- 流程:
- 使用
require_once('conn.php');
連線到資料庫 - 使用
$result = $conn->query( "<SQL 語法>" );
來將 SQL 撈出的資料存在 $result 這個變數中 - 使用
$row = $result->fetch_assoc()
把 $result 中的資料,一筆一筆抓出來給 $row- 抓第一次 $row 會是第一筆資料,抓第二次 $row 會是第二筆資料,以此類推
- 用一個 while 迴圈,把資料一筆一筆印出,參考下列示範:
- 使用
<?php
require_once('conn.php');
$result = $conn->query("SELECT * FROM users");
if (!$result) {
die($conn->error);
}
while ($row = $result->fetch_assoc()) {
echo "id:" . $row['id'] . '<br>';
echo "username:" . $row['username'] . '<br>';
}
?>
- 若是連線出現錯誤,$result 會是空值,錯誤訊息是寫在 $conn->error
- select * 會撈取全部資料,意指全部的資料會放在 $result,但是 $row 每一次只會顯示 $result 中的一筆資料
php 新增 MySQL 的資料
- 流程:
- 使用
require_once('conn.php');
連線到資料庫 - 使用
$_POST['key-name']
取得輸入的資料 - 使用
$sql = sprintf( "<SQL 語法>" );
來將指令存放在 $sql - 使用
$result = $conn->query( $sql );
來將指令的執行結果存在 $result 這個變數中
- 使用
<?php
require_once('conn.php');
if (empty($_POST['username'])) {
die('請輸入 username');
}
$username = $_POST['username'];
$sql = sprintf(
"insert into users(username) values('%s')",
$username
);
$result = $conn->query($sql);
if (!$result) {
die($conn->error);
}
header("Location: index.php"); // 自動跳轉回 index.php
?>
sprintf()
可以將字串中的變數拉出來填入- 第一個參數是字串,裡面可以放入替代字元:
%d
代表的是十進位的數字%s
代表字串
- 第二個參數開始是變數,會按照順序填入替代字元
php 刪除 MySQL 的資料
- 流程:
- 使用
require_once('conn.php');
連線到資料庫 - 使用
$_POST['key-name']
取得輸入的資料 - 使用
$sql = sprintf( "<SQL 語法>" );
來將指令存放在 $sql - 使用
$result = $conn->query( $sql );
來將指令的執行結果存在 $result 這個變數中
- 使用
<?php
require_once('conn.php');
if (empty($_GET['id'])) {
die('請輸入 id');
}
$id = $_GET['id'];
$sql = sprintf(
"delete from users where id = %d",
$id
);
echo $sql . '<br>';
$result = $conn->query($sql);
if (!$result) {
die($conn->error);
}
if ($conn->affected_rows >= 1) { // 判斷影響 1 列以上資料
echo '刪除成功';
} else {
echo '查無資料';
}
// header("Location: index.php");
?>
php 編輯 MySQL 的資料
- 流程:
- 使用
require_once('conn.php');
連線到資料庫 - 使用
$_POST['key-name']
取得輸入的資料 - 使用
$sql = sprintf( "<SQL 語法>" );
來將指令存放在 $sql - 使用
$result = $conn->query( $sql );
來將指令的執行結果存在 $result 這個變數中
- 使用
<?php
require_once('conn.php');
if (empty($_POST['id']) || empty($_POST['username'])) {
die('請輸入 id 與 username');
}
$id = $_POST['id'];
$username = $_POST['username'];
$sql = sprintf(
"update users set username='%s' where id=%d",
$username,
$id
);
echo $sql . '<br>';
$result = $conn->query($sql);
if (!$result) {
die($conn->error);
}
header("Location: index.php");
?>