我是PHP的新手。在学习PHP语言的过程中,我注意到,某些网站会出现这种URL:
www.website.com/profile.php?user=roa3& ...
我的问题:
什么是“?”符号用于?
如果我开发了一个php网站,我必须在我的网址中使用它吗?例如,在用户(roa3)成功登录后,我将重定向到“www.website.com/profile.php?user=roa3”而不是“www.website.com/profile.php”
< / LI>使用它的优点和缺点是什么?
答案 0 :(得分:22)
简短的问题,
“?”代表查询的开始 包含数据的字符串 传递给服务器。在这种情况下 你正在传递user = roa3 profile.php页面。你可以得到 内部使用$ _GET ['user']的数据 profile.php。 querystring是从客户端代理向服务器发送数据的方法之一。另一个将数据放在HTTP正文和POST中给服务器,你没有直接从浏览器看到HTTP POST数据。
查询字符串可由用户编辑 它对公众可见。如果 www.website.com/profile.php?user=roa3 本来是公开的 很好,否则你可能想用 获取当前用户的会话 上下文。
这是一种灵活的数据传递方式 服务器,但它是可见的 一些人可以编辑给用户 敏感数据,至少产生 在附加之前的某种哈希 它到了查询字符串,这可以防止 用户编辑或理解 它的意义。不过这个 并不妨碍一个体面的黑客 做错了什么 网站。不同的浏览器支持不同的URL最大长度,冗长的URL由这些查询字符串参数组成。如果要发送大量数据,请将数据放在HTTP正文中并POST到服务器。
答案 1 :(得分:6)
到目前为止,我看到的大多数答案都是用PHP来实现的,而实际上这并不是特定于语言的。到目前为止给出的答案来自PHP的观点,您将用于访问信息的方法因语言而异,但数据在URL中的格式(称为查询字符串)将保留相同(例如:page.ext?key1 = value&amp; key2 = value&amp; ...)。
我不知道你的技术背景或知识,所以请原谅我......
网页有两种不同的方法可以将数据提供回Web服务器。这些被称为POST或GET方法。还有一些其他的,但在处理普通用户时,这些都不应该用于任何类型的网页设计。 POST方法以无形方式发送到服务器,用于“上传”数据,而GET方法对用户可视为URL中的查询字符串,并且只是为了“获取”信息。
并非所有网站都遵循此经验法则,但可能存在原因。例如,一个站点可以专门使用POST来绕过代理服务器或浏览器的缓存,或者因为它们使用双字节语言,并且由于编码转换而在尝试执行GET时会导致问题。
关于这两种方法的一些资源以及何时使用它们......
http://www.cs.tut.fi/~jkorpela/forms/methods.html http://weblogs.asp.net/mschwarz/archive/2006/12/04/post-vs-get.aspx http://en.wikipedia.org/wiki/Query_string
现在从严格的PHP位置,现在有3种不同的数组可用于获取网页发送回服务器的信息。你需要处理......
直接使用$ _REQUEST方法不要马虎。除非你有一个像我上面提到的$ _REQUEST变量的情况,否则不要使用它。在安全性方面,你想尝试使用'拒绝所有,并且只允许x,y,z'方法。只查找您知道自己的网站将要发送的数据,只查找您期望的组合,并在使用之前清除所有信息。例如..
到目前为止,这并不是PHP安全的最终结果,但我们并不是为此而存在的。如果你想了解更多信息,那么那就是SO的另一个问题。
希望这有帮助并随意提出任何问题。
答案 2 :(得分:4)
1)如果用户登录您的网站,您可以使用Sessions存储用户名,而不是将其传递到网址中,例如profile.php?username=roa3
2)在网址中使用?
符号通常被认为对Search Engine Optimization
不利。此外,网址看起来有点难看。使用mod_rewrite,您可以使用profile.php?user=roa3
或products.php?id=123&category=toys
执行与site.com/profile/roa3
或products/toys/123
相同的操作。
默认情况下,使用CodeIgniter框架会为您提供友好的网址,并且无需在您的网址中添加?
。有关示例,请参阅this page。
3) ?
符号也用在php页面的代码中。例如,if else
块,例如:
if ($x==1)
$y=2;
else
$y=3;
也可以写成:
$y=($x==1) ? 2 : 3;
答案 3 :(得分:3)
“?”表示要遵循一些GET变量。您的示例使用名为“user”的变量,并指定一个名为“roa3”的变量。
使用GET变量的优点:
缺点
您还可以使用“&amp;”符号分隔许多变量,例如:
www.website.com/profile.php?user=roa3&fav_colour=blue
其他选择:
POST变量
<form action="index.php" method='post'/>
SESSION变量
COOKIE变量:
与会话变量类似,不同之处在于它们存储在用户的PC上,而不是服务器上。它们是针对域存储的,当它们进入该域时,它们会将请求标头中的变量重新提交给服务器。这意味着用户可以更改和破解变量,或其他人可以。
要在php中访问这些变量,您可以使用:
$x = $_GET['user']
获取获取变量$x = $_POST['user]
$x = $_REQUEST['user']
- get,post和cookie变量的组合$x = $_COOKIE['user']
- Cookie变量$x = $_SESSION['user']
访问会话变量(user
可以替换为您正在使用的变量的名称)
简单的东西,但知道他们实际做了什么很重要。
答案 4 :(得分:1)
?是HTTP标准的一部分,而不是PHP的一部分。以为我应该指出这一点,所以当你转向另一种语言并再次看到它时,你不会因为涉及PHP而感到困惑。
否则上面有一些很好的答案。
答案 5 :(得分:0)
从服务器的角度来看,?只是另一个角色。 PHP为部分URL提供了简单的方法?字符,例如对于“/profile.php?user=roa3”,PHP将设置$ _GET ['user'] ='roa3'。
原因?在URL中有用的是浏览器可以使用表单构建动态URL - 在上面的例子中,我希望URL是由具有字段“user”的HTTP表单构建的,人类用户在其中键入了“roa3”。
答案 6 :(得分:0)
“?”用于分隔URL和参数。例如,它就像http://www.url.com/resourcepath?a=b&c=d。在这种情况下,a = b就像request_parameter = request_value。
Ya,不建议使用大部分参数,因为总网址大小有限,就像GET请求一样,所有参数都显示在网址上,用户可以对其进行修改。在您的示例中,说明如果用户将网址修改为“user = techmaddy”,该怎么办。
优点是它可以用于GET类型的请求。缺点是安全性低,尺寸有限。