PHP破坏了验证链接参数的开始

PHP破坏了验证链接参数的开始,php,mysql,database,Php,Mysql,Database,我已经为此奋斗了24个多小时。我已将服务器设置为设置用户帐户,并通过电子邮件向他们发送验证链接。一切都很好,但我遇到了两个字符串变量hash和token的问题,它们的值来自mySql数据库。每次生成电子邮件时,这些变量都会解析其数据,并将前三个字符弄乱: http://verify.myserver.com/objects/1.8.12.7.10.1.9/verify-email.php?mm_function=submit&hashü41faa912dd9451a8d397fc9386

我已经为此奋斗了24个多小时。我已将服务器设置为设置用户帐户,并通过电子邮件向他们发送验证链接。一切都很好,但我遇到了两个字符串变量hash和token的问题,它们的值来自mySql数据库。每次生成电子邮件时,这些变量都会解析其数据,并将前三个字符弄乱:

http://verify.myserver.com/objects/1.8.12.7.10.1.9/verify-email.php?mm_function=submit&hashü41faa912dd9451a8d397fc9386ca1c69&mm_tokenü2rnjrcbhn3qegtu46np03p5pg6aczbtrs51782fkuwq2c8w9m80enutwruydwewca&mm_timezone=2&mm_charset=utf-8
链接应为:

http://verify.myserver.com/objects/1.8.12.7.10.1.9/verify-email.php?mm_function=submit&hash=fc41faa912dd9451a8d397fc9386ca1c69&mm_token=fc22rnjrcbhn3qegtu46np03p5pg6aczbtrs51782fkuwq2c8w9m80enutwruydwewca&mm_timezone=2&mm_charset=utf-8
我尝试过混合和匹配代码,但没有效果。目前,我的代码如下:

$weblink = "http://verify.myserver.com/objects/1.8.12.7.10.1.9/verify-email.php?";
$weblink . "mm_function=submit&hash=" . $hash . "&mm_token=" . $token . "&mm_timezone=" . $timezone . "&mm_charset=utf-8";
奇怪的是,如果我只是把$hash和$token作为电子邮件的一部分,独立于链接,它们都很好

我使用mySql运行InnoDB引擎,DB排序规则是latin7_general_ci


谢谢。

事实证明,电子邮件编码是罪魁祸首。多亏了oktopus,我使用charset=iso-8859-1在标题中修复了它,如下所示:

if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n");

$headers = "From: Some Sender <someone@example.com>". PHP_EOL;
$headers.= "Return-Path: Some Sender <someone@example.com>". PHP_EOL;
$headers.= "Organization: My Organization>". PHP_EOL; 
$headers.= "Content-type: text/plain; charset=iso-8859-1". PHP_EOL;
$headers.= "MIME-Version: 1.0". PHP_EOL;
$headers.= "X-Priority: 3". PHP_EOL;

$weblink = "http://verify.myserver.com/objects/1.8.12.7.10.1.9/process.php?mm_function=submit&";
$weblink.= "mm_hash=$hash&mm_token=$verification&mm_timezone=$timezone&mm_charset=iso-8859-1";

mail($recipient, "Account Verification Link", "Hello $recipient,". PHP_EOL . PHP_EOL ."Please follow the link below to verify and activate your account:". PHP_EOL . PHP_EOL . $weblink . PHP_EOL . PHP_EOL . "Thank you.". PHP_EOL . PHP_EOL . "App Support Team", $headers);
if(!defined(“PHP_EOL”))define(“PHP_EOL”),“\r\n”);
$headers=“发件人:某些发件人”。PHP_EOL;
$headers.=“返回路径:某些发件人”。PHP_EOL;
$headers.=“组织:我的组织>”。PHP_EOL;
$headers.=“内容类型:文本/普通;字符集=iso-8859-1”。PHP_EOL;
$headers.=“MIME版本:1.0”。PHP_EOL;
$headers.=“X优先级:3”。PHP_EOL;
$weblink=”http://verify.myserver.com/objects/1.8.12.7.10.1.9/process.php?mm_function=submit&";
$weblink.=“mm_哈希=$hash&mm_令牌=$verification&mm_时区=$timezone&mm_字符集=iso-8859-1”;
邮件($recipient,“Account Verification Link”,“Hello$recipient,.PHP_EOL.PHP_EOL.”请按照下面的链接验证并激活您的帐户:“.PHP_EOL.PHP_EOL.$weblink.PHP_EOL.PHP_EOL.$headers”);

我的猜测是,您的问题来自数据库(拉丁语)和电子邮件(utf-8)中的不同编码。我以前一直使用拉丁语7\u general\u ci,没有任何问题。这是我第一次做发送验证链接的应用程序。但是,如果变量没有与$weblink字符串关联,为什么变量会发送正确的字符串呢?我将尝试其他排序规则或其他数据库引擎。我建议使用
http\u build\u query()
来构造查询字符串。谢谢Jack。作为一个新手,从社区学到新东西总是很好的。