看板 PHP 關於我們 聯絡資訊
※ 引述《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://www.ptt.cc/bbs/PHP/M.1411654867.A.D67.html ※ 編輯: heavenbetula (61.231.9.104), 09/25/2014 22:22:06
MOONRAKER: 在開頭加print_r($_SESSION)看裡面到底有什麼。 09/25 23:00
MOONRAKER: 順便告訴你session_register()也過時了 本人從寫php以 09/25 23:00
MOONRAKER: 來(大概是死亡筆記本連載的時候)從來沒用過這個函數 09/25 23:06
heavenbetula: print_r($_SESSION)會Undefined variable: _SESSION 09/25 23:14
MOONRAKER: 太誇張了 起碼要顯示 Array() 你session可能壞掉了 09/26 00:18
up9cloud: 不要在開頭加,放session_start();之後一行... 09/26 05:40
heavenbetula: 會顯示Array ( [userIP] => 127.0.0.1 ) 09/26 19:46
heavenbetula: 而這不就表示我原先的想法應該是沒錯的吧... 09/26 21:28
heavenbetula: userIP一開始未定義 第二次執行有定義而且有值了 09/26 21:28
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
KawasumiMai: 你貼的code是拿掉的情況,沒提到class的問題 09/27 15:59
KawasumiMai: 所以現在的問題是,你class是怎麼寫的 09/27 15:59
KawasumiMai: 如果getIP() 可以正常print_r(Array),isset也是1 09/27 16:00
KawasumiMai: 那就看你砍掉前怎麼寫的,不能丟個砍掉後的code發問 09/27 16:00
KawasumiMai: 然後要別人抓砍掉前的bug... 09/27 16:01
KawasumiMai: 因為session_start();print_r($_SESSION);這兩行單跑 09/27 16:02
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
tkdmaf: $_SERVER本來就是全域變數為何還要global? 09/27 23:04
heavenbetula: 恩我也這麼覺得 ~ 09/28 08:01
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
KawasumiMai: 跟語法舊不舊沒什麼關係 09/28 21:53
KawasumiMai: $this上沒有getIP這個變數,存取回來可能為null 09/28 21:53
KawasumiMai: 賦予$_SESSION[userIP]==null的boolean可能 09/28 21:54
KawasumiMai: 剛好兩種情況都發生。用isset去判斷是一樣的結果 09/28 21:55
KawasumiMai: 只是你要會除錯,留下那個class,留下function 09/28 21:56
KawasumiMai: 刪除額外的東西,直接呼叫,echo出值,f5看結果 09/28 21:56