我有一个 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 CAN 中的三元运算符实际上返回了"true"或"false"以外的值: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);
你的问题与三元表达式完全无关:在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);
您观察到此行为的原因是您错过了一组引号。
做:
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 中转换为字符串时(例如,当您提醒它们时(,您将看到字符串true
或false
。
如果添加额外的引号集,则输出现在为:
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' ?>";
这可能无法解决您的问题,但您应该确保您正在操作的 $_SESSION 变量存在如下:
empty($_SESSION['loginStatus']) ? "false" : "true"
这样,如果$_SESSION['loginStatus']
不存在,代码仍然有效。
此外,三元运算可以返回您想要的任何内容...它不限于真/假。