Re: [請益] php if的判斷

看板PHP作者 (蚵仔)時間11年前 (2014/09/23 22:17), 編輯推噓4(4023)
留言27則, 3人參與, 最新討論串2/3 (看更多)
※ 引述《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才有值,那怎麼沒值可以 : 先判斷? http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=651 session_is_registered --- 判斷變數是否已經登記 語法 : bool session_is_registered (string name) 說明 : 如果變數name在目前的session中已經登記過了,則session_is_registered( )傳回true。 所以,如果一開始就沒有,你的session_is_registered("userIP")就會回傳false 然後前面加一個!就是false變true,所以就執行if裡面的東東(登記後給值),他不是指有沒有給值而是 指是否登記 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.39.18.11 ※ 文章網址: http://www.ptt.cc/bbs/PHP/M.1411481846.A.8DC.html

09/23 22:28, , 1F
那這樣session_is_registered("userIP")一定
09/23 22:28, 1F

09/23 22:28, , 2F
沒有登記囉?因為userIP還沒有值
09/23 22:28, 2F

09/23 22:29, , 3F
然後因為!的原因所以一定會執行 if裡面的動作嗎/
09/23 22:29, 3F

09/23 22:32, , 4F
session_is_registered()在5.4已經入土為安了
09/23 22:32, 4F

09/23 22:33, , 5F
相同功能請大方使用isset($_SESSION['userIP'])
09/23 22:33, 5F

09/23 22:34, , 6F
5.2.6版本可以使用5.4的語法嗎?
09/23 22:34, 6F

09/23 22:36, , 7F
抱歉突然覺得上句這個問題很蠢...我去更新= ='
09/23 22:36, 7F

09/24 00:24, , 8F
如果你只有這個頁面,第一次進入,IF判斷結果應該是TRUE
09/24 00:24, 8F

09/24 00:25, , 9F
然後就會執行到 session_register('userIP');
09/24 00:25, 9F

09/24 00:26, , 10F
這時候userip就會被登記,然後當你重新整理時
09/24 00:26, 10F

09/24 00:27, , 11F
因為userip被登記且還存在,if的判斷結果會變false
09/24 00:27, 11F

09/24 00:28, , 12F
session_is_registered('userIP')=true,! true就是false
09/24 00:28, 12F

09/24 00:29, , 13F
就不會執行if內的東西
09/24 00:29, 13F

09/24 00:30, , 14F
不過這個的確之後版本拿掉了,改成isset是一樣的運作原理
09/24 00:30, 14F

09/24 00:42, , 15F
另外登記和給值是不一樣的事情唷
09/24 00:42, 15F

09/24 00:43, , 16F
早期版本要用session,你要先登記,才能給值
09/24 00:43, 16F

09/24 00:45, , 17F
session_register('userIP');把他當成是宣告一個變數
09/24 00:45, 17F

09/24 00:46, , 18F
$_SESSION['userIP]=$this->getIP; 就是給變數一個值
09/24 00:46, 18F

09/24 00:47, , 19F
session_is_registered('userIP')就是指這個變數是否存在
09/24 00:47, 19F

09/24 00:47, , 20F
如果你宣告一個變數,不給值,判斷他是否存在時
09/24 00:47, 20F

09/24 00:48, , 21F
那麼結果會是存在,除非你是判斷這個變數裡有沒有值
09/24 00:48, 21F

09/24 09:55, , 22F
試試看便知,記得滿早就可以用isset()檢查session了
09/24 09:55, 22F

09/24 19:19, , 23F
感謝各位大大熱心的解惑!
09/24 19:19, 23F

09/25 20:30, , 24F
請問為什麼我改為isset($_SESSION['userIP'])後
09/25 20:30, 24F

09/25 20:30, , 25F
永遠都不會去執行else...這樣結果不對啊> <"
09/25 20:30, 25F

09/25 20:32, , 26F
也就是變if(!isset($_SESSION['userIP']))
09/25 20:32, 26F

09/25 20:33, , 27F
然後session_register("userIP");這行刪除
09/25 20:33, 27F
文章代碼(AID): #1K8O3sZS (PHP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1K8O3sZS (PHP)