---
# System prepended metadata

title: 3 、 How to meet PHP
tags: [Lidemy心得, 進度筆記, BE101, PHP, 2020十月第一周]

---

# 3 、 How to meet PHP 
###### tags: `BE101` `PHP` `2020十月第一周` `進度筆記` `Lidemy心得` 
## First step : Disable cache  

![](https://i.imgur.com/gw8x8WA.png)  

在開發人員工具中 "Network" 停用快取(Disable cache) ， 有些東西需求載入速度(希望較快載入)會影響效能，會暫存在瀏覽器；沒停用快取可能改了檔案後，重新整理卻沒有改變檔案(重新整理後瀏覽器(暫存)載入舊的檔案)，因此需要停用快取。  

- 停用快取(Disable cache) 後需要重新整理頁面。  

***

# 3-1 、 XAMPP 的 PHP 執行流程 
###### tags: `BE101` `PHP` `2020十月第一周` `進度筆記` `Lidemy心得` 
## 靜態檔案到動態網頁流程    

![](https://i.imgur.com/wLTZPPu.png)  

## 靜態檔案  
如果是沒有指定 PHP 去執行的情況下，假設 User 指定 style.css 檔案(.css 結尾的檔案是靜態的)，那 User 要求的 Request 就會被傳到 Server 端(Apache)去，接著 Server 端找到檔案後回傳(Response)給 User 。  
```

```
- 根據 Server 設定的不同 ， PHP 檔也有可能變成靜態。 
- 把 PHP 檔丟到 GitHub 開啟 GitHub pages 就有類似情況。  


## 動態網頁  
Server 端有做過設定的情況下(會執行 PHP 檔)，動態網頁跟靜態檔案的差別在 Server 端回傳前，會先執行 PHP 檔，再把執行完的"結果"回應(Response)給 User 的 Request 。
```
<?php
  echo "Yo wa Haku daze!"
?>
wwwwwwwwwwwwwwww
<h1>Now: <?php echo date("Y-m-d H:i:s")" ?></h1>
```
- 除了 PHP 以外的地方也會被輸出(body 內容)。  
如果不是 PHP 指令包覆的區域，則"wwwwwwwwwwwwwwww"這段也會被回傳； 現在的日期時間每次重新整理網頁的 request 都會重新回傳。   

***

# 3-2 、 前端傳資料給後端 
###### tags: `BE101` `PHP` `2020十月第一周` `進度筆記` `Lidemy心得` 
## 動態網頁 GET & POST  

在安裝的 XAMPP 目錄底下 `xampp\htdocs\User` 開啟一個 data.php 檔案。  

- Request 中有內容的欄位是 URL ， 請求的網址 ， Server 端會根據請求的網址去找相對應的檔案。
	- 例如 `/data.php?a=2&b=3`  後面就會接相對應的檔案。  
- URL 後會加上 `?a=1` 是 Query string(格式是 Key(a) = Value(1)) ， 這個 由於 data.php 有 $_GET 因此 Query string 會自動存到 PHP 內。  

***

在 URL 是 `https://localhost/User/data.php?a=1` 的情況下
data.php 的檔案內容:  
```
<?php 
  echo "Hello!";
  print_r($_GET)
?>
```
- `($_GET)` PHP語法，可以把結構印出來。  
- 會在瀏覽器(火狐)上印出 Hello!Array ( [a] => 1 ) 。  

***

在 URL 是 `https://localhost/User/data.php?a=2&b=3` 的情況下
data.php 的檔案內容:  

```
<?php
  echo "Hello! <br>";
  echo "a:" . $_GET['a'] . '<br>';
  echo "b:" . $_GET['b'] . '<br>';
  print_r($_GET);
?>
```
會印出:  
``` 
Hello!
a:2
b:3
Array ( [a] => 2 [b] => 3 ) 
```
- 如果只輸入 a=1 而沒輸入 b= 多少的情況下會跳出 `Notice: Undefined index:` ， 的提醒。  
- 這是用 `$_GET[]` 去取得 querry string(URL) 的參數方法。  

***
如果不跳出提醒，在 URL 傳入如下: `https://localhost/User/data.php?c=1&a=1`  
```
<?php
  echo "Hello! <br>";
  if (isset($_GET['a'])) {
    echo "a:" . $_GET['a'] . '<br>';
  } // 如果 a 有傳進來的話把 a 印出來。  
  if (isset($_GET['b'])) {
	echo "b:" . $_GET['b'] . '<br>';
  }
  
  print_r($_GET);
?>
```
- 可以用 `if (isset($_GET['a'])) {}` 函式來檢查。  

***

## 在前端的方式  
在安裝的 XAMPP 目錄底下 `xampp\htdocs\User` 新增一個 index.php 檔案。 
```
<?php
  echo "Yo wa Spider Man!"
?>

<form method="GET" action="data.php">
  a: <input name="A" />
  age: <input name=age" />
  <input type="submit" />
</form>
```
- 按下提交後，瀏覽器就會把值帶入到網址去。  
![](https://i.imgur.com/c0gTHtn.png)  

- 會用表單的方式，把值傳到 data.php 這個檔案。 
- 這樣 data.php 就會拿到填入表單的值。  
- 開啟 dev tool 後，在 Network 的地方勾選 "Preserve log" ，再重新提交一次值。  

![](https://i.imgur.com/sS6o7cJ.png)  
可以看到表單幫忙把參數放到網址列(querry string)後送出。  

***
## GET 檢查填寫資料的方法  
在 index.php 檔案修改: 
```
<?php
  echo "Yo wa Spider Man!"
?>

<form method="GET" action="data.php">
  name: <input name="name" />
  age: <input name="age" />
  <input type="submit" />
</form>
```

以及在 data.php 檔案中修改: 
```
<?php

  if (!isset($_GET['name']) || !isset($_GET['age'])) {
    echo '資料有欠缺，請再次填寫<br>';
  } // 如果沒有設置姓名和年齡就顯示錯誤訊息。
  
  echo "Hello! " . $_GET['name'] . " <br>";
  echo "Your age is " . $_GET['age'] . " <br>";
   
  //print_r($_GET);
?>
```
以上沒在 index.php 下填寫資料就提交的話，就會出現:    
```
資料有欠缺，請再次填寫
Hello!
Your age is
```
- 如果出現提示則可以參考修改 1 & 修改 2 。  

## 修改 1 

在 data.php 檔案中新增 else : 
```
<?php

  if (!isset($_GET['name']) || !isset($_GET['age'])) {
    echo '資料有欠缺，請再次填寫<br>';
  } else {
  
  echo "Hello! " . $_GET['name'] . " <br>";
  echo "Your age is " . $_GET['age'] . " <br>";
   
  }
?>
```

## 修改 2  
```
<?php

  if (!isset($_GET['name']) || !isset($_GET['age'])) {
    echo '資料有欠缺，請再次填寫<br>';
	exit();
  } 
  
  echo "Hello! " . $_GET['name'] . " <br>";
  echo "Your age is " . $_GET['age'] . " <br>";
    
?>
```
- 新增 `exit()` 函式，這樣執行到 exit 就會跳開這段程式碼。  
- 也可以在網址列(data.php)直接修改參數，這樣也會直接拿到值。  

***

## POST 檢查填寫資料的情況 
在 index.php 檔案修改: 
```
<?php
  echo "Yo wa Spider Man!"
?>

<form method="POST" action="data.php">
  name: <input name="name" />
  age: <input name="age" />
  <input type="submit" />
</form>
```

以及在 data.php 檔案中(不用動): 
```
<?php

  if (!isset($_GET['name']) || !isset($_GET['age'])) {
    echo '資料有欠缺，請再次填寫<br>';
  } // 如果沒有設置姓名和年齡就顯示錯誤訊息。
  
  echo "Hello! " . $_GET['name'] . " <br>";
  echo "Your age is " . $_GET['age'] . " <br>";
   
  //print_r($_GET);
?>
```
- 這樣 GET 會抓不到資料，在網址列(data.php)不會看到新增的值。 
- 因為沒有 GET ， 網址列上沒有參數就抓不到東西。   
- 用 dev tool 下去看會發現，檔頭的地方是 POST 。  
- 而在請求的地方可以看到輸入的表單資料和請求內容。     

![](https://i.imgur.com/xwLmrrj.png)  

==代表用 POST 的方式送出資料，但是 PHP 接受到後還沒處理。==  

## 用 `empty()` 來檢查值  
index.php 檔案更動:
```
<?php
  echo "Yo wa Spider Man!"
?>

<form method="POST" action="data.php">
  name: <input name="name" />
  age: <input name="age" />
  <input type="submit" />
</form>
```


但如果將 data.php 檔案修改 POST :  

```
<?php

  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo '資料有欠缺，請再次填寫<br>';
	exit();
  } 
  
  echo "Hello! " . $_POST['name'] . " <br>";
  echo "Your age is " . $_POST['age'] . " <br>";
    
  print_r($_POST);
?>
```
- 用 `empty()` 來檢查值是不是空的。  
- 在 data.php 中 GET & POST 可以混用。  
- 但表單(index.php)則不行混用，只能選用其中一種。

如果再 data.php 中有新增 ` echo "Your school is " . $_GET['school'] . " <br>";` 則可以在 index.php 檔案修改: 
```
<?php
  echo "Yo wa Spider Man!"
?>

<form method="POST" action="data.php?school=NPUST">
  name: <input name="name" />
  age: <input name="age" />
  <input type="submit" />
</form>
```
- 一般實作不太會混用，一個網址只用一種方法(混用多種動作會太混亂)。  

- 自己在網址列新增學校的話，代表送出一個沒有資料的表單(不會放入 data.php)。  

- 但如果是直接在 index.php 中直接新增學校，代表提交一個表單到這個網址再代上 POST 的參數。  

課程中提到: 
```
示範 $_GET 有沒有設置的，是用了 isset，然後有個細節沒有講清楚。  
假設網址是 ?a=&b=，只有傳 key 沒有傳 value，isset 的結果依舊會是 true ;  
必須連 key 都沒有傳，isset 才會是 false ; 
因此針對這種檢查，會推薦使用 empty 來檢測，因為 empty 可以順便檢測空字串的狀況。
```

***
參考資料:  
[安裝XAMPP後常用之設定](http://ep.ckvs.tyc.edu.tw/blog/files/6-5919-9316.php)  


[PHP isset()和empty()的區別@ 史丹利愛碎念:: 痞客邦::](https://newaurora.pixnet.net/blog/post/171735396-php-isset%28%29%E5%92%8Cempty%28%29%E7%9A%84%E5%8D%80%E5%88%A5)  

[PHP isset - Wibibi](https://www.wibibi.com/info.php?tid=237)  


