PHP echo中的JavaScript并不明显

JavaScript in PHP-echo is not noticeable

本文关键字:不明显 JavaScript 中的 echo PHP      更新时间:2023-09-26

在我的HTML页面中,我有一个带有action="register.php"<p id="slogan">form。我希望register.php中的PHP代码通过回显一些Javascript来更改<p>的值。

然而,在我的HTML页面中,这段内容没有改变,我不明白为什么。

这就是我的简化HTML页面包含的内容:

<body>
  <p id="slogan"> hello </p>    
  <form action="../scripts/register.php" method="post">
    ...
  </form>
</body>

这就是我的简化register.php包含的内容:

<?php
...
if (mysqli_query($conn, $sql)) {
    header("Location: http://www.google.com");
    echo "<script>
        document.getElementById('slogan').innerHTML = 'Character successfully introduced.';
        </script>";
    sleep(3);
} 
?>

回显的JavaScript应该将"hello"更改为"Character successfully created."

sleep(3)背后的原因是等待三秒,这样你就有时间在重定向到谷歌之前注意到更新的段落。

这在很多方面都是一个糟糕的实现(听我说完)。

首先,我建议不要在页面中注入javascript。为什么?因为为了让javascript显示出来,您需要依赖两个因素:

  1. 要在客户端浏览器上启用的Javascript
  2. PHP在发生这种情况时休眠

这可能看起来像是两个小问题,但每次你让PHP进入睡眠状态时,这实际上是一个阻碍——尽管发生了这种情况,但没有其他事情。

此外,如果我正确理解了你的理论,你的代码中也有一个小缺陷——你似乎想在"主脚本"页面而不是中间的register.php页面中注入成功消息。如果是这样的话,它永远不会被执行。如果我错误地选择了你,那么值得在这个问题中添加更多的代码,以澄清到底发生了什么。

替代方法

我的建议是这样做:

register.php

if($your_var == 1) {
  header('Location: youroriginalscript.php');
  $_SESSION['yoursessionvar'] = 'Character successfully created.';
}

youroriginalscript.php

... (beside your slogan HTML entity) ...
<div id="slogan">
    <?php
    if(isset($_SESSION['yoursessionvar'])){
        echo $_SESSION;
    }
    ?>
</div>

这并不完美,但它应该给你一个开始的想法。

您的原始脚本还假定角色创建总是成功的。事实可能并非如此,在向客户提供误导性反馈之前,应仔细检查。检查它,确保它是正确的,永远不要认为它在页面跳跃之间保持不变!

提示:如果你试图让PHP睡觉或做一些疯狂的事情,它总是会制造瓶颈。

编辑

好吧,从你编辑过的问题来看,你似乎有点混淆了PHP/Javascript。这是我不久前写的另一个答案,解释了差异,但实际上还有数百万其他答案:

使用

header("Location: someURL");

script实际发送到浏览器之前,您正在重定向到另一个页面(很可能会抛出错误,因为"someURL"可能不存在)

正在缓冲echo语句。您必须配置脚本以避免缓冲。看看这个:如何在PHP 中禁用输出缓冲

试试这个:

header("Location: someURL");
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++)
ob_end_flush();
ob_implicit_flush(1);
echo "<script>
      document.getElementById('slogan').innerHTML = 'Character successfully created.';
    </script>";
sleep(3);

问题是,由于PHP是后端,JavaScript是前端,因此在执行任何JavaScript之前,必须完成整个PHP脚本。这意味着sleep(3)发生在JavaScript执行之前,并完全扼杀了其目的。它所做的只是浪费你三秒的时间。

如果你想输出一条消息并重定向,你需要想出其他方法。然而,这是另一个话题。