2012-01-02 147 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