Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Url未自动解码$\u GET_Php_Get_Urldecode - Fatal编程技术网

Php Url未自动解码$\u GET

Php Url未自动解码$\u GET,php,get,urldecode,Php,Get,Urldecode,我有一段代码,它检查2$\u GET变量与preg\u匹配。它还会在数据库中查找一个变量值。问题是,当我调用变量时,url编码的电子邮件地址和用%40替换的@符号没有返回为可读文本 因此,如果我调用$_GET['email'],显示的值是someone%40example.com,而它应该是someone@example.com 我知道$\u GET变量会自动解码,但它对我不起作用。此问题是在该域上安装SSL时出现的。这可能与此有关吗 这是我的密码: if (isset($_GET['Email

我有一段代码,它检查2$\u GET变量与preg\u匹配。它还会在数据库中查找一个变量值。问题是,当我调用变量时,url编码的电子邮件地址和用%40替换的@符号没有返回为可读文本

因此,如果我调用$_GET['email'],显示的值是someone%40example.com,而它应该是someone@example.com

我知道$\u GET变量会自动解码,但它对我不起作用。此问题是在该域上安装SSL时出现的。这可能与此有关吗

这是我的密码:

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', $_GET['Email'])) {
  $Email = $_GET['Email'];
}
你需要把URL解码

做这样的事

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', urldecode($_GET['Email']))) 
{
  $Email = urldecode($_GET['Email']);
}

此外,这不是验证电子邮件的正确方法。请检查您发送的内容类型标题。如果您正在提交表单,那么您可能应该在表单中使用application/x-www-form-urlencoded类型来告诉PHP数据是URL编码的,应该自动解码。除非您提交文件上载,在这种情况下,多部分/表单数据是合适的,并且可能需要使用urldecode手动解码内容,具体取决于实际发送的方式。您可以检查$\u服务器['CONTENT\u TYPE'],以帮助您通过编程确定是否需要手动解码

其他几点建议:

您可能应该考虑使用POST来代替GET,除非您的预期是这是一个可通航的页面或端点,与该电子邮件地址相关,也就是说有人可以签书签。认为GET操作是从查询字符串和POST指定的位置读取某些内容,这些内容与使某些特定操作与发布的数据相关

您应该考虑使用FieldVaR或FieldId输入与电子邮件验证过滤器而不是正则表达式。

建议的用法是:

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
if(false === $email) {
    // validation failed
}
// or
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
if(is_null($email) {
    // key was not present in GET params
} else if (false === $email) {
    // validation failed
}

这不是电子邮件地址,因为:我同意@PeeHaa的评论,我强烈建议使用filter\u var$\u GET['email',filter\u VALIDATE\u email您是否正在处理输入表单?是否将多部分/表单数据内容类型与表单一起使用?您需要application/x-www-form-urlencoded content-type来向PHP发出需要解码内容的信号。@PeeHaa。。。你能给我点urldecode方法吗???我真的不应该对那些抱怨被否决票的人做出反应,但为了它的价值,我在你删除关于正确方式的错误陈述的那一刻删除了我的否决票。所以
$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
if(false === $email) {
    // validation failed
}
// or
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
if(is_null($email) {
    // key was not present in GET params
} else if (false === $email) {
    // validation failed
}