PHP 板


LINE

看板 PHP  RSS
※ 引述《orz811017 (orz811017)》之銘言: : http://ppt.cc/OtRM : 這圖中為什麼 前者的 valeue->row[0] 會錯誤 : Catchable fatal error: Object of class stdClass could not be converted to : string 以這個例子來說,PHP 認定成 "$value->$row[0]" 一個 兩個 而不是 "$value->$row[0]" 一個變數 但是 $value 是沒辦法轉換成字串的物件,所以 PHP 就生氣了。  這個切字串的判斷也是很合理的 如果今天寫 code 的人真的要輸出「XXX->OOO」這個字串,應該也會寫成這樣... 這部份的處理方法就如同上面推文,改成 "{$value->$row[0]}" 就可以解決了 這樣 PHP 才知道正確的斷點在哪裡 然後針對這段 code 提出一點其他的建議 1. 資料欄位名稱盡量不要用中文,偶而會發生靈異現象,像是 http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=2328 http://www.dotblogs.com.tw/bruce655/archive/2012/05/30/72480.aspx 雖然沒碰到問題的話就沒問題... 2. 任何變數餵進 SQL 之前都要作過 Escape,例如 "SELECT * FROM `company` WHERE name = '{$name}'"   如果今天要查白蘭氏而輸入了「Brand's」,那就會組合成 "SELECT * FROM `company` WHERE name = 'Brand's'" ^^^ 這個地方會有 SQL 錯誤 如果你用 mysql_query() 來查資料,那麼正確的作法是用 mysql_real_escape_string() 把輸入值洗過一次,例如 "SELECT * FROM `company` WHERE name = '".mysql_real_escape_string($name)."'" 組出來的 SQL 會是 "SELECT * FROM `company` WHERE name = 'Brand\'s'" ^^ 這個單引號被跳脫掉了 可能有人說用 addslashes() 可以作類似的事情,但是不要這麼用[汗] 用 mysql_query() 來下 SQL 的時候,你只應該用 mysql_real_escape_string() 沒有其他選擇 3. 請愛用 sprintf(),尤其是你想要作 2. 的時候。例如可以把 2. 的 SQL 改寫成 $sql = sprintf( "SELECT * FROM `company` WHERE name = '%s'", mysql_real_escape_string($name) ); 或者更長一點的例子 $sql = sprintf( "SELECT * FROM `company` WHERE name='%s' AND type='%s' AND address='%s'", mysql_real_escape_string($name), mysql_real_escape_string($type), mysql_real_escape_string($address) ); 原文的例子就更明顯了,我個人覺得這比全部寫在一起更容易閱讀... -- 「是大環境要求的~畢竟沒有總受就沒有故事~╮(╯_╰)╭」 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.27.61.221
※ 文章網址: http://webptt.com/m.aspx?n=bbs/PHP/M.1401730903.A.858.html ※ 編輯: GALINE (114.27.61.221), 06/03/2014 02:04:54
1F:→ danny8376:雖然改用mysqli/pdo 然後用prepare比escape來得好www 06/03 02:39
2F:→ MOONRAKER:中文屬性名沒有碰過 但是有碰過數字屬性名 06/03 09:48
3F:→ MOONRAKER:寫成 $object->{1}->子屬性 才能讀取 XP 06/03 09:49
4F:→ MOONRAKER:來源應該是從XML或JSON轉過來的… 06/03 09:50
5F:→ GALINE:以這個例子連欄位名稱都是變數(這也是壞味道...) 06/03 13:59
6F:→ GALINE:prepared statement *好像*沒辦法處理的樣子,不太確定 06/03 13:59
7F:→ Darkland:prepared statement 可以阿. 他就是讓你把 query 跟 參數 06/03 21:07
8F:→ Darkland:切開,避免參數被當作語法的一部分,所以只要參數最後是 06/03 21:07
9F:→ Darkland:個值,長的再奇怪都可以. 06/03 21:08
10F:推 orz811017:這篇收益良多 謝謝大大!! 06/05 10:54
11F:→ orz811017:欄位名稱用變數 是因為想要嘗試用LOOP寫好完整的指令 06/05 11:13
12F:→ orz811017:(自己有點懶) 而且其他地方也會用到相同的欄位名稱 06/05 11:13
13F:→ orz811017:就想說乾脆全部設為變數比較方便 06/05 11:14







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燈, 水草

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

TOP