php if语句随机失败
php if statement random failure
我正在为我的网站制作一个电子邮件激活页面,但遇到了问题。似乎尽管页面收到了显示成功激活消息所需的所有信息,但它随机决定显示错误消息,指出凭据与数据库中的任何内容都不匹配。这是代码
// Check their credentials against the database
try {
$check = $db->prepare("SELECT * FROM users WHERE id= ? AND username = ? AND email = ? AND user_ident = ? AND activated = '1' AND email_activated = '0' LIMIT 1");
$check->bindParam(1, $id);
$check->bindParam(2, $u);
$check->bindParam(3, $e);
$check->bindParam(4, $p);
$check->execute();
$num_rows = $check->rowCount();
} catch(Exception $er){
// ERROR : COULD NOT INSERT EMAIL INTO USERS TABLE
Send_email('support@site.com', 'check user - email activation failure', 'Could not check user '.$er);
exit;
}
// Evaluate for a match in the system (0 = no match, 1 = match)
if($num_rows === 0){
Send_email('support@site.com', 'email activation credentials no match', 'invalid email activation variables.<br/> email: '.$e.'<br/>userid: '.$id.'<br/>username: '.$u.'<br/>user_ident: '.$p);
header("location: message.php?msg=Your credentials are not matching anything in our system");
exit();
}
// Match was found, you can activate them
try {
$checking = $db->prepare("UPDATE users SET email_activated = 1 WHERE id= ? LIMIT 1");
$checking->bindParam(1, $id);
$checking->execute();
} catch (Exception $er){
// ERROR : COULD NOT INSERT EMAIL INTO USERS TABLE
Send_email('support@site.com', 'Email add error', 'Could not set active state '.$er);
exit;
}
所以有时,当点击电子邮件中的激活 link 时,它会正常工作,但有时它会抛出错误,指出凭据与数据库中的任何内容都不匹配,但是当我检查时单击 link 后立即显示数据库,email_activated 字段已更新以显示它已被激活。
这在技术上不应该发生,因为如果我正确地执行此操作,页面将在抛出凭据错误后退出,这意味着 email_activated 更新代码甚至不应该 运行。
看起来它可能 运行ning 两次,但我使用了一个计数器,它只显示一个 运行。
任何帮助都会很棒!
好吧,您的第一个查询中有很多过滤器。即:
id= ? AND username = ? AND email = ? AND user_ident = ? AND activated = '1' AND email_activated = '0'
而你只有第二个:
id= ?
如果查询完全不同,您就不能期待相同的结果。第一个查询中的一个项目显然无法匹配,但由于您的第二个查询忽略了除 "id" 之外的所有项目,它会继续并更新行。
PDO rowCount 不适合您的目的。检查 - http://php.net/manual/en/pdostatement.rowcount.php
"PDOStatement::rowCount() returns 受相应 PDOStatement 对象执行的 最后 DELETE、INSERT 或 UPDATE 语句 影响的行数。
如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,一些数据库可能 return 行数 return由该声明编辑。但是,不能保证所有数据库都具有这种行为,并且便携式应用程序不应依赖这种行为."
请参阅此 SO question too,以便更好地理解场景。
可能是浏览器正在缓存重定向。尝试明确指定这是“302 Found”重定向。
header('HTTP/1.1 302 Found');
header('Location: /your-location');
或按照您的建议包括所有缓存 headers:
header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
我正在为我的网站制作一个电子邮件激活页面,但遇到了问题。似乎尽管页面收到了显示成功激活消息所需的所有信息,但它随机决定显示错误消息,指出凭据与数据库中的任何内容都不匹配。这是代码
// Check their credentials against the database
try {
$check = $db->prepare("SELECT * FROM users WHERE id= ? AND username = ? AND email = ? AND user_ident = ? AND activated = '1' AND email_activated = '0' LIMIT 1");
$check->bindParam(1, $id);
$check->bindParam(2, $u);
$check->bindParam(3, $e);
$check->bindParam(4, $p);
$check->execute();
$num_rows = $check->rowCount();
} catch(Exception $er){
// ERROR : COULD NOT INSERT EMAIL INTO USERS TABLE
Send_email('support@site.com', 'check user - email activation failure', 'Could not check user '.$er);
exit;
}
// Evaluate for a match in the system (0 = no match, 1 = match)
if($num_rows === 0){
Send_email('support@site.com', 'email activation credentials no match', 'invalid email activation variables.<br/> email: '.$e.'<br/>userid: '.$id.'<br/>username: '.$u.'<br/>user_ident: '.$p);
header("location: message.php?msg=Your credentials are not matching anything in our system");
exit();
}
// Match was found, you can activate them
try {
$checking = $db->prepare("UPDATE users SET email_activated = 1 WHERE id= ? LIMIT 1");
$checking->bindParam(1, $id);
$checking->execute();
} catch (Exception $er){
// ERROR : COULD NOT INSERT EMAIL INTO USERS TABLE
Send_email('support@site.com', 'Email add error', 'Could not set active state '.$er);
exit;
}
所以有时,当点击电子邮件中的激活 link 时,它会正常工作,但有时它会抛出错误,指出凭据与数据库中的任何内容都不匹配,但是当我检查时单击 link 后立即显示数据库,email_activated 字段已更新以显示它已被激活。 这在技术上不应该发生,因为如果我正确地执行此操作,页面将在抛出凭据错误后退出,这意味着 email_activated 更新代码甚至不应该 运行。 看起来它可能 运行ning 两次,但我使用了一个计数器,它只显示一个 运行。 任何帮助都会很棒!
好吧,您的第一个查询中有很多过滤器。即:
id= ? AND username = ? AND email = ? AND user_ident = ? AND activated = '1' AND email_activated = '0'
而你只有第二个:
id= ?
如果查询完全不同,您就不能期待相同的结果。第一个查询中的一个项目显然无法匹配,但由于您的第二个查询忽略了除 "id" 之外的所有项目,它会继续并更新行。
PDO rowCount 不适合您的目的。检查 - http://php.net/manual/en/pdostatement.rowcount.php
"PDOStatement::rowCount() returns 受相应 PDOStatement 对象执行的 最后 DELETE、INSERT 或 UPDATE 语句 影响的行数。
如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,一些数据库可能 return 行数 return由该声明编辑。但是,不能保证所有数据库都具有这种行为,并且便携式应用程序不应依赖这种行为."
请参阅此 SO question too,以便更好地理解场景。
可能是浏览器正在缓存重定向。尝试明确指定这是“302 Found”重定向。
header('HTTP/1.1 302 Found');
header('Location: /your-location');
或按照您的建议包括所有缓存 headers:
header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');