我收到以下消息时出错: -
Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\game.php on line 12
以下是源代码: -
<?php
$words=$_GET['words'];
$array=explode(",",$words);
$j=count($array)-1;
goto a;
a: shuffle($array);
$num=$array[0];
echo "The Number Is = $num";
echo "<br />";
echo "Please Enter The Number Within 10 Seconds";
echo "<form method=\"get\" action=\"$_SERVER[\'PHP_SELF\']\" "; **<--Line 12**
echo "<input type=\"text\" name=\"num\"";
echo "<input type=\"submit\" value=\"Press Me! \"";
$input=$_GET['num'];
goto b;
b: if($input==$array[0] && $array!=NULL)
{
array_pop($array);
goto a;
}
elseif($array!=NULL)
{
goto a;
}
else
break;
?>
请不要谈论GOTO,而是如何解决错误,因为我只是试验它以确定它是否能解决给定的问题。
答案 0 :(得分:4)
我会评论所有这些。
首先,修复语法错误(以及之后的HTML错误)。 PHP_SELF替换中的单引号不需要转义,您需要填写开始标记,并且需要关闭表单标记。
<?php
$words=$_GET['words'];
$array=explode(",",$words);
$j=count($array)-1;
goto a;
a: shuffle($array);
$num=$array[0];
echo "The Number Is = $num";
echo "<br />";
echo "Please Enter The Number Within 10 Seconds";
echo "<form method=\"get\" action=\"$_SERVER['PHP_SELF']\" >";
echo "<input type=\"text\" name=\"num\" />";
echo "<input type=\"submit\" value=\"Press Me! \" />";
echo "</form>";
$input=$_GET['num'];
goto b;
b: if($input==$array[0] && $array!=NULL)
{
array_pop($array);
goto a;
}
elseif($array!=NULL)
{
goto a;
}
else
break;
现在,为了使它不是意大利面条代码并简化你的逻辑:
<?php
$words=$_GET['words'];
$array=explode(",",$words);
while (sizeOf($array) > 0) {
shuffle($array);
$num = $array[0];
echo "The Number Is = $num";
echo "<br />";
echo "Please Enter The Number Within 10 Seconds";
echo "<form method=\"get\" action=\"$_SERVER['PHP_SELF']\" >";
echo "<input type=\"text\" name=\"num\" />";
echo "<input type=\"submit\" value=\"Press Me! \" />";
echo "</form>";
$input = $_GET['num'];
if($input === $array[0]) {
array_pop($array);
}
}
现在它至少清楚代码的作用 - 也就是说,表单在查询参数“words”上提供了逗号分隔的数字列表。该列表被洗牌,并要求用户输入新的“第一”项 - 实际上是列表中的随机项。当用户提交时,传递“num”。如果此号码与列表中的第一个号码相同,则会删除 last 号码。无论哪种方式,只要数组非空,然后循环回自身(实际上 ad infinitum ,为列表中的每个数字吐出相同的表单。我不确定这是什么你想要的,因为你没有将$ _GET [num]作为数组处理。
假设您实际获得了一个表单,而不是仅仅固定您的服务器,那么脚本会检查是否存在“num”,如果存在,则将其从数字列表中删除。
这是有趣的地方;提交时,脚本会再次启动。 “words”为空,因此表单要求用户输入“”。如果不是,则列表将被重新随机化,因此即使用户尽职地输入了所要求的内容,脚本也无法识别它。
这是我们不使用GOTO的原因之一;它会混淆你的代码流。使用GOTO时,在while循环中清楚的是不可思议的。
所以我认为假设是要求:
您将看到一个要输入的号码。您输入并提交表格。该号码将从列表中删除,并要求您输入另一个号码。一旦它是空的,如果你被告知那将是很好的。
所以,要以一种有意义的方式做到这一点,让我们使用一些OOP来做到这一点。
我知道你要说什么:这似乎是更多复杂 - 但是,我想让你注意到将所有东西都烘焙到一个类中的东西:它封装了你所拥有的东西在一个地方做,并将请求的每个阶段分离成单独的功能。
此外,尽管有评论,但它有效地记录了非显而易见和重复的任务,例如从$ _REQUEST(或$ _GET)对象获取项目,或从数组中获取项目(如果它是一个数组,如果该项目存在)以一种安全和可预测的方式。
最后,它是可读。查看while循环的内容并找出它的作用是有点工作的;在这个类中,您可以告诉:它检查数组是否为空,并且提交的数字与请求的数字相同;如果是这样,它会删除该号码。
此外,我们不是每次都对列表进行随机播放,而是随机选择每一个。
<?php
class RandomNumberGame {
private $startCount;
private $numberMax;
private $numbers;
private $index;
/**
Produce an array containing $count random numbers between 0 and $max
*/
public function generateRandoms($count, $max) {
$nums = array();
for ($i = 0; $i < $count; $i += 1) {
$nums[] = rand(0, $max);
}
return $nums;
}
/**
Get an item from an array if it exists; if not, or if the array doesn't exist, return null
*/
public function getIfExists($array, $item) {
if (empty($array)) return null;
if (!array_key_exists($item, $array)) return null;
return $array[$item];
}
/**
returns a random number from the list of numbers
*/
function pickRandomNumber() {
return rand(0, sizeof($this->numbers) - 1);
}
/**
Handle the request data
$request
['nums'] - list of numbers with which to populate $this->numbers
['index'] - the index of the currently-selected number
['num'] - the user's entry
If nums[index] == num, that item is removed and a new index is selected.
*/
public function processRequest($request) {
$nums = $this->getIfExists($request, 'nums');
if (empty($nums)) {
$this->numbers = $this->generateRandoms($this->startCount, $this->numberMax);
} else {
$this->numbers = explode(',', $nums);
}
$this->index = $this->getIfExists($request, 'index');
if (empty($this->index)) {
$this->index = $this->pickRandomNumber();
}
$num = $this->getIfExists($request, 'num');
if (empty($num)) return;
while (!empty($this->numbers) && $this->getCurrentNumber() === $num) {
$this->removeCurrentNumber();
}
}
/**
Removes the entry in $this->numbers pointed to by $this->index, and assigns $this->index a new random position
*/
public function removeCurrentNumber() {
// In $nums, replace 1 items at $index with [] - effectively, remove item $index from $num
array_splice($this->numbers, $this->index, 1, array());
// Pick a new random item
$this->index = $this->pickRandomNumber();
}
/**
Get the currently selected number
*/
public function getCurrentNumber() {
return $this->getIfExists($this->numbers, $this->index);
}
/**
Generate the form for output to the user
If there are no numbers left, provide a congratulation, and a link to start over
*/
public function getForm($endpoint) {
if (sizeof($this->numbers) === 0) {
return "Hey, you're done! <a href=\"{$endpoint}\">Start over</a>.";
}
$nums = join(',', $this->numbers);
return <<<HEREDOC
<form method="post" action="{$endpoint}">
<input type="hidden" name="nums" value="{$nums}" />
<input type="hidden" name="index" value="{$this->index}" />
<label for="num">
The number is {$this->getCurrentNumber()}<br />
Please enter the number within 10 seconds<br />
<input id="num" type="text" name="num" autofocus/>
</label>
<input type="submit" value="Press Me!" />
</form>
<!-- Optional: define some Javascript to disable the form in 10 seconds -->
HEREDOC;
}
public function RandomNumberGame($startCount = 10, $numberMax = 100) {
//Basic initialization
$this->startCount = $startCount;
$this->numberMax = $numberMax;
}
}
//Finally, the program:
$rng = new RandomNumberGame();
$rng->processRequest($_REQUEST);
echo $rng->getForm($_SERVER['PHP_SELF']);
答案 1 :(得分:3)
更改
echo "<form method=\"get\" action=\"$_SERVER[\'PHP_SELF\']\" ";
向
echo '<form method="get" action="'.$_SERVER['PHP_SELF'].'">';
眼睛更加简单。
答案 2 :(得分:1)
你错过了三行中的>
echo "Please Enter The Number Within 10 Seconds";
echo "<form method=\"get\" action=\"$_SERVER[PHP_SELF]\">";
echo "<input type=\"text\" name=\"num\">";
echo "<input type=\"submit\" value=\"Press Me! \">";
此致:
echo "<form method=\"get\" action=\"$_SERVER['PHP_SELF']\" ";
^-- here
echo "<input type=\"text\" name=\"num\"";
^-- here
echo "<input type=\"submit\" value=\"Press Me! \"";
^-- here
另外, [\'PHP_SELF\']
你不应该逃避单引号。
使用[PHP_SELF]
或{$_SERVER['PHP_SELF']}
将变量包装在花括号中。
答案 3 :(得分:1)
您应该使用括号包装服务器变量:
echo "<form method=\"get\" action=\"{$_SERVER['PHP_SELF']}\">";
答案 4 :(得分:1)
printf ("<form method=\"get\" action=\"{$_SERVER['PHP_SELF']}\" ");
两个错误。你不能在双引号字符串中转义单引号,当你在字符串中使用数组时,你需要用{}包围它。
答案 5 :(得分:1)
答案是您为$ _SERVER数组添加单引号:
echo "<form method=\"get\" action=\"$_SERVER[\'PHP_SELF\']\" ";
只需使用
echo "<form method=\"get\" action=\"$_SERVER[PHP_SELF]\" ";
代替。 &#39;&#39;的想法数组内部是传递字符串。无需在引号内传递它。
答案 6 :(得分:0)
在!=之后不需要空格 从
b: if($input==$array[0] && $array!=NULL)
到这个
b: if(($input==$array[0]) && ($array != NULL))
将它包装在额外的括号中以便更好地衡量