[筆記]laravel 如何對網頁進行POST等請求 02

接續上一篇:[筆記]laravel 建立第一個頁面 01

我們一般使用PHP來編寫網頁時,一般都會使用post、get http動作來跟PHP網頁進行互動,因此我們只要在php程式碼中打上:

<?php 
echo $_POST['username']."<br/>";
echo $_POST['password']."<br/>"; 
?>

然後我們再設計一張表單:

<form action="test.php" method="post">
使用者:<input type="text" name="username">
密碼:<input type="text" name="password">
<button type="submit">登入</button>
</form>

然後再把使用者名稱及密碼(test,1234)輸入後,再按下登入,想必不陌生,你一定可以看到:

test
1234

或者,你想要設計分頁,從網址得到id再從資料庫中撈取資料!

<?php 
$id = $_GET['id']; 
$res = mysqli_query($conn,"SELECT * FROM `post` WHERE `id` = '$id';"); 
$row = mysqli_fetch_array($res); 
?>
ID:<?php echo $row['id'];?>
title:<?php echo $row['title'];?>
content:<?php echo $row['content'];?>
Author:<?php echo $row['author'];?>
Created at:<?php echo $row['created_at'];?>

訪問test.php?id=1

ID:1
title:hello world
content:this is a hello world post!
Author:Bang Bang Bang
Created at:2017-12-15 20:40:43

但您是否有想過,這樣寫會不會有安全的疑慮?
我都這樣問了,保證是有的,因為如果有惡意的使用者在我們的表單中使用一些跳脫字符,很可能我們的table會被drop掉。

那laravel要怎麼去接收POST資料呢?其實很簡單,只要使用$request這個實例即可接收到POST資料囉,當然,路由那邊也要設定成:

Route::post("網址", "控制器@方法");

那我們就把之前的那個html登入表單拿來用一下吧XD:

把它存成/resoucre/views/Member/loginForm.blade.php

其中如果要使用laravel的blade模板系統的話,要把.php改成.blade.php!(小弟個人淚推~好用到爆炸~)

<form action="{{ url("/login") }}" method="post">
{{ csrf_field() }}
使用者:<input type="text" name="username">
密碼:<input type="text" name="password">
<button type="submit">登入</button>
</form>

其中,這個是一定要加上的,因為laravel自動會為除了get動詞的請求要求檢查csrf token,它可以幫助防禦跨站請求偽造

{{ csrf_field() }}

路由就這樣設計:

<?php
//...前面省略
Route::get("/login", "MemberController@loginForm")->name("member.loginForm");
Route::post("/login", "MemberController@loginProcess")->name("member.loginProcess");

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;//這行很重要,因為它會載入request類別

class MemberController extends Controller
{
    public function loginForm()
    {
        return view("Member.loginForm");
    }
    
    public function loginProcess(Request $request) //這行你會覺得它很奇怪
    {
        echo $request->input("username")."<br/>";
        echo $request->input("password")."<br/>";
    }
}

疑?你一定會覺得Request $request這行很怪,那是因為laravel會自動注入Request類別,進而實例Request類別,所以你不會在loginProcess() method中看到$request = new Request();的東西,但我們卻能使用它,所以這叫做什麼依賴注入的,但這並不是我們這個章節該講的東西

好啦!我主要要講的是$request->input()─這個好用的method,它可以輕輕鬆鬆取得使用者表單輸入的表單資料,而且可以自動過濾危險的字元!比較不容易被SQL注入!讚~

但你也可以使用以下方法取值(叫動態屬性):

$request->欄位名稱;

應該ok了!剩下自己去看laravel的requests的章節!XD~

Reference:

https://laravel.com/docs/5.5/requests

laravel道場(正體中文翻譯):

https://docs.laravel-dojo.com/laravel/5.5/requests