php pdo: получение более подробной информации из заявления об обновлении - PullRequest
0 голосов
/ 07 января 2019

Я уже несколько месяцев пытаюсь отследить ошибку в моем программном обеспечении, но безуспешно. Все сводится к одному запросу на обновление в 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...