iT邦幫忙

0

PHP 變數問題

php

我寫了一個下拉式選單(程式碼如下),想請教在選擇完開始執行跳頁,我該如何再test.php取得這個@$number變數;這有需要用到資料庫嗎?

<html>
<body>

<div style="text-align:center;">
<form action="c.php" method="post">
	
	
	
	選擇使用者:
	<select name="number">
		<option value="0">請選擇</option>
        <option value="1">黃</option>
		<option value="2">吳</option>
		
    </select><p/>
	
	<input type="submit" value="提交"/>	<hr/>
	
</form>
</div>

</body>
</html>

<?php
#使用者變數
@$number = $_POST["number"];

if ($number == "1"){
		header ("location:/test/test.php");
	}
	else if ($number == "2") {
		header ("location:/test/test.php");
	}	
?>
0
dragonH
iT邦超人 5 級 ‧ 2019-12-14 22:29:03

阿怎麼不直接 post 到 test.php 就好

然後用取 post 的取法就可以了

你那判斷直接在 test.php 寫就好了吧

liu1257cc iT邦新手 5 級 ‧ 2019-12-14 22:37:56 檢舉

直接post到test.php我是寫好了,但是想說寫在不同頁試試看,還是說不能這樣或是多此一舉呢?

dragonH iT邦超人 5 級 ‧ 2019-12-14 22:40:12 檢舉

我覺得是多此一舉

在你的 c.php 只有那個判斷的情況下

真要這樣

改用 get 傳值應該是最簡單的

1
小魚
iT邦大師 1 級 ‧ 2019-12-14 22:54:54
  1. 執行跳頁之後無法抓到原本的變數值
  2. 你可以用Get或Post的方式取值, Get比較方便, Post比較安全一點點.
0
淺水員
iT邦研究生 4 級 ‧ 2019-12-14 23:18:19

雖然跟問題沒有直接關係,但有兩點我覺得滿重要的想說一下:

  1. 送 header 必須在任何輸出之前,也許在自己的電腦沒問題,那是因為根據設定 PHP 有緩衝,但滿容易在不同的環境下出問題的。也就是說上面程式碼,php跟 html 的順序應該要交換。
  2. 不要用 @$number = $_POST["number"]; ,可以用 isset 去偵測是否有值。例如:$number = isset($_POST["number"]) ? $_POST["number"] : false;

後續補充

(以下於可樂快跑提醒後補充)

上面取值的方式比較舊,在取完值後一般還要做一些過濾處理,因為「凡是從前端送來的資料是不可信賴的」。
今天發現 PHP 有 filter_input 這個函式,可以同時「檢查資料是否存在」、「過濾」、「取值」。
例如上面可以寫成:$number = filter_input(INPUT_POST, "number", FILTER_VALIDATE_INT);
這時 $number 將會是:

  • 數字:正常取值,注意這邊是數字而不是字串了
  • FALSE:POST 來的資料不是數字
  • NULL:沒有 POST 這個參數

詳細用法可參考 https://www.php.net/manual/en/function.filter-input.php

0
浩瀚星空
iT邦超人 1 級 ‧ 2019-12-14 23:28:50

為何都沒有人先告訴他。用@會不回報錯誤。
他知道@是幹嘛用的??

然後表單傳送給c.php。在test.php接的到值??

這已經是基本觀念沒有的問題吧??
居然還會吐出「需要用到資料庫嗎?」的話出來??

雖然明白你是初學者。不過這個問題要直接給你答案也沒難度。
只是,看你現在完全不知道表單,前端、後端。
給你答案後將會再延伸更多的問題。

看更多先前的回應...收起先前的回應...
liu1257cc iT邦新手 5 級 ‧ 2019-12-15 00:05:45 檢舉

我真的是初學者不好意思,當初看到出錯上網查過後發現他的變數前面加了@所以才以為可以這樣加

liu1257cc iT邦新手 5 級 ‧ 2019-12-15 00:18:40 檢舉

我當初是出現這個問題 Notice: Undefined index:

我參考了這個http://alfredwebdesign.blogspot.com/2013/05/php-notice-undefined-index.html

前制一個@是給php不回報這一行程式碼的任何錯誤。
但這是不正規的寫法。也很容易造成未來除錯的問題。

一般php在7版後就嚴格執行標準的參數宣告。
一般是搭配isset處理。

現在新的做法比較偏向post get值模組處理。再模組做一些機制。
會變成如

$name = $this->input('name');

這樣的寫法。

當然,初學者可以對於物件導向之類的東西不了解。
暫時先使用isset的方式處理。

或是用7版新的三元存在判斷式 ?? 或是三元判斷式 ?:
來做處理。

用@的方式是很不好的行為。大多數來說會用@的地方,大多數都是用在一些特規函數處理。
要不然就是承認自已很懶,不想規劃程式才會這樣做。
ps:我承認,有時小程式確實很懶,不想寫判斷模組,會用一下@

@ <== 建議無論如何都要強迫自己禁止使用他。
對此有需要錯誤處理的,請用try...catch...

沒物件觀念的人。還是先讓他慢慢學吧。
一下子跳級會死人的。

0
ckp6250
iT邦研究生 3 級 ‧ 2019-12-15 05:48:56

不要用 @$number = $_POST["number"]; ,可以用 isset 去偵測是否有值。例如:$number = isset($_POST["number"]) ? $_POST["number"] : false;

  在 php7.4 底下,可以寫成

$number = $_POST["number"] ?? false ;

  我覺得很爽,程式碼像女人的裙子,越短越好嘛,可是,我們家工程師不以為然,他說不太直觀。

看更多先前的回應...收起先前的回應...
淺水員 iT邦研究生 4 級 ‧ 2019-12-15 12:30:41 檢舉

我也滿喜歡這個的,應該有到php7就有了吧,我的版本還在7.1。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-15 13:40:55 檢舉

https://kinsta.com/blog/php-7-4/

按文章說,是 php7.4才有,
和 mysql 的 ifnull() , 有異曲同工之妙。

??只要7版就可以使用了。包含了新的?:簡用法。都是在7版的。
並不是7.4才有的。

不過拿ifnull比較怪怪的。雖然也不能說不對。
我倒是想將它做為?:的進化版會比較貼切。
畢竟原本以前的寫法會是 isset($c) ? $c : 'n'
要用簡寫法 isset($c) ?: 'n' 這樣子好像也不對。
才會衍生出 ?? 的寫法的。

其實??的寫法是為了要應用

isset($c) ?: 'n' 

沒辦法這樣直接簡寫化使用。才生出來??的替代用法。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-15 14:54:12 檢舉

受教了!
我以前不知道這個寫法,是看了那篇文章才知道,以為 7.4 才有。

好吧!我的話就一件事………
誰准你們直接去拿$_POST的值的???
懂的人就知道我在指什麼了。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-15 17:47:23 檢舉

報告 cola 大大
我不懂您在指什麼?
可以多開一下金口嗎?或者,指點一下,要去 google 什麼關鍵字?

這我沒辦法。
如此嚴重的問題,會在連基本層面都不曾想過的話。
恐怕只是單純的運氣好而已。
而且我有把握直接點名:
浩瀚星空
小魚
阿展展展
甚至是在這個問題上除了你之外的其他回答的人。
都知道我指的是什麼事情。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-15 19:58:44 檢舉

  承認不懂對我來說,並不會難於啟齒,其實,有時,我也知道自己問的問題很愚蠢,不過,看到自己不懂的東西,卻要裝懂不問清楚,我覺得更是無可救藥。

  聞道有先後,術業有專攻,我現在不懂,但總有一天,我也會懂,就是虛心學習就對了。

  賢愚不肖,資質各有不同,我不頂聰明,領悟力自然不及眾人。

  我再去 google 看看吧。

/images/emoticon/emoticon46.gif不要吵架

阿展展展
沒有在吵架啦

ckp6250
不過……我並不喜歡把已經屬於「常識」等級的東西還要提點出來。
這根本上跟資質已經沒有任何關係了。
再者,我想我說過了,不改變說話的方式,除了讓人看的很痛苦。
思想絕對性質的守舊,不會有多大前進的動力。
想進步,就如我說的,少一點賣弄文墨,多一點理性感性。
最重要的:多學學年輕人在「搞」些什麼。
假如你是個從來不打game的人。
就從這個時候開始狂打game吧!
如果是個從來不看漫畫的人。
也從這個時候開始狂看現代的漫畫吧,尤其是那一堆異世界的。

淺水員 iT邦研究生 4 級 ‧ 2019-12-15 22:55:24 檢舉

之前都是先拿出來丟到 filter_var
(更早之前是自己寫 filter 函式)
今天才知道有 filter_input

不過樓主只是比對字串,沒 filter 會有問題嗎?

淺水員
細微的事,從小處做起,總比日後再來學來得好。
就算他不是很清楚,至少先讓他知道:這在很多情況下是有危險性的。
現在的學習不比早年的學習模式了。
有太多的東西幾乎都要當成是基本配備才行。

淺水員 iT邦研究生 4 級 ‧ 2019-12-16 00:06:18 檢舉

感謝可樂,我補充在先前的回答好了。

@ckp6250
去上面看一下我回給他的話。
我已經建議post get值透過模組處理。
不過我倒是沒很明說就是了。

我跟叔叔不太一樣,比較不會說到更多要注意的地方。
因為這樣子要說的東西太多了。
所以我會選重點講而已。

不直接使用其一是防注入,其二是防改變程式。最後是防刷。
不過倒是很少人會做防刷就是了。(我自已是有做處理)

簡單來說,無法掌挃來源的外來變數。一般都最好洗過一偏後再給程式取用。
千萬不要直接使用。免得被攻到不要不要的。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-16 11:59:36 檢舉

感恩。

不直接使用其一是防注入,其二是防改變程式。最後是防刷。

  我約略知道問題在哪裡了,我所有的 sql 運作都吃同一段函數,我先由這兒下手。

  千瘡百孔,一個洞一個洞仔細補。

  至於【防刷】?我再去研讀文章。

其實如果學框架。就可以將這些事交給框架來幫你了。

防刷是比較不常防護的機制。
因該很少人會去處理。我也是只有少少的部份才會處理這些。

ckp6250 iT邦研究生 3 級 ‧ 2019-12-16 15:15:02 檢舉

  框架正在學,也沒法學那麼快,但舊系統已經穏定上線中,也不太可能直接轉換過去。

  不過,這幾個必要的防範工作,是應該立即進行。

 再三感恩。

我要發表回答

立即登入回答