PHP 板


LINE

看板 PHP  RSS
※ 引述《andreli (推銷相簿中!!)》之銘言: : http://saygosh.com/homework/num/square.php : 這個程式是一個高斯消去法 : 我想了很久也想不透為什麼在我電腦測試的時候會出現 : Notice: Undefined index: a34 in D:\webs\phptest\square.php on line 205 : Notice: Undefined index: a24 in D:\webs\phptest\square.php on line 216 : Notice: Undefined index: a14 in D:\webs\phptest\square.php on line 216 : 不過我直接在相同的地方使用echo $_POST['a34']; : 確實有值存在 : 我用$_POST["a".$row.$column]卻沒有辦法... : 相同的程式碼,直接使用隨機的可以執行無誤, : 使用上傳的檔案,我想分析的部分應該沒錯,因為他也跑的出高思消去法 答案揭曉.... (我居然花這麼多時間搞這個.. 果然對常犯錯誤不太有 sense XD) 這個程式大致上的流程是 1) 判斷資料是來自 POST 輸入數字, 或是 POST 上傳檔案 2) 若為數字, 跳到 4 3) 若為檔案, 則將檔案內容讀入 $_POST 中 (column, row, a11 ~ a34) 4) 根據 $_POST['aXX'] 以高斯法消去 5) 將消去後的方程式求出解. 這個程式主要出問題的那幾行內容大概像是這樣: $x[$w]=($_POST["a".$row.$column]) / ($_POST["a".$row.$w]); ok, 為什麼會有問題呢 ? 在上傳檔案時, $row, $column 直接來自檔案之中, 而看起來又像是 a34, 但直接以之當作 key 傳入, 又可以得到我們要的資訊. 所以問題到底出在哪邊 ? 不會是 php 的 bug 吧 (_POST 不給寫入 !!??) 結果當我把這行先手動處理成 $a = sprintf("a%1d%1d", $row, $column) 或是 sprintf("a%1s%1s", $row, $column) 卻都能正常運作. 開始有人猜到了吧... $row 和 $column 的型態都是字串... 公布謎底: $row 和 $column 是從檔案中利用 file() 直接讀入, 也沒有轉型成數字. 因此當 php 被要求以 . 處理這些變數時, 就被直接以字串型式引入了. $row 是 String(1) "3", 但 $column 是 String(2) "4\0x0A" 就是那多出來的 0x0A 把 $_POST 的 key 弄壞掉. 為什麼在計算過程中都沒出事呢 ? 因為其間你都是拿數字運算子丟給它, 那麼這兩個變數 (其實還有所有的 aX4) 都會被當作變數. 其中 aX4 的值都會被覆寫 (而成為數字), 剩下 $column 來變成 bug. 所以寫 php 請千萬注意以下幾點: 1) 縮排要縮好: 沒有人規定必需怎麼作, 但以一種易讀的, 一致的風格書寫, 能讓自己或別人 debug 時輕鬆許多. 2) 變數名不要亂取: 除了 $row, $column, aXX, $matrix 以外, 我都看不懂 XD 3) 盡量將 php code 與 HTML code 分開, 沒事插一堆 <?php ?> 在函式裡很煩. 雖然 manual 有建議將需要程式判斷的大量輸出放在 ?> .... <? 之間能夠節 省時間, 不過這樣的 coding style 真的很難看 >_< 4) 將需要先行判斷的 php code 放在檔案的最開頭是種不錯的主意, 但請記得 html 4.0 的規定是 "把 <!DOCTYPE ... " 放在第一行. 仔細看看底下的 code 就會知道我在講什麼了 (綠色的字代表 parse 過後的行數) <?php // 點點點 // 毛毛毛 ?> 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 5) 註解最好夠多, 至少要夠精要. 不要寫廢話, 例如 $fp = fopen("aaa.txt") ; // 讀檔案 <- 難不成是吃麻糬嗎 XD 6) 即使 php 的型態很軟弱, 你還是要注意它. 7) 任何來自 user input (file, Request ...) 的資料都需要特別注意. 8) 無論用 fgets(), file() 你都會把換行字元吃到裡頭, 順手 trim() 一下吧. -- 鬼壓床怎麼辦 騎上去啊 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.217.134







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP