科技始終來自人性,function也是這樣。O-O(我知道我用很多顏文字,不過這裡是指Object-Oriented,物件導向)的起點也是因為以前的程式開發人員想要重複利用某些 function 而被發明。在前幾篇文章我們介紹了關於 Post 和 Get 的使用方法,以及 php 接收 Post 或 Get 的方法
最簡單的樣子是像下面的這個範例
<?php
$a = $_POST['userInput'];
?>
如果不是很清楚這段 php 的意思,也可以參考 Day 9 的文章哦(`・ω・´)
總之,我們接收變數乍看只要這樣就可以解決。假如表單的變數數量有30個,豈不是要一堆變數才有辦法解決嗎_(√ ζ ε:)_
幸好,在 php 中有 extract() 這個 function 可以只用一行就把所有表單中的資料轉換成 php 中的變數(ノ>ω<)ノ
以 Day 9 當例子,HTML部分不變
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<form method="get" action="Foo.php">
<input type="text" name="account" placeholder="帳號"><br>
<input type="password" name="password" placeholder="密碼"><br>
<input type="submit" name="submit" value="送出">
</form>
</body>
</html>
PHP原本的樣子
<?php
$id = $_GET['account']; //取得表單 name 為 account 的內容
$pw = $_GET['password']; //取得表單 name 為 password 的內容
if($id == '史蒂夫'){
if($pw == '123'){
echo "歡迎".$id;
}else{
echo "密碼錯誤";
}
}else{
echo "帳號錯誤";
}
?>
可以等價交換成下面的樣子
<?php
extract($_GET);
if($account == '史蒂夫'){
if($password == '123'){
echo "歡迎".$account;
}else{
echo "密碼錯誤";
}
}else{
echo "帳號錯誤";
}
?>
稍微解釋一下,不管 POST 或是 GET,對 PHP 來說都是一個集合陣列資料(在 Java 裡面類似 map ,Python 裡面類似 dictionary),extract 這個 function 會把集合中的 key 值直接變成變數名稱,value 則是變成變數值。對於 POST 或是 GET ,集合陣列中的 key 值會是 html 表單中的 name。
如果 extract 這個方法用得不好會出現一些問題。看一下例子
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<form method="post" action="Foo.php">
<label for="user">Name:num =</label>
<input type="text" name="num" placeholder="任意字串"><br>
<input type="submit" name="submit" value="送出">
</form>
<img src="">
</body>
</html>
PHP 的部分是這樣
<?php
$num=10;
echo "extract前的num為:".$num."<br>";
extract($_POST);
echo "extract後的num為:".$num."<br>";
?>
用這個 PHP 比較一下 extract 前後 num 變數的變化,結果如下
如果直接使用 extract 的話,已經存在的變數會被取代。Σ(*゚д゚ノ)ノ
所以最好在使用的時候,加上下面幾個參數,大概列出幾個常用的。寫法會像這樣extract($_POST,參數)