PHP 板


LINE

看板 PHP  RSS
※ 引述《cf1064 (蚵仔)》之銘言: : ※ 引述《heavenbetula (綠草)》之銘言: : : 小弟初學php,看書上範例不是很懂,想麻煩各位大大解惑 : : 以下是書中擷取的一小段程式: : : session_start(); : : if(!session_is_registered("userIP")){ : : session_register("userIP"); : : $_SESSION["userIP]=$this->getIP; : : $sql="update dailyistics set visitNum=visitNum+1 where visitDate='" . $setDate . : : "'"; : : mysql_query($sql); : : }else{ : : $_SESSION["userIP"]=$this->getIP; : : } : : 其中,getIP是一個function的名稱(有傳回值) : : 我的問題是,為什麼在做if判斷的時候,userIP都還沒有給值,卻可以做判斷呢? : : 因為不是在if中的$_SESSION["userIP] = $this->getIP,userIP才有值,那怎麼沒值可以 : : 先判斷? 由於程式執行後不是想要的結果,所以想再請教一下各位大大是否我哪裡觀念錯誤 以下是我的想法: 我將原文code中if(!session_is_registered("userIP")) 改成if(!isset($_SESSION['userIP'])) 第一次執行這個頁面的時候,由於$_SESSION['userIP']還未定義 所以isset()的結果為false,然後!後變成true→執行if內的動作$_SESSION['userIP'] 賦與一個ip的值 第二次之後執行這個頁面的時候,由於session的關係,$_SESSION['userIP'] 的資料還保留著,所以isset()的結果應該為true,然後!後變成false→執行else內的動作 但是問題來了...第二次執行,isset()的結果卻一直是flase 請問我哪裡理解錯誤嗎?為什麼isset()的結果會這樣? --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.9.104
※ 文章網址: http://webptt.com/m.aspx?n=bbs/PHP/M.1411654867.A.D67.html ※ 編輯: heavenbetula (61.231.9.104), 09/25/2014 22:22:06
1F:→ MOONRAKER: 在開頭加print_r($_SESSION)看裡面到底有什麼。 09/25 23:00
2F:→ MOONRAKER: 順便告訴你session_register()也過時了 本人從寫php以 09/25 23:00
3F:→ MOONRAKER: 來(大概是死亡筆記本連載的時候)從來沒用過這個函數 09/25 23:06
4F:→ heavenbetula: print_r($_SESSION)會Undefined variable: _SESSION 09/25 23:14
5F:→ MOONRAKER: 太誇張了 起碼要顯示 Array() 你session可能壞掉了 09/26 00:18
6F:推 up9cloud: 不要在開頭加,放session_start();之後一行... 09/26 05:40
7F:→ heavenbetula: 會顯示Array ( [userIP] => 127.0.0.1 ) 09/26 19:46
8F:→ heavenbetula: 而這不就表示我原先的想法應該是沒錯的吧... 09/26 21:28
9F:→ heavenbetula: userIP一開始未定義 第二次執行有定義而且有值了 09/26 21:28
10F:推 Kenqr: print_r(isset($_SESSION['userIP']))呢? 09/27 11:18
由於我的function都放在class中,所以測試print_r($_SESSION),和 print_r(isset($_SESSION['userIP']))時,$this->getIP都會跑出$this Undefined 所以我都會先把class砍掉,然後原本 $_SESSION["userIP"]=$this->getIP; 我會把他改成 $_SESSION["userIP"]= getIP();所以測試print_r($_SESSION)會顯示 Array ( [userIP] => 127.0.0.1,而測試 print_r(isset($_SESSION['userIP']))第一 次什麼都沒顯示,第二次執行會顯示 1 ,一切正常。 所以我在想是因為$this->getIP跟getIP()的問題嗎? ※ 編輯: heavenbetula (61.228.78.185), 09/27/2014 14:52:12
11F:→ KawasumiMai: 你貼的code是拿掉的情況,沒提到class的問題 09/27 15:59
12F:→ KawasumiMai: 所以現在的問題是,你class是怎麼寫的 09/27 15:59
13F:→ KawasumiMai: 如果getIP() 可以正常print_r(Array),isset也是1 09/27 16:00
14F:→ KawasumiMai: 那就看你砍掉前怎麼寫的,不能丟個砍掉後的code發問 09/27 16:00
15F:→ KawasumiMai: 然後要別人抓砍掉前的bug... 09/27 16:01
16F:→ KawasumiMai: 因為session_start();print_r($_SESSION);這兩行單跑 09/27 16:02
17F:→ KawasumiMai: 會undefined的話無解= =...但聽起來你不是這個問題 09/27 16:03
我會出現undefined就是因為我是在class visirData上一行print_r($_SESSION); 我說的把class拿掉指的是將class visitData的大括弧拿掉這樣而已 因為拿掉後,print_r($_SESSION)就可顯示出Array ( [userIP] => 127.0.0.1 ) 以下是完整程式: <?php class visitData { var $userName = "root"; //帳號 var $password = "12345"; //密碼 var $hostName = "localhost"; //主機(Server)名稱 //設定目前頁面訪問數 function setDailyPageNum($setDate) { //建立資料連結 $mylink = mysql_connect($this-> hostName, $this-> userName, $this-> password); //選擇資料庫 mysql_select_db("visitdata", $mylink); //指定提取資料的校對字元表 mysql_query("set character set big5"); $sql="select * from dailyistics where visitDate='" . $setDate . "'"; $dataList=mysql_query($sql); if ($arr_result=mysql_fetch_array($dataList,MYSQL_BOTH)) { $sql="update dailyistics set pageNum=pageNum+1 where visitDate='" . $setDate . "'"; mysql_query($sql); }else{ $sql="insert into dailyistics (pageNum,visitNum,visitDate) value(1,0,'" . $setDate . "')"; mysql_query($sql); } session_start(); if (!isset($_SESSION['userIP'])){ $_SESSION['userIP']=$this->getIP; $sql="update dailyistics set visitNum=visitNum+1 where visitDate='" . $setDate . "'"; mysql_query($sql); }else{ $_SESSION['userIP']=$this->getIP; } } function getIP() { global $_SERVER; if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $onlineip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $onlineip = $_SERVER['REMOTE_ADDR']; } $onlineip = preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches); return $onlineipmatches[0]; } } ?> ※ 編輯: heavenbetula (61.228.78.185), 09/27/2014 18:45:47 ※ 編輯: heavenbetula (61.228.78.185), 09/27/2014 18:51:20
18F:→ tkdmaf: $_SERVER本來就是全域變數為何還要global? 09/27 23:04
19F:→ heavenbetula: 恩我也這麼覺得 ~ 09/28 08:01
20F:→ KawasumiMai: 把 $this->getIP; 全部改成 $this->getIP(); 09/28 16:20
感謝K大確實像你說的把 $this->getIP 改成 $this->getIP() 動作就正常了 我在想可能我這本書上使用if(!session_is_registered("userIP"))的舊語法來做判斷時 只是在檢查userIP是否有登入過,而與userIP有沒有賦與值並無關係,所以造成 作者寫成$this->getIP的筆誤時,剛好又可以動作,所以讓人以為有檢查ip是否登入過 ※ 編輯: heavenbetula (61.228.76.105), 09/28/2014 21:39:36
21F:→ KawasumiMai: 跟語法舊不舊沒什麼關係 09/28 21:53
22F:→ KawasumiMai: $this上沒有getIP這個變數,存取回來可能為null 09/28 21:53
23F:→ KawasumiMai: 賦予$_SESSION[userIP]==null的boolean可能 09/28 21:54
24F:→ KawasumiMai: 剛好兩種情況都發生。用isset去判斷是一樣的結果 09/28 21:55
25F:→ KawasumiMai: 只是你要會除錯,留下那個class,留下function 09/28 21:56
26F:→ KawasumiMai: 刪除額外的東西,直接呼叫,echo出值,f5看結果 09/28 21:56







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

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

TOP