[ 筆記 ] 後端基礎 - PHP


Posted by krebikshaw on 2020-07-30

後端環境建置

XAMPP 官網:https://www.apachefriends.org/zh_tw/index.html

後端三要素

  1. 伺服器 Apache : 需要有一個伺服器來處理 Request 跟 Response
    • Server => 程式,專門處理 request & response 的程式
  2. 寫程式 PHP : 需要寫程式來處理
    • PHP => 接收 request 處理成 output,通常是 html
  3. 資料庫 MySQL : 需要有資料庫可以儲存資料
    • 資料庫系統 => 程式,專門處理有關資料的程式,提供一些更有效率查找、修改資料的方法。

資料處理流程

  1. 接收 request
  2. server 轉給 php 處理 (重要)
  3. php 處理轉成 html
  4. html 傳給 server
  5. server 回傳 response

request => apache => php => output(html) => apache => response

  • CLI 開啟 php

    • 使用指令: php <file-name>.php
  • php 的網址規則是由 server 決定的,預設的規則: php 的網址的結構就是按照資料夾目錄

    • 如果要改 Apache 預設根目錄:
      • 打開設定檔,路徑: apache2/ => conf/ => httpd.conf

基礎 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 當中
 //語法 
 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 當中要加入 methodaction 兩個屬性
    • 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 的資料

  • 流程:
    1. 使用 require_once('conn.php'); 連線到資料庫
    2. 使用 $result = $conn->query( "<SQL 語法>" ); 來將 SQL 撈出的資料存在 $result 這個變數中
    3. 使用 $row = $result->fetch_assoc() 把 $result 中的資料,一筆一筆抓出來給 $row
      • 抓第一次 $row 會是第一筆資料,抓第二次 $row 會是第二筆資料,以此類推
    4. 用一個 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 的資料

  • 流程:
    1. 使用 require_once('conn.php'); 連線到資料庫
    2. 使用 $_POST['key-name'] 取得輸入的資料
    3. 使用 $sql = sprintf( "<SQL 語法>" ); 來將指令存放在 $sql
    4. 使用 $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 的資料

  • 流程:
    1. 使用 require_once('conn.php'); 連線到資料庫
    2. 使用 $_POST['key-name'] 取得輸入的資料
    3. 使用 $sql = sprintf( "<SQL 語法>" ); 來將指令存放在 $sql
    4. 使用 $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 的資料

  • 流程:
    1. 使用 require_once('conn.php'); 連線到資料庫
    2. 使用 $_POST['key-name'] 取得輸入的資料
    3. 使用 $sql = sprintf( "<SQL 語法>" ); 來將指令存放在 $sql
    4. 使用 $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");
?>

#PHP







Related Posts

Create-react-app 錯誤訊息

Create-react-app 錯誤訊息

[Day 01] 強化學習?

[Day 01] 強化學習?

滲透測試重新打底(8)--Windows 提權手法

滲透測試重新打底(8)--Windows 提權手法


Comments