【问题标题】:Javascript game info to PHPJavascript 游戏信息到 PHP
【发布时间】:2014-04-12 04:06:35
【问题描述】:

因此,在玩家输掉比赛后,我希望他们的分数使用 PHP 更新到数据库中。 我有一个单独的 javascript 类,它实际上运行整个游戏,但它使用 setInterval 来检查 index.php 函数以检查玩家是否输了;如果他们这样做,我希望它更新数据库。更新有效,但它没有得分,只是用 0 替换了他们拥有的任何高分。显然不是我想要的。我知道人们会推荐 AJAX,但我的教授只想要 PHP 和 Javascript,所以我在这里真的很困惑……这是 index.php 中的函数

<script type="text/javascript">
            function checkFinished(){
                if(end()){
                    <?php
                        if(isset($_SESSION["id"])){
                            $id = $_SESSION["id"];

                            $userName = $id["name"];
                            $update = "UPDATE bloodred SET score='?>score<?php' WHERE name='$userName'";
                            $update = $dbh->prepare($update);
                            $update->execute();
                        }
                    ?>
                    gameover = false;
                }
            }
</script>

如您所见,我试图通过在 $update 变量中执行此操作来获取 javascript 变量分数

score='?>score<?php'

有没有人知道任何快速的捷径来做到这一点?谢谢!

【问题讨论】:

  • 我认为您对 PHP 如何与 javascript 交互感到困惑。您在那里设置的 php 将在页面加载时运行。围绕它运行的 javascript 不会再次运行 php。 AJAX 也是 javascript 的一部分,所以如果你的教授只想要 PHP 和 javascript,你应该也可以使用 ajax。
  • @AdamMerrifield 问题是他没有教我们 AJAX,但我需要更新游戏中的高分。这将如何使用 AJAX 完成?
  • 您真正需要做的就是向另一个包含分数的页面发出请求。所以你真正能做的就是在 checkFinished if end() window.location = '/updatescore.php?score='+getScore(); 然后在 updatescore.php 做你的 php 东西。游戏结束后页面将重新加载,但它会在没有 ajax 的情况下发送请求。或者,您可以在页面上的 iFrame 中执行此操作,这样您就不会让用户离开页面

标签: javascript php jquery


【解决方案1】:

Javascript 是客户端,PHP 是服务器端。当您从 javascript 中删除 PHP 时,您会得到以下结果:

<script type="text/javascript">
            function checkFinished(){
                if(end()){
                    score
                    gameover = false;
                }
            }
</script>

如果您想使用 JavaScript 变量的内容更新数据库,则需要向服务器发出新请求。这可以是重定向、AJAX、套接字等。但是将 PHP 放在你的 javascript 中期望它像这样执行是行不通的。

顺便说一句,这将反过来工作,因为 PHP 是首先执行的。这对您的问题没有帮助,但可能有助于澄清您的代码为什么不起作用:

这将起作用:

<script>
alert("<?php echo $variable; ?>");
</script>

【讨论】:

  • 如何在不实际要求任何内容的情况下使用 GET 或 POST 方法?我没有使用表单,它是基于画布的游戏,我只需要在游戏完成后更新。有什么方法可以按照我所说的方式使用 POST 方法吗?
  • 是的,请参阅此问题了解更多详情:stackoverflow.com/questions/5907781/…
  • @ConnorPrice 您可以在 JavaScript 中调用事件,例如 (GameCompleted, ScoreChanged) 并通过 AJAX (JavaScript) POST 到服务器 (PHP)。
【解决方案2】:

在查看了大家对我说的所有内容后,我想到了一个简单的解决方案: 这是新的javascript:

<script type="text/javascript">
    function checkFinished(){
        if(end()){
            document.getElementById("setScore").value = score;
            gameover = false;
        }
    }
</script>

添加了一个简单的表格:

<form name="highscore" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
            <input id="setScore" name="setScore" value="" type="submit" />
        </form>

然后是一些 php

<?
        if(isset($_POST)){
            if(isset($_SESSION["id"])){
                $id = $_SESSION["id"];

                $score = $_POST["setScore"];
                $userName = $id["name"];
                $update = "UPDATE bloodred SET score='$score' WHERE name='$userName'";
                $update = $dbh->prepare($update);
                $update->execute();
            }
        }
?>

Thought id 发布此内容以防其他人需要它。再次感谢大家的帮助!

【讨论】:

    【解决方案3】:

    在不使用 ajax 的情况下,您可以创建一个 iframe 并使用页面上带有 target 属性的表单发布到它。

    javascript

    function checkFinished(){
        if(end()){
            var iframe = document.getElementById('updateScore'),
                form = document.createElement('form'),
                input = document.createElement('input');
            if(!iframe){
                iframe = document.createElement('iframe');
                iframe.name = 'updateScore';
                iframe.id = 'updateScore';
            }
    
            input.name = 'score';
            input.value = getGameScore();
    
            form.action = '/updatescore.php';
            form.method = 'post';
            form.target = 'updateScore';
            form.appendChild(input);
    
            form.submit();
            form.remove();
    
            gameover = false;
        }
    }
    

    updatescore.php

    <?php
        session_start();
        if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['id']) && isset($_POST['score'])){
            $id = $_SESSION["id"];
            $score = $dbh->real_escape_string($_POST['score']);
    
            $userName = $id["name"];
            $update = "UPDATE bloodred SET score='$score' WHERE name='$userName'";
            $update = $dbh->prepare($update);
            $update->execute();
        }
    ?>
    

    【讨论】:

      【解决方案4】:

      首先:AJAX 是 Javascript。

      第二:PHP 是一种服务器端语言。 Javascript 一个客户端。因此,您想要将 PHP 代码与 JS 代码混合使用将永远不会奏效。当 JS 执行时,所有 PHP 代码已经被 PHP 编译器评估和执行。

      有一些方法可以解决你的问题,比如:

      • 您可以使用 HTML5 WebSocket,但这是一种 AJAX,用户必须拥有更新的浏览器,并且您必须实现 PHP 套接字的服务器端来监听用户游戏结束事件(服务器)。

      • 您可以使用 AJAX(因为 AJAX 是 Javascript),它快速、简单且值得推荐。

      • 当游戏结束时,您可以将用户重定向到另一个页面(或相同,这是您的逻辑)传递带有新分数的查询字符串或 cookie,这样做 PHP 代码可以获取更新和正确的分数值并更新数据库。

      请记住,上面列出的所有表单都是不安全的,因为在客户端运行,因此,任何客户端(AKA 用户/玩家)都可以根据需要更改 score 的值。

      如果您不能使用 AJAX(同样,AJAX 是 Javascript),如果您不能使用 WebSockets(服务器限制或 HTML 5 限制),您可以通过脚本标签或 iframe 标签加载 PHP(但不要告诉任何人是我让你这么做的哈哈)

      <script type="text/javascript">
       var score = getCurrentScore(); //a simple method that returns the current user score to be stored in database
       function updateScore()
       {
          var s = document.createElement("script"); // create a tag script via JS
          s.scr = "updateScore.php?score=" + score + "&nocache=" + Math.floor((Math.random()*1024)+1); // determine that source of this script is the url of script that updates the score for current user, with the queryString score value. nocache querystring with random value between 1 and 1024 is just to guarantee that the script will be loaded every time  and not a cached version of a file will be acessed. For better results add a HTTP header "expire" in the updateScore.php with a small or negative value.
          s.type= "text/javascript"; // type of script (make sure that updateScore.php response a content-type text/javascript e a valid or empty javascript code
          document.getElementsByTagName("head")[0].appendChild(s); //append the tag script at the end of tag head of the current page  
       }
      
       // call updateScore() method when user gameover!
      </script>
      

      当您调用方法 updateScore 时,它会产生类似:

      &lt;script type="text/javascript" src="updateScore.php?score=1000&amp;nocache=123"&gt;&lt;/script&gt;

      这类似于 AJAX 请求,或直接请求或直接访问文件。其中 score=1000 代表一个值为 1000 的分数,而 nocache=123 是一个随机值,只是为了保证文件的新加载。 (再次调用方法,nocache 值 /probably/ 将变为不同于 123 的值...)

      【讨论】:

      • 服务器端 JavaScript 不是这样,但在 OPs 问题中这是真的。
      • 使用 node.js 和以下任何 google 您可以在服务器上运行 JavaScript,那时它可以使用 PHP 运行良好......但是它不会继续更新服务器没有 AJAX 帖子的侧变量。
      • 我的回答与问题的上下文有关。如果他不需要 SSJS(服务器端 JavaScript),因为服务器已经被 PHP 占用,它需要与 PHP 通信的 CSJS(客户端 JavaScript)的东西......我的回答符合问题的上下文!
      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多