例如,如果我的网址看起来像index.php?category = IT%20&%20Soft。然后我尝试打印“$ _GET [category]”我只得到“IT”而不是“IT& Soft”。这有什么不对?这让我很沮丧。
答案 0 :(得分:16)
问题不在于空格,而在于&符号。
改为使用%26
,如下所示:
index.php?category=IT%20%26%20Soft
&符号表示您正在开始另一个字段(如category=IT&subcategory=somethingelse
)。您可以看到list of reserved characters on Wikipedia。
答案 1 :(得分:3)
空格和&符号(&)无效,需要编码才能在参数值中使用。通过'urlencode'运行您的参数以创建url安全参数值。
答案 2 :(得分:3)
&
是HTTP URL和URI中的保留字符(通常称为链接或超文本引用)。这个&
就是定义新$_GET
条目的那一点。所以它不再是之前$_GET
条目的一部分。前一个是您想要使用的那个。事实上,类别中的&
是导致您头痛的原因:
URL: http://example.com/script.php?hello=world&foo=bar
^ ^^^
PHP:
$_GET['hello'] // "world"
$_GET['foo'] // "bar"
所以请记住:在URL中,&
字符将一个URL参数与另一个URL参数分开。
但这并不意味着您的问题无法解决。您可以通过URL参数传递包含&
字符的值。有一种非常简单的方法可以将&
个字符转换为特定的$_GET
值。
但请注意:您现在可能会在应用程序的输入级别(即数据进入$_GET
和其他变量的部分)中查看。但要解决这个问题,您需要查看相反的结果 - 输出级别(您发送HTML的位置)。
为什么呢?因为输出将成为脚本的输入。因此,如果输出已经错误,输入就永远无法使用。
请考虑应用程序发送到浏览器的每个URL(例如,作为HTML链接<a href="">
的一部分)是一个新命令,其中包含脚本$_GET
变量的特定参数。从技术上讲,这部分称为query
或HTTP URI / URL的queryinfo
部分。
因此,如果URL的构建方式会为您的脚本创建错误的$_GET
参数,那么它已经太晚了。所以你看一下输出来解决原因。
相反,您需要查看创建网址的位置并在那里执行正确的输出,以便稍后获取$_GET['category']
。
在每个链接输出位置,您需要确保每个值都正确编码。这是包含问题解决方案的神奇词汇。一个术语,你最好在字典中查找,而不是在技术文档中查找。
$_GET
参数所需值的编码类型就是所谓的网址编码 - 网址编码 - 有意义,对吧? URL,encoding = URL-encoding。
对URL的值进行编码实际上需要注意的是,参数的值将在您的脚本中再次安全地使用,而不是分开值,最后甚至在技术上破坏URL。
听起来可能有点复杂,但好消息是,您首先只需要知道PHP作为一种网络脚本语言提供了一种为您执行此编码的功能。它被称为urlencode()
,您可以在任何值上使用它来创建您的网址。事实上,在Web应用程序中执行这是一项非常常见的任务,所以如果您之前只知道 - 但在那之前,让我们看一些代码吧?
我必须猜测一下你的结果如何,但是你可以将你的代码添加到你的问题(输出代码)中,这样你就可以更容易地给你一些你可以“使用”的代码。假设您有类似的内容输出链接:
<a href="index.php?category=<?php echo $category ?>">
这将输出$category
只是的内容,因为它是。但这确实会导致错误的网址破坏您的脚本。
因此,需要对$category
的值进行编码。这就像将它放入信封中以确保它作为一个整体到达它的目的地。让我们使用我刚刚提到的urlencode
函数来做到这一点:
<a href="index.php?category=<?php echo urlencode($category) ?>">
如您所见,只需将值放入urlencode
函数即可正确编码数据。准备到达它的目的地,没有什么可以打破它。
一如既往:当你知道如何时,这很简单。需要正确编写URL,特别是需要对参数值进行适当编码,以防止在另一端遇到问题:输入级别。
祝你好运。
答案 3 :(得分:1)
查询字符串使用&
字符作为分隔符来分隔参数。基本上你需要将它转移到%26
。
index.php?category=IT%20%26%20Soft