作者heavenbetula (綠草)
看板PHP
標題Re: [請益] php if的判斷
時間Thu Sep 25 22:21:04 2014
※ 引述《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