Can';t从会话变量中检索数据-PHP数字猜测游戏
我正在构建一个数字猜测游戏,需要创建一个会话变量来保存随机的目标数字,直到用户提交正确的猜测。我还需要打印用户提交正确答案后的尝试次数 我设置了会话变量,并使用了一个隐藏字段来保存计数器。当我提交猜测时,我不知道隐藏字段是否有效,我的代码总是打印check()函数的第一个if语句 我认为这与session变量(当然还有我的代码)有关,但我无法理解。我已经为此工作了两天了,感到很沮丧。任何帮助都将是惊人的。下面是我的完整代码:Can';t从会话变量中检索数据-PHP数字猜测游戏,php,session,session-variables,Php,Session,Session Variables,我正在构建一个数字猜测游戏,需要创建一个会话变量来保存随机的目标数字,直到用户提交正确的猜测。我还需要打印用户提交正确答案后的尝试次数 我设置了会话变量,并使用了一个隐藏字段来保存计数器。当我提交猜测时,我不知道隐藏字段是否有效,我的代码总是打印check()函数的第一个if语句 我认为这与session变量(当然还有我的代码)有关,但我无法理解。我已经为此工作了两天了,感到很沮丧。任何帮助都将是惊人的。下面是我的完整代码: <?php session_start() ?>
<?php session_start() ?>
<!DOCTYPE HTML>
<html>
<head>
<title>Number Guessing Game</title>
</head>
<body>
<h1>Guess the number</h1>
<p>I'm thinking of a number between 1 and 5. Can you guess what it is?<br>
In less than 3 tries?</p>
<?php
extract($_REQUEST);
error_reporting(E_ALL & ~E_NOTICE);
// check to see if this is start of game
if (filter_has_var(INPUT_POST, "guess")) {
check();
} else {
setTarget();
} //end if
// set targetNum session variable
// increment counter by 1
function setTarget() {
$targetNum = rand(1, 5);
$_SESSION["targetNum"] = $targetNum;
$counter++;
print <<<HERE
<form action="" method="post">
<input type = "text"
name = "guess">
<input type = "hidden"
name = "counter"
value = "$counter">
<h2>Target Number: $targetNum</h2>
<h3>The counter is at: $counter</h3>
<br>
<button type = "submit">
SUBMIT GUESS
</button>
</form>
HERE;
}
function check() {
global $counter;
print <<<HERE
<form action="" method="post">
<input type = "text"
name = "guess"
value= "$guess">
<input type = "hidden"
name = "counter"
value = "$counter">
<h2>Target Number: $targetNum</h2>
<h3>The counter is at: $counter</h3>
<br>
<button type = "submit">
SUBMIT GUESS
</button>
</form>
HERE;
if ($guess == $_SESSION['$targetNum']) {
print "<h3>Awesome. You guessed it in $counter attempt(s)</h3>";
unset($_SESSION["targetNum"]);
$count = 0;
print "<a href='numberGuessingGame.php'>TRY AGAIN</a>";
} else if ($guess > $_SESSION['$targetNum']) {
print "<h3>Too high. Guess again.</h3>";
} else if ($guess < $_SESSION['$targetNum']) {
print "<h3>Too low. Guess again.</h3>";
} else {
print "I don't know what that is...";
}
}
?>
</body>
</html>
猜数字游戏
猜猜数字
我在想一个介于1和5之间的数字。你能猜出是什么吗?
在不到3次的尝试中
您的$guess
变量从未设置为POST值(更正:您使用的是extract,但我建议不要这样做)。在添加“$”时,您也在更改会话数组键的值:
$guess = $_POST['guess'];
if ($guess == $_SESSION['targetNum']) {
您犯了两个基本但严重的错误
第一:不要将错误级别设置为在开发时排除通知!这样,您就永远不会发现变量或数组索引名中的键入错误。删除错误报告(E_ALL&~E_通知)代码>,或将其替换为错误报告(E\u ALL)代码>
第二:使用extract($\u请求)代码>-使用该功能会带来麻烦。由于“register_globals”特性,PHP有着长期的安全漏洞历史,该特性引入了全局变量,只是因为解析了请求数据中的某个key=value对。删除该功能花费了数年时间。通过使用该函数,您在没有任何安全预防措施的情况下实现了它,并且没有实际的好处
删除提取($\u请求)
函数,并对来自远程浏览器的所有变量使用$\u REQUEST['varname']
而不是$varname