使用PHP插入的JavaScript值返回错误
我创建了一个测验计时器,它使用javascript和PHP的组合。PHP通过名为使用PHP插入的JavaScript值返回错误,javascript,php,Javascript,Php,我创建了一个测验计时器,它使用javascript和PHP的组合。PHP通过名为takingTest的URL参数获取测验的结束时间,并将其插入javaScript代码中。然而,这并不适用于所有人。如果我手动插入值,它对每个人都有效。你知道问题出在哪里吗 URL参数 我使用回显URL参数,它显示了正确的结束时间 用PHP回显值 当它中断时,它返回一个负值并提交测验 负值示例 -10h-27m-225 我的代码如下所示: <?php if(($_GET["started"]) ===
takingTest
的URL参数获取测验的结束时间,并将其插入javaScript代码中。然而,这并不适用于所有人。如果我手动插入值,它对每个人都有效。你知道问题出在哪里吗
URL参数
我使用
回显URL参数,它显示了正确的结束时间
用PHP回显值
当它中断时,它返回一个负值并提交测验
负值示例
-10h-27m-225
我的代码如下所示:
<?php
if(($_GET["started"]) === "true") {
?>
<!--/*<!-- Quiz countdown block -->
<script type="text/javascript" defer>
$(function () {
// Set the date we're counting down to
var countDownDate = new Date("<?php echo $_GET['takingTest']; ?>").getTime();
// Update the count down every 1 second
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("timer").innerHTML = hours + "h "
+ minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
$("#grader").trigger("click");
}
}, 1000);
});
</script>
<?php } ?>
使用标准日期格式<代码>Y-m-d H:i:s 否则,您将依赖浏览器来解析它,它的行为可能与您预期的不一样。例如,月份名称在不同语言中可能不同 此外,您可能希望关闭您在那里的XSS漏洞。
http://example.com/whatever.php?takingTest=“;+警报('xss');+/
格式问题:
<> P.>两件事,首先是你的日期格式。很多时候,如果你使用了一种无效的格式,它对大多数人都是有效的。这就意味着绝大多数人的JavaScript都是<代码> D MD YH:I:SO O/COD>。在JavaScript和PHP中要考虑的另一件事情是JS使用0到11个月,而PHP使用1-12。
更好的PHP和时间戳:
第二件事是php生成的日期函数。它比需要的复杂得多。从php生成javascript日期的最佳方法是strotime,不过需要将它乘以1000以将其转换为毫秒。它还非常容易存储在数据库中或任何需要的地方,并且它与时区无关,因为它是ba协调世界时前后
换言之,我要说:
var countDownDate = new Date(<?= echo strtotime($start_date)*1000; ?>);
var countDownDate=新日期();
在这两个选项之间,你应该能够修复它。我强烈建议你选择后者,因为它永远不会像第一个那样失败
还有一个提示,如果你使用
而不是
,你就不必写echo了。这可能只是一个时区问题吗?比如用户提供了开始值,但它来自不同的时区?或者可能有人发现你在按url发送测试时间,并且在跟踪你:Dif你提供了前端代码也可以让用户给您时间戳,或者至少在将其推送到服务器之前将其转换为iso日期url@jonathanHeindl我不认为这是一个巨魔的情况,因为我也在本地测试。@Emma,因为它目前是本地时间,可能不会有帮助,因为时区的信息没有在参数中传递(如果它的可变Id为jsut,则将其转换为我发现更容易处理的timestmap)我有这样的日期格式,但仍然有相同的问题。我在寻找解决方案时对其进行了更改。不过,我会将其更改回来,看看会发生什么。更重要的是,我将学习如何关闭XSS漏洞。我会尝试一下。感谢您的PHP提示。
var countDownDate = new Date(<?= echo strtotime($start_date)*1000; ?>);