условный — php if оператор случайный сбой

Я собираю страницу активации по электронной почте для моего сайта и имею проблемы. Кажется, что несмотря на то, что страница получает всю необходимую информацию для отображения сообщения об успешной активации, она случайным образом решает показать сообщение об ошибке, в котором говорится, что учетные данные не совпадают с данными в базе данных. вот код

 // 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;
}

Так что иногда, если щелкнуть ссылку активации в сообщении электронной почты, она будет работать нормально, а в других случаях выдает ошибку, говорящую о том, что учетные данные не совпадают с чем-либо в базе данных ОДНАКО, когда я проверяю базу данных сразу после нажатия на ссылку, Поле email_activation обновлено, чтобы показать, что оно было активировано.
Технически это не должно происходить, так как, если я делаю это правильно, страница закроется после появления ошибки учетных данных, то есть код обновления email_activation никогда не должен запускаться.
Кажется, что он может быть запущен дважды, но я использовал счетчик, и он показывает только один прогон.
любая помощь будет отличной!

0

Решение

Возможно, браузер кеширует редирект. Попробуйте явно указать, что это перенаправление «302 найдено».

header('HTTP/1.1 302 Found');
header('Location: /your-location');

Или включите все заголовки кэширования, как вы предложили:

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');
1

Другие решения

Ну, у вас есть куча дополнительных фильтров в вашем первом запросе. То есть:

id= ? AND username = ? AND email = ? AND user_ident = ? AND activated = '1' AND email_activated = '0'

В то время как у вас есть только один во втором:

id= ?

Вы не можете ожидать одинаковых результатов, если запросы совершенно разные. Один из элементов в первом запросе явно не соответствует, но поскольку ваш второй запрос игнорирует все, кроме «id», он идет вперед и обновляет строку.

1

PDO rowCount не подходит для ваших целей. Проверьте — http://php.net/manual/en/pdostatement.rowcount.php

«PDOStatement :: rowCount () возвращает количество строк, затронутых последний оператор DELETE, INSERT или UPDATE выполняется соответствующим объектом PDOStatement.

Если последний оператор SQL, выполненный связанным PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором. Однако такое поведение не гарантируется для всех баз данных и не должно использоваться для переносимых приложений.

Видеть это ТАК вопрос тоже, для лучшего понимания сценария.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector