-1

我是 PHP 的新手,我对 GET 方法感到困惑。

为什么$text循环条件中的 in 与 Windows 7 中的 Appserv 一起使用,但是当我在 Mac 上使用 Xampps 尝试此代码时,我必须使用它for($i=0; $i<strlen($_GET['text']); $i++)来代替。

起初,我明白在我使用isset($_GET['text'])so 之后我只使用 only $text,但现在我很困惑。

<? $color = array("#FFCCFF", "#FFCCCC", "#FFCC99", "#FF99FF", "#FF99CC",
    "#FF9999", "#FF66FF", "#FF66CC", "#FF6699", "#FF6666");
if (isset($_GET['text'])) { 
    for($i=0; $i<strlen($text); $i++) { 
        $j = $i%10 ?>
        <font color=<?= $color[$j]?>><? echo "$text[$i]"; ?></font>
    } 
} else {
    echo "Empty String";
} ?>

很多人的帮助解决了这个问题。

<?php $color = array("#FFCCFF", "#FFCCCC", "#FFCC99", "#FF99FF", "#FF99CC",
    "#FF9999", "#FF66FF", "#FF66CC", "#FF6699", "#FF6666"); 
if( isset($_GET['text'])) {
    $text = $_GET['text'];
    for( $i=0; $i<strlen($text); $i++) {
        $j = $i%10;
        echo "<font color=$color[$j]>$text[$i]</font>";
    }
} else
    echo "Empty string";
?>

顺便说一句,我尝试使用 HTML + PHP 只是因为我想在深入使用 CSS 之前练习 HTML。

4

4 回答 4

0

好吧,你为什么要在每一行都进出 PHP?一次允许有超过一行的 PHP,你知道的!

$_GET['text']是一个变量。访问它并没有什么特别之处,但它的特别之处在于无论范围如何都可以访问它(它是超全局的)。$text仅在启用自动注册全局设置时才引用 is ,由于各种原因不建议这样做。

因此,您的代码应如下所示:

<?php
$color = array(".....");
if( isset($_GET['text'])) {
    $l = strlen($_GET['text']);
    for( $i=0; $i<$l; $i++) {
        $j = $i%10;
        echo "<span style=\"color: ".$color[$j].";\">".$text[$i]."</span>";
    }
}
else echo "Empty string";
?>

我还冒昧地在上个千年更新了您的 HTML。

于 2012-07-14T13:53:54.477 回答
0

您应该首先初始化 $text 变量,如下所示:

$text = $_GET['text'];

这应该没有任何问题。

于 2012-07-14T13:55:06.580 回答
0

我仍然不确定你在做什么,但是:

$colours = array("#FFCCFF", "#FFCCCC", "#FFCC99", "#FF99FF", "#FF99CC", "#FF9999", "#FF66FF", "#FF66CC", "#FF6699", "#FF6666");

if (isset($_GET['text'])) {
    $text = $_GET['text'];
    for ($i = 0; $i < strlen($text); $i++) {
        $j = $i%10;
        echo "<span style='color: {$colours[$j]}'>{$text[$i]}</span>";
    }
}
else {
    echo 'No text';
}
于 2012-07-14T13:57:48.467 回答
0

您的问题的实际答案,如果$text作为别名工作,$_GET['text']可能是您的 Windows 服务器配置为register_globals设置为on,这意味着在您的查询字符串中传递的任何内容都将转换为适当的变量。

IE。?awesome=true==$awesome = 'true'

这是不好的。register_globals在违规方禁用,并用于$_GET['text']访问您的数据。

您的代码看起来会更好一点,如下所示:

<?php
$color = array("#FFCCFF", "#FFCCCC", "#FFCC99", "#FF99FF", "#FF99CC",
                "#FF9999", "#FF66FF", "#FF66CC", "#FF6699", "#FF6666");
if (isset($_GET['text'])) {
    $text = $_GET['text'];
    for($i=0; $i < strlen($text); $i++) { 
        $j = $i % 10; ?>
        <span style="color: <?= $color[$j] ?>"><?= htmlentities($text[$i]); ?></span>
    <?php } 
} else {
    echo "Empty String";
}
?>

请注意,我已经整理了您的代码并使其更加理智/安全。htmlentities用于阻止可能来自此的 XSS 漏洞,尽管由于拆分字符串而不太可能。尽管它们是完全相同的东西,但出于某种原因,<?php echo .. ?>您混淆了。<?= .. ?>另外,不要使用<font>.

你这样说:

起初,我明白“在我使用了 isset($_GET['text']) 之后,我下次只使用 ($text),但现在我很困惑。

如果你知道你在混合它们,你为什么要这样做?如果您正在检查是否$_GET['text']已设置,那么您也可以将其用于访问是合乎逻辑的。

于 2012-07-14T14:11:22.627 回答