Javascript游戏信息到PHP

Javascript游戏信息到PHP,javascript,php,jquery,Javascript,Php,Jquery,所以,在玩家输了之后,我希望他们的分数能够用PHP更新到数据库中。 我有一个单独的javascript类,它实际运行整个游戏,但它使用setInterval检查index.php函数来检查玩家是否输了;如果他们这样做了,我希望它更新数据库。更新工作,但它不采取的分数,只是取代任何高分,他们有0。。显然不是我想要的。我知道人们会推荐AJAX,但我的教授只想要PHP和Javascript,所以我在这里感到非常困惑。。。下面是index.php中的函数 <script type="text/ja

所以,在玩家输了之后,我希望他们的分数能够用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>

函数checkFinished(){
if(end()){

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

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

函数checkFinished(){
if(end()){
分数
gameover=false;
}
}
如果您想用JavaScript变量的内容更新数据库,则需要向服务器发出新的请求。这可以是重定向、AJAX、套接字等。但是将PHP放入JavaScript中以期望它像这样执行是行不通的

请注意,由于PHP是先执行的,因此这会反过来起作用。这对您的问题没有帮助,但可能有助于澄清代码不起作用的原因:

这将有助于:

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

警报(“”);

在回顾了你们对我说的一切之后,我想到了一个简单的解决方案: 以下是新的javascript:

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

函数checkFinished(){
if(end()){
document.getElementById(“setScore”).value=分数;
gameover=false;
}
}
添加了一个简单的表单:

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

首先:AJAX是Javascript

第二:PHP是一种服务器端语言,Javascript是客户端语言,所以你想把PHP代码和JS代码混合在一起的方法永远不会奏效。当JS执行时,所有的PHP代码都已经被PHP编译器计算和执行了

要解决您的问题,有以下几种方法:

  • 您可以使用HTML5WebSocket,但这是一种AJAX,用户必须有一个更新的浏览器,并且必须实现PHP套接字的de服务器端来侦听用户gameover事件(服务器资源过多)

  • 您可以使用AJAX(因为AJAX是Javascript),这是一种快速、简单且推荐的方法

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

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

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


var score=getCurrentScore();//返回要存储在数据库中的当前用户分数的简单方法
函数updateScore()
{
var s=document.createElement(“脚本”);//通过JS创建标记脚本
s、 scr=“updateScore.php?score=“+score+”&nocache=“+Math.floor((Math.random()*1024)+1);//确定此脚本的源是使用queryString score值更新当前用户分数的脚本的url。随机值介于1和1024之间的nocache queryString只是为了确保每次都加载脚本,而不是访问文件的缓存版本。为获得更好的结果,请添加HTTP头updateScore.php中的“expire”值较小或为负值。
s、 type=“text/javascript”;//脚本类型(确保updatecore.php响应的内容类型text/javascript是有效或空的javascript代码
document.getElementsByTagName(“head”)[0].appendChild;//将标记脚本追加到当前页面的标记头末尾
}
//当用户游戏结束时调用updateScore()方法!
当您调用方法updateScore时,它将产生如下结果:


这类似于AJAX请求、直接请求或直接访问文件。其中,score=1000表示值为1000的分数,nocache=123是一个随机值,只是为了保证文件的新加载。(再次调用方法,nocache值/可能/将更改为与123不同的值…)不使用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();
    }
?>

我想你对PHP如何与javascript交互感到困惑。你在那里设置的PHP将在页面加载时运行。围绕它运行的javascript不会再次运行PHP。而且AJAX是javascript的一部分,所以如果你的教授只想要PHP和javascript,你也应该能够使用AJAX。@Adammerfield问题是他没有教过我们使用AJAX,但我需要更新游戏的高分。使用AJAX如何做到这一点?您真正需要做的是向另一个页面发出包含分数的请求。因此,如果
end()
然后在
updatescore.php
中执行php操作。游戏结束后,页面将重新加载,但它将在不使用ajax的情况下发送请求。或者,您可以在页面上的iFrame中执行此操作,这样您就不会让用户离开页面。我如何使用GET或POST方法而不实际请求任何内容?我没有使用表单这是一个基于画布的游戏,我只需要在游戏结束后更新
<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>
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;
    }
}
<?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();
    }
?>