2012-01-02 94 views
0

我有一個PHP三元操作如下不起作用:只有php三元運算符'返回'是真是假?

var newLoginTxt = <?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>; 
alert("About to set the navbar's login text to: " + newLoginTxt); 

沒有警告框出現在所有。

但是這樣做的工作:

var curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : 'false'?>; 
alert("Testing: " + curLoginStatusSessionVar); 

的警告框出現並說:「測試:假」

我有下面的文章似乎在說,在PHP三元操作員可以在事實上的返回值比「真」或「假」其他: http://davidwalsh.name/php-shorthand-if-else-ternary-operators

好了,更奇怪 - 在下面的代碼,爲什麼第一個「測試」警告框出現,那麼第二個「測試」的警告框出現不?這是完全相同的代碼:

 // THIS "Testing" ALERT BOX APPEARS FINE** 
var curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : "false"?>; 
alert("Testing: " + curLoginStatusSessionVar); 


var newLoginTxt = <?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>; 
alert("About to set the navbar's login text to: " + newLoginTxt); 


    // THIS IDENTICAL "Testing" ALERT BOX NEVER APPEARS** 
curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : 'false'?>; 
alert("Testing" + curLoginStatusSessionVar); 
+1

使用客戶端工具來查看生成的輸出並打開一個JS控制檯,看看出了什麼問題。這不會是三元運營商的錯。 – Lucero 2012-01-02 18:30:50

+1

你的問題與三元運算符無關,你沒有正確地關閉你的字符串。查看phihag的答案。 – Deleteman 2012-01-02 18:32:02

回答

4

您的問題與三元表達式完全無關:在JavaScript中,與現代php一樣,字符串必須用引號封裝。

true和false恰好是JavaScript常量。因此,你想:

var newLoginTxt = "<?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>"; 
//    ^            ^

另外,如果數據比較複雜,使用json_encode。例如,如果你想在JavaScript訪問一個PHP變量$title(其中可能包含引號)的值:

<?php $title = '"Java"Script'; ?> 
var title = <?php echo json_encode($title); ?>; 
alert(title); 
+0

謝謝。這是問題所在。好眼睛!我向所有發現這個問題的人發出向上箭頭,我接受這個答案 - 謝謝你們。 – wantTheBest 2012-01-02 18:39:38

1

這也許不能解決你的問題,但你要保證你在操作$ _SESSION變量存在,就像這樣:

empty($_SESSION['loginStatus']) ? "false" : "true" 

這樣,如果$_SESSION['loginStatus']沒有按」代碼仍然有效。

此外,三元操作可以返回任何你想要的......它不限於TRUE/FALSE。

+0

非常感謝,但是在執行代碼之前,在第一次訪問site.php的onLoad()時使用了isset(),並設置了'loginStatus'會話變量。它的證明是,上面的第一個'Testing'警告框顯示正常,並且正確表明'loginStatus'被設置爲'false'。 – wantTheBest 2012-01-02 18:30:02

+0

我明白了......我只是試圖引用關於引用PHP變量的觀點。 – rdlowrey 2012-01-02 18:31:07

+0

謝謝,我非常感謝你的努力 - 我從你的評論中學到了一些東西,我從未用過'空'之前 - 謝謝你的努力。 – wantTheBest 2012-01-02 18:34:17

3

你觀察到這種現象的原因是因爲你錯過了一組引號。

做:

var newLoginTxt = "<?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>"; 
alert("About to set the navbar's login text to: " + newLoginTxt); 

,它會工作。

如果你看一下你的原代碼,輸出將是:

var newLoginTxt = Logged in; // Syntax error 
// ...or... 
var newLoginTxt = Login; // Used (probably) undefined variable 

你沒有這個問題,第二個例子的原因是輸出將是:

var curLoginStatusSessionVar = true; 
// ...or... 
var curLoginStatusSessionVar = false; 

......正如你所看到的,都是布爾型的有效賦值。當布爾轉換爲JS中的字符串時(例如,當您提醒他們時),您將看到字符串truefalse

如果添加了額外的一組引號,輸出現在是:

var newLoginTxt = "Logged in"; 
// ...or... 
var newLoginTxt = "Login"; 

這兩者都是有效的字符串賦值,所以應該解決這個問題。

作爲便箋,您應該暫時避免使用速記PHP標籤<?=。這是因爲(在PHP 5.4之前)使用此語法需要啓用short_open_tag,而在許多環境中(如大多數共享主機)都不能使用此語法。在PHP 5.4更廣泛的可用性之前,爲了便於攜帶,您應始終堅持使用完整的<?php標籤。所以你的行實際上是:

var newLoginTxt = "<?php echo $_SESSION['loginStatus'] ? 'Logged in' : 'Login' ?>"; 
+0

Dave非常感謝<?=語法的疑難解答!我現在要用<?php echo - 也要感謝你的出色解釋。 – wantTheBest 2012-01-02 18:46:11