Re: [請益] php if的判斷

看板PHP作者 (綠草)時間11年前 (2014/09/25 22:21), 11年前編輯推噓2(2024)
留言26則, 6人參與, 最新討論串3/3 (看更多)
※ 引述《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

09/25 23:00, , 1F
在開頭加print_r($_SESSION)看裡面到底有什麼。
09/25 23:00, 1F

09/25 23:00, , 2F
順便告訴你session_register()也過時了 本人從寫php以
09/25 23:00, 2F

09/25 23:06, , 3F
來(大概是死亡筆記本連載的時候)從來沒用過這個函數
09/25 23:06, 3F

09/25 23:14, , 4F
print_r($_SESSION)會Undefined variable: _SESSION
09/25 23:14, 4F

09/26 00:18, , 5F
太誇張了 起碼要顯示 Array() 你session可能壞掉了
09/26 00:18, 5F

09/26 05:40, , 6F
不要在開頭加,放session_start();之後一行...
09/26 05:40, 6F

09/26 19:46, , 7F
會顯示Array ( [userIP] => 127.0.0.1 )
09/26 19:46, 7F

09/26 21:28, , 8F
而這不就表示我原先的想法應該是沒錯的吧...
09/26 21:28, 8F

09/26 21:28, , 9F
userIP一開始未定義 第二次執行有定義而且有值了
09/26 21:28, 9F

09/27 11:18, , 10F
print_r(isset($_SESSION['userIP']))呢?
09/27 11:18, 10F
由於我的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

09/27 15:59, , 11F
你貼的code是拿掉的情況,沒提到class的問題
09/27 15:59, 11F

09/27 15:59, , 12F
所以現在的問題是,你class是怎麼寫的
09/27 15:59, 12F

09/27 16:00, , 13F
如果getIP() 可以正常print_r(Array),isset也是1
09/27 16:00, 13F

09/27 16:00, , 14F
那就看你砍掉前怎麼寫的,不能丟個砍掉後的code發問
09/27 16:00, 14F

09/27 16:01, , 15F
然後要別人抓砍掉前的bug...
09/27 16:01, 15F

09/27 16:02, , 16F
因為session_start();print_r($_SESSION);這兩行單跑
09/27 16:02, 16F

09/27 16:03, , 17F
會undefined的話無解= =...但聽起來你不是這個問題
09/27 16:03, 17F
我會出現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

09/27 23:04, , 18F
$_SERVER本來就是全域變數為何還要global?
09/27 23:04, 18F

09/28 08:01, , 19F
恩我也這麼覺得 ~
09/28 08:01, 19F

09/28 16:20, , 20F
把 $this->getIP; 全部改成 $this->getIP();
09/28 16:20, 20F
感謝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

09/28 21:53, , 21F
跟語法舊不舊沒什麼關係
09/28 21:53, 21F

09/28 21:53, , 22F
$this上沒有getIP這個變數,存取回來可能為null
09/28 21:53, 22F

09/28 21:54, , 23F
賦予$_SESSION[userIP]==null的boolean可能
09/28 21:54, 23F

09/28 21:55, , 24F
剛好兩種情況都發生。用isset去判斷是一樣的結果
09/28 21:55, 24F

09/28 21:56, , 25F
只是你要會除錯,留下那個class,留下function
09/28 21:56, 25F

09/28 21:56, , 26F
刪除額外的東西,直接呼叫,echo出值,f5看結果
09/28 21:56, 26F
文章代碼(AID): #1K92JJrd (PHP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1K92JJrd (PHP)