台灣最大程式設計社群網站
線上人數
780
 
會員總數:244580
討論主題:188713
歡迎您免費加入會員
討論區列表 >> PHP >> 子父頁面傳值問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
子父頁面傳值問題
價值 : 90 QP  點閱數:261 回應數:16

樓主

Sanji
門外漢
0 34
513 78
發送站內信

各位大大好
小弟從上頭拿到一個問題程式要修正
小弟最近碰到個問題想問各位大大
就是小弟要點選查詢會跳一個新視窗也就是子頁面(person_sel.php)來給我選取資料
可是出現一個奇怪的現象
由於我是要動態決定父頁面的資料數 也就是$n(總數) 而序次就是$i(0 1 2 3...)
但當我資料數大於1筆時 我的結果都是對的 程式不會有任何差錯
但當我的資料是1筆時 程式卻會掛掉
以下的程式都省略了一些變數 而裡面出現的變數都有值 不會是那邊有問題
小弟很好奇1筆 和 1筆以上的資料差別到底是什麼....
感謝各位大大

父程式碼如下:




這是子程式發生問題的code(寫在JS中):


搜尋相關Tags的文章: [ PHP ] , [ JS ] , [ javascript ] , [ html ] ,
本篇文章發表於2019-04-13 23:16
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

彩虹
檢舉此回應
畫面上有顯示什麼錯誤嗎?
從畫面上顯示的錯誤訊息是最容易檢查

另外我先不管你資料多筆或單筆

windows.open() 這邊一直以來都是錯誤的
「ORDERS2」 後面你多了一個單引號,你應該能從編輯器看出來顏色後面斷掉了

person_sel.php?dosts=getpk&dosrc=ORDERS2'&chkfield...後面省略 (錯誤)
person_sel.php?dosts=getpk&dosrc=ORDERS2&chkfield...後面省略 (正確)


本篇文章回覆於2019-04-14 10:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Sanji
檢舉此回應
回彩虹大大
先感謝大大的回答
那個open那邊的連結是因為我有先刪一些參數才貼上來 多刪了一個 抱歉
問題不是這邊

至於畫面上沒有呈現什麼錯誤
我測試過 就是JS 的function掛掉了
我有看過opener.document.form1.elements['id_no'][<?php echo $rowsid ?>].value
在單筆資料下是undefined的
但是在多筆的時候卻是有的
而且更奇怪的是
單筆資料的時候opener.document.form1.elements['id_no'][<?php echo $rowsid ?>] 卻是object

是不是這語法在IE版本上有差異呢
本篇文章回覆於2019-04-14 23:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
你的程式碼內,看不到你的資料來源情況。
不過從你的寫法來看。我認為你可能是碰上了key值0的判斷問題。

這是新手很常犯的毛病。但因為看不到你的資料來源是否有犯了這樣的毛病。

但就具多年來的經驗來看。一筆才會出現問題的情況。大多數碰到的都是陣列key值0的問題居多。
因為陣列的數位key值一定都是從0開始編號。對我們來說,有0的話就代表一定是有資料。
但對程式來說,0就是等於偽值的意思。所以在判斷式上要特別的小心。

目前能給你的建議可能性是如上了。你可能要查一下你的資料來源。
因為你說明的東西的確很有可能是這樣的問題。
本篇文章回覆於2019-04-15 10:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

彩虹
檢舉此回應
因為你貼的程式碼真的很“片段”,並不是整體的,甚至可能你有自己刪掉一些

但我發現到 $n 是你的總筆數
可是你在 <img> 裡的 onclick DoPersonSel() 裡面,有這樣子的判斷 「($n > 1)? $i : ""」
onclick="DoPersonSel('id_no','<?php echo ($n>1)?"$i":"" ?>');"

所以當 如果資料是 1 筆「$n 為 1」的情況下,是不會進入條件的
你試試看把 「$n > 1」 改為 「$n > 0」


我想這邊可能是出錯的原因
本篇文章回覆於2019-04-15 12:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Sanji
檢舉此回應
感謝兩位大大回覆
因為關聯的程式太多 我怕都貼會太花版面 不好意思
回星空大大
您說的這兩句話
"因為陣列的數位key值一定都是從0開始編號。對我們來說,有0的話就代表一定是有資料。
但對程式來說,0就是等於偽值的意思。所以在判斷式上要特別的小心。"

是代表opener.document.form1.elements['id_no'][<?php echo $rowsid ?>]
當$rowsid為0時也就是opener.document.form1.elements['id_no'][0]時
程式會判斷他是false 所以沒辦法抓到他的值?

回彩虹大大
由於這隻不是我寫的 我不確定是不是跟id 或 name的命名也有相關
$n確實是總筆數沒錯 抱歉我沒補充
原本$n > 1的用意看起來是要傳$i (也就是 0 1 2 3)
但當只有一筆時 是不傳遞值的
id_no 和 person_name 的id 都是沒有數字的
這是我的想法
本篇文章回覆於2019-04-15 21:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

彩虹
檢舉此回應
...傻眼,就是那邊有問題呀.................

所以我才請你把「$n > 1」 改為 「$n > 0」,可以先試試看再說嗎

會請你改這樣是有原因的,因為那邊邏輯就有錯誤,也是新手常犯的錯




本篇文章回覆於2019-04-15 22:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

彩虹
檢舉此回應
話說~你其實不用強調「這支不是你寫的」,因為更不可能是我們寫的。
另外如果你下次還有問題發問,請把程式碼整理好再貼上來(不管是不是你寫的)
============================
回歸話題
你都知道「資料只有單筆」時會掛掉了
何謂只有單筆? 代表 $n = 1
但是這邊卻拿「$n>1」來做判斷
錯誤: DoPersonSel('id_no', '')
正確DoPersonSel('id_no', '0')
所以改成 「$n >= 1」或 「$n > 0」,這樣才能解決單筆的問題

只好幫你呈現一下範例
--------------------------------------------------------------
當資料只有1筆時 ($n=1)
($n>1) ? $i : ""; //不會印出東西,因為 $n=1,沒有大於 1
※※※進入第1迴圈 $i=0
<img onclick="DoPersonSel('id_no','')">
<input name="id_no[0]" type="text" value="<?php echo $pa[id_no] ?>" size="10" />
<input name="person_name[0]" type="text" value="<?php echo $pa[name] ?>" size="8" />

這時候你覺得按下 DoPersonSel 時,他會傳什麼資料過去('id_no','')? 當然出現undefined
--------------------------------------------------------------
當資料有2筆 ($n=2)
($n>1) ? $i : ""; //會印出$i,因為 $n=2,有大於 1
※※※進入第1迴圈 $i=0
<img onclick="DoPersonSel('id_no','0')">
<input name="id_no[0]" type="text" value="<?php echo $pa[id_no] ?>" size="10" />
<input name="person_name[0]" type="text" value="<?php echo $pa[name] ?>" size="8" />

※※※進入第2迴圈 $i=1
<img onclick="DoPersonSel('id_no','1')">
<input name="id_no[1]" type="text" value="<?php echo $pa[id_no] ?>" size="10" />
<input name="person_name[1]" type="text" value="<?php echo $pa[name] ?>" size="8" />
---------------------------------------------------------------

希望這樣子你有看懂我在說什麼

甚至其實裡面根本不需要判斷 $n有沒有大於1,因為會進入迴圈,表示有值

本篇文章回覆於2019-04-15 23:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
所以你還是沒搞懂我說的東西。
居然會認為 elements['id_no'][0] 會成為偽值。大大的理解錯誤。

一開始我就說了,資料來源的情況你所po的程式碼是看不到的。
所以我認為是你的資料來源那邊的程式碼發生問題。且可能是有判斷key值為0造成錯誤的可能性。

現在你說了$n就是總筆數。這才知道你實際的問題在哪。
也就是說
onclick="DoPersonSel('id_no','<?php echo ($n>1)?"$i":"" ?>');"

這一段堙A你的判斷式如果是沒超過1筆以上,就不會送i值進去。
說真的,搞不懂這邊的判斷是什麼就是了。為何要這樣判斷。
但這也解釋了為何你只要只剩一筆資料就會出錯的問題。
因為沒超過1筆的情況下,是不會請求到資料的。
本篇文章回覆於2019-04-16 09:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

Sanji
檢舉此回應
先感謝兩位大大
寫說聲不好意思麻煩您們了
因為我有先試過改成$n > 0或是把id 設成id="person_name[<?php echo $i ?>]"
結果是整個js就不會跑了
但是我用DoPersonSel('id_no', '') 就可以讓單筆資料的運作
所以我才想說是不是跟id 或是 name有關
本篇文章回覆於2019-04-19 00:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
因為沒有完整的程式碼,只能瞎子摸象了
把父視窗的
<input name="id_no[<?php echo $i ?>]"
改成
<input name="id_no[<?php echo ($n>1)?"$i":"" ?>]"
如果還不行的話再把
<input name="person_name[<?php echo $i ?>]"
改成
<input name="person_name[<?php echo ($n>1)?"$i":"" ?>]"
本篇文章回覆於2019-04-19 09:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

彩虹
檢舉此回應
首先$n > 0 是正確的,你應該往其他地方繼續 debug

你應該檢查只有一筆資料的時候
你的 $i 是不是從0開始

會不會 $i 你也包上 $n>1 的判斷,所以 $i 為空
或者你乾脆改寫
當只有一筆資料的時候,$i直接設定為 0

說真的你程式碼沒有全部貼上來,根本不知道你的迴圈到底寫了啥,還有 $i 到底是怎麼設定的

另外報錯的話,總會有錯誤畫面吧,你怎麼都不順便提供上來,截圖也好呀
你也可以用檢查工具,看一下 id name 是不是都正確

與其瞎猜,不如活用工具

再不行我看要遠端幫你寫了

這問題明明很好解決,就卡在你的基礎知識完全不夠,卻又有一套自己的想法(錯誤的觀念)
以至於到現在還沒解決
本篇文章回覆於2019-04-19 17:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

Sanji
檢舉此回應
感謝大大們不厭其煩地跟我解釋
小弟深感教誨
我把完整程式碼貼上

回彩虹大大
大大息怒 抱歉我自作聰明 我也覺得問題應該很好解決的 所以我try了好半天才鼓起勇氣上來問
事實證明我還是觀念不夠 真不好意思占用到大大們的時間
但是我還是想要搞懂
再請大大們指點

當中還是有很多外差的function


本篇文章回覆於2019-04-19 21:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

Sanji
檢舉此回應
上面那文的是主程式的code
而這篇的是person_sel的code


本篇文章回覆於2019-04-19 21:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

Sanji
檢舉此回應
這篇是person_sel_list

本篇文章回覆於2019-04-19 21:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

Sanji
檢舉此回應
這篇是_javascript_doiframe的code


本篇文章回覆於2019-04-19 21:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.