Re: [請益] 用fgetcsv讀到"0001"時會變成"1"的字串

看板PHP作者 (丁丁)時間16年前 (2009/05/16 01:18), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《bil193 (丁丁)》之銘言: : 標題: [請益] 用fgetcsv讀到"0001"時會變成"1"的字串 : 時間: Thu May 14 18:02:34 2009 : : 我有一個csv檔,內容是: : : 79,"新人","0001","1234","100","099816" : : 用$fp=fopen(....)開檔後, : : 用 : : list($sn,$name,$schoolID,$passwd,$grade,$phone)=fgetcsv($fp,1000) : : 把這些資料存進變數裡 : : 但是調查了很久,發現fgetcsv在讀"0001"後存給$schoolID, : : 結果會變成「$schoolID的型別為string,內容是1」 : : : 上網找了好多資料,還是想不到這個解決辦法 : : 請問該怎麼讓fgetcsv在讀"0001"時,就讓它判定為"0001"而不是"1"呢? : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.113.98.166 : 推 liaosankai :settype($schoolID,'integer'); 05/14 19:37 : → bil193 :$schoolID最後的型別是要string,問題好像出在 05/14 21:03 : → bil193 :fgetcsv讀到"0001"時 先轉成int成1,再轉成 05/14 21:04 : → bil193 :string成為"1" 再把它存進$schoolID裡... 05/14 21:04 : 推 lgzenith :不要用fgetcsv,改用fgets不就好了 05/15 19:10 : 推 PHP5 :樓上知道 fgetcsv 和 fgets 的差別嗎? 05/15 21:56 : 推 HuangJC :呵,省事吧;學 C 時所有指令都從 byte 打造;雖然有標 05/15 22:45 : → HuangJC :準函式庫,但教基礎打造的書還是很多,且函式庫如果附 05/15 22:45 : → HuangJC :source code,的確就是那樣;但 C 是 Compile 語言,不 05/15 22:46 : → HuangJC :會損失速度,PHP 也打造的話就吃虧了 05/15 22:46 花了好多時間trace code,突然發現不是fgetcsv讀錯,是我在用==時出了問題。 fgetcsv讀到"0001"這個字串,仍會把它當"0001"存給$schoolID, 而$schoolID的型別也是'字串' 不好意思讓各位先進費心了> < 後來發現問題其實是比較"0001"跟"1"時, if("0001"=="1") 這樣會變成if(true) 在PHP論壇查到,PHP會把'數值內容的字串'轉型成數值,再來比較,就造成了誤判 解決方式是用"==="(三個等號)代替"==" 或是用字串比較函數:strcmp(string1,string2) 小弟後來都用strcmp,就都沒問題了 分享給大家。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.91.19

05/18 22:13, , 1F
如果你有寫過C看到字串應該就不會直覺想用'==' XD
05/18 22:13, 1F
文章代碼(AID): #1A3QFZbW (PHP)
文章代碼(AID): #1A3QFZbW (PHP)