Я уже несколько месяцев пытаюсь отследить ошибку в моем программном обеспечении, но безуспешно. Все сводится к одному запросу на обновление в PHP PDO, который, кажется, выполняется, с правильными данными, и, тем не менее, он не обновляется, так как «rowcount» возвращает 0.
Кажется совершенно случайным, 99% времени он работает идеально. 1% просто не обновляется, и я буквально не знаю почему.
Для справки, вот код на случай, если кто-то заметит, что я делаю что-то действительно глупое. Часть, которая имеет проблемы, - это то, где она обновляет таблицу «save_sessions».
// if they have a stay logged in cookie log them in
function stay_logged_in()
{
if (isset($_COOKIE['session']))
{
$session_check = $this->db->run("SELECT `session_id`, `device-id`, `user_id`, `expires` FROM `saved_sessions` WHERE `session_id` = ? AND `expires` > NOW()", array($_COOKIE['session']))->fetch();
if ($session_check)
{
// login then
$this->user_details = $this->db->run("SELECT ".$this::$user_sql_fields." FROM `users` WHERE `user_id` = ?", array($session_check['user_id']))->fetch();
$this->check_banned();
// update IP address and last login
$this->db->run("UPDATE `users` SET `ip` = ?, `last_login` = ? WHERE `user_id` = ?", array(core::$ip, core::$date, $this->user_details['user_id']));
// update their stay logged in cookie with new details
$generated_session = md5(time() . mt_rand() . $this->user_details['user_id'] . $_SERVER['HTTP_USER_AGENT']);
$expires_date = new DateTime('now');
$expires_date->add(new DateInterval('P30D'));
$update_session_sql = "UPDATE
`saved_sessions`
SET
`session_id` = ?,
`expires` = ?
WHERE
`session_id` = ? AND `user_id` = ?";
$update_session_db = $this->db->run($update_session_sql, array($generated_session, $expires_date->format('Y-m-d H:i:s'), $_COOKIE['session'], $session_check['user_id']));
$check_update = $update_session_db->rowcount();
// database was updated, so we can update the cookie
if($check_update == 1)
{
$cookie_domain = false; // allows cookies for localhost dev env
$secure = 0; // allows cookies for localhost dev env
if (!empty($this->core->config('cookie_domain')))
{
$cookie_domain = $this->core->config('cookie_domain');
$secure = 1;
}
setcookie('session', $generated_session, time()+$this->cookie_length, '/', $cookie_domain, $secure);
}
else
{
// logging for me to attempt to check the details match up (which they always seem to do!)
error_log("Couldn't update saved session for user_id " . $session_check['user_id'] . "\n" . "Current user session data: \n" . print_r($session_check, true) . "\nUser cookie data: " . $_COOKIE['session'] . "\n Database info: " . print_r($update_session_db, true));
}
$this->register_session($generated_session, $session_check['device-id']);
return true;
}
else
{
setcookie('session', "", time()-60, '/');
setcookie('device', "", time()-60, '/');
return false;
}
}
else
{
return false;
}
}