作者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/cn.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