iT邦幫忙

0

初學簡易PHP FORM POST 問題

我執行發生一個問題是:
其中這個變數$ckname=$_POST["ckname$p"]
在第一個判斷式中是可以正確讀取到資料

if($ckname!=NULL&&$gnid!=NULL){ //檢查不為空值

$query_insert = "INSERT INTO  `vdname` (`vnid`,`vname`,`vgroup`,`type`,`enumber` )
    VALUES ('".$gnid."',  '".$ckname."',  '".$_POST["ckgroup$p"]."',  '".$_POST["cktype$p"]."',   '".$_POST["cknum$p"]."')";
    mysql_query($query_insert);
	
	 header("location:npvdn.php?nid=$gnid");}

但是在更下面的query或者再下面的判斷式都抓不到變數$ckname=$_POST["ckname$p"]
請問有人知道為什麼嗎???

*主要問題是明明都在同一個FOR迴圈但是前面可以抓的到$ckname變數後面抓不到 *

以下是完整CODE

//執行POST後的動作	
if(isset($_POST["action"])&&($_POST["action"]=="join")){

for($p=1;$p<=50;$p++){//迴圈跑50次
$gnid=$_GET["nid"];
$ckname=$_POST["ckname$p"];

if($ckname!=NULL&&$gnid!=NULL){ //檢查不為空值 這個地方是可以抓到變數$ckname

$query_insert = "INSERT INTO  `vdname` (`vnid`,`vname`,`vgroup`,`type`,`enumber` )
    VALUES ('".$gnid."',  '".$ckname."',  '".$_POST["ckgroup$p"]."',  '".$_POST["cktype$p"]."',   '".$_POST["cknum$p"]."')";
    mysql_query($query_insert);
	
	 header("location:npvdn.php?nid=$gnid");}


//以下搜尋或判斷都抓不到變數$ckname,都是NULL的
$query_user = "SELECT * FROM `vdname` WHERE `vnid`=$gnid AND `vname`=$ckname ";
$user=mysql_query($query_user);

if (mysql_num_rows($user)>0){  header("Location:npvdn.php?errMsg=1&vname=$ckname"); }


elseif($gnid==NULL||$ckname==NULL){ header("Location:npvdn.php?errMsg=2&nid=$gnid&vname=$ckname"); 	}

}}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-02-19 09:02:37
最佳解答

參考看看
是否可能改寫成「傳陣列」的方式
範例如下:

Example pseudo code:

Many web sites do this:

<form ....>
<input name="person_0_first_name" value="john" />
<input name="person_0_last_name" value="smith" />
...

<input name="person_1_first_name" value="jane" />
<input name="person_1_last_name" value="jones" />
</form>

When they could do this:

<form ....>
<input name="person[0][first_name]" value="john" />
<input name="person[0][last_name]" value="smith" />
...
<input name="person[1][first_name]" value="jane" />
<input name="person[1][last_name]" value="jones" />
</form>

With the first example you'd have to do string parsing / regexes to get the correct values out so they can be married with other data in your app... whereas with the second example.. you will end up with something like:
<?php
var_dump($_POST['person']);
//will get you something like:
array (
0 => array('first_name'=>'john','last_name'=>'smith'),
1 => array('first_name'=>'jane','last_name'=>'jones'),
)

資料來源

另外有一點我不明白
如果在迴圈裡的讀的到值
你原本期待$ckname=$_POST["ckname$p"]這列執行 50 次
讀到的是「相同的值」還是「不同的值」?
如果是
相同的值-->把這列搬到迴圈之外(前面),讀一次就好
不同的值-->改成「傳陣列」的寫法

yhn2880 iT邦新手 5 級 ‧ 2021-02-19 11:45:29 檢舉

明瞭 已解決 感謝!!!

0
EN
iT邦好手 1 級 ‧ 2021-02-18 17:38:57

因為你將整串 SQL 都用雙引號包覆,變數的值沒有被帶進去,你可以利用 . 將字串跟變數隔開,或是用 "{$var}" 的方式。

請參考連結

像是把

$query_user = "SELECT * FROM `vdname` WHERE `vnid`=$gnid AND `vname`=$ckname ";

變成

$query_user = "SELECT * FROM `vdname` WHERE `vnid`={$gnid} AND `vname`={$ckname} ";

PS: 我不太會寫 PHP ,有錯誤還請不吝指教。

看更多先前的回應...收起先前的回應...
yhn2880 iT邦新手 5 級 ‧ 2021-02-18 18:24:38 檢舉

可是我之前一樣的寫法可以成功耶 換成這個頁面就不行!看好久就是看不出來差異在哪,我改用括號起來還是讀到空值耶 試了很多種方就是無法讓

$query_user = "SELECT * FROM `vdname` WHERE `vnid`={$gnid} AND `vname`={$ckname} ";

elseif($gnid==NULL||$ckname==NULL){ header("Location:npvdn.php?errMsg=2&nid=$gnid&vname=$ckname"); 	}

讀取到$ckname的值 讀到的都是空的
只有在

if($ckname!=NULL&&$gnid!=NULL){ //檢查不為空值 這個地方是可以抓到變數$ckname

$query_insert = "INSERT INTO  `vdname` (`vnid`,`vname`,`vgroup`,`type`,`enumber` )
    VALUES ('".$gnid."',  '".$ckname."',  '".$_POST["ckgroup$p"]."',  '".$_POST["cktype$p"]."',   '".$_POST["cknum$p"]."')";
    mysql_query($query_insert);
	
	 header("location:npvdn.php?nid=$gnid");}

這邊是正常可以判斷使用的
還是在迴圈中要換其他種寫法呢?
謝謝

EN iT邦好手 1 級 ‧ 2021-02-18 18:34:23 檢舉

yhn2880
這個檔案是 npvdn.php 嗎?
你在第一塊執行完下了

 header("location:npvdn.php?nid=$gnid");

進行轉址,在這邊你有將 $gnid 重傳,但 $ckname 沒有重傳阿阿,所以不存在是正常的 XD

yhn2880 iT邦新手 5 級 ‧ 2021-02-18 19:00:41 檢舉

可是我就算把

if($ckname!=NULL&&$gnid!=NULL){ //檢查不為空值 這個地方是可以抓到變數$ckname

$query_insert = "INSERT INTO  `vdname` (`vnid`,`vname`,`vgroup`,`type`,`enumber` )
    VALUES ('".$gnid."',  '".$ckname."',  '".$_POST["ckgroup$p"]."',  '".$_POST["cktype$p"]."',   '".$_POST["cknum$p"]."')";
    mysql_query($query_insert);
	
	 header("location:npvdn.php?nid=$gnid");}

這整段的CODE都刪掉 也讀不進去上面說的那兩個搜尋
等於說不管我有沒有這段
問題好像都出在讀不進去的那段code 但不知道為何讀不到

EN iT邦好手 1 級 ‧ 2021-02-18 19:20:33 檢舉

yhn2880
我先釐清一下:
想請問這段程式碼為何要執行迴圈?
以及該程式的用途及行為是什麼?謝謝

yhn2880 iT邦新手 5 級 ‧ 2021-02-18 20:41:02 檢舉

迴圈是因為我每個類別可能有1~50個廠商會列出來(列出的方式是用AJAX回傳DOM格式)
目的是為了選取分配哪個廠商配合哪個工程再新增做列表如下圖所示
https://ithelp.ithome.com.tw/upload/images/20210218/20134470TPP3id0HLE.png
selest option的部分是選到後下面就會AJAX列出幾個廠商(checkbox)
然後我再依照選擇到的checked去做POST 新增進資料庫
目前新增都是可以正常
只是我想加入一些判斷
1.只輸入工程沒選擇廠商 則判斷錯誤
2.已經新增過的 則判斷錯誤
上面程式碼就是想加入這兩個判斷但是無法存取到$ckname變數

EN iT邦好手 1 級 ‧ 2021-02-18 23:31:57 檢舉

yhn2880
像你這樣做 50 次 Query 非常慢且 mysqli 已經被大家建議棄用 (安全性問題)。
建議你去看看 PDO ,相信你會找到更好的做法。(像是: 把查詢的資料放進 Array 再用迴圈帶出來)

yhn2880 iT邦新手 5 級 ‧ 2021-02-19 00:34:52 檢舉

好的我再研究PDO 謝謝 但我還是想不出來我上面寫得為何讀不到變數的BUG

EN iT邦好手 1 級 ‧ 2021-02-19 08:53:37 檢舉

yhn2880
我想你接收 POST 參數的函式應該放在迴圈外面。

我要發表回答

立即登入回答