Re: [請益] php if的判斷
※ 引述《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
09/25 23:00, 1F
→
09/25 23:00, , 2F
09/25 23:00, 2F
→
09/25 23:06, , 3F
09/25 23:06, 3F
→
09/25 23:14, , 4F
09/25 23:14, 4F
→
09/26 00:18, , 5F
09/26 00:18, 5F
推
09/26 05:40, , 6F
09/26 05:40, 6F
→
09/26 19:46, , 7F
09/26 19:46, 7F
→
09/26 21:28, , 8F
09/26 21:28, 8F
→
09/26 21:28, , 9F
09/26 21:28, 9F
推
09/27 11:18, , 10F
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
09/27 15:59, 11F
→
09/27 15:59, , 12F
09/27 15:59, 12F
→
09/27 16:00, , 13F
09/27 16:00, 13F
→
09/27 16:00, , 14F
09/27 16:00, 14F
→
09/27 16:01, , 15F
09/27 16:01, 15F
→
09/27 16:02, , 16F
09/27 16:02, 16F
→
09/27 16:03, , 17F
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
09/27 23:04, 18F
→
09/28 08:01, , 19F
09/28 08:01, 19F
→
09/28 16:20, , 20F
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
09/28 21:53, 22F
→
09/28 21:54, , 23F
09/28 21:54, 23F
→
09/28 21:55, , 24F
09/28 21:55, 24F
→
09/28 21:56, , 25F
09/28 21:56, 25F
→
09/28 21:56, , 26F
09/28 21:56, 26F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章