iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
自我挑戰組

大學 50 萬貸款的交代系列 第 12

Day 12 _ 小心燙口 extract function

  • 分享至 

  • xImage
  •  

科技始終來自人性,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,參數)

  • EXTR_SKIP 忽略已存在的變數
  • EXTR_PREFIX_SAME 如果有已存在的變數,則在新的變數加上前缀字
  • EXTR_PREFIX_ALL 所有新加入變數都有前缀字


上一篇
Day 11_如何從 XSS 惡夢中醒來
下一篇
Day 13 _ SQL 介紹
系列文
大學 50 萬貸款的交代30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言