# 3 、 How to meet PHP ###### tags: `BE101` `PHP` `2020十月第一周` `進度筆記` `Lidemy心得` ## First step : Disable cache  在開發人員工具中 "Network" 停用快取(Disable cache) , 有些東西需求載入速度(希望較快載入)會影響效能,會暫存在瀏覽器;沒停用快取可能改了檔案後,重新整理卻沒有改變檔案(重新整理後瀏覽器(暫存)載入舊的檔案),因此需要停用快取。 - 停用快取(Disable cache) 後需要重新整理頁面。 *** # 3-1 、 XAMPP 的 PHP 執行流程 ###### tags: `BE101` `PHP` `2020十月第一周` `進度筆記` `Lidemy心得` ## 靜態檔案到動態網頁流程  ## 靜態檔案 如果是沒有指定 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> ``` - 按下提交後,瀏覽器就會把值帶入到網址去。  - 會用表單的方式,把值傳到 data.php 這個檔案。 - 這樣 data.php 就會拿到填入表單的值。 - 開啟 dev tool 後,在 Network 的地方勾選 "Preserve log" ,再重新提交一次值。  可以看到表單幫忙把參數放到網址列(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 。 - 而在請求的地方可以看到輸入的表單資料和請求內容。  ==代表用 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)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up