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