获得解析错误意外“

时间:2014-03-17 20:06:35

标签: php

我收到以下消息时出错: - 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,而是如何解决错误,因为我只是试验它以确定它是否能解决给定的问题。

7 个答案:

答案 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))

将它包装在额外的括号中以便更好地衡量