Переменная сеанса не соответствует переменной таблицы базы данных - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь отобразить значение для этого: $supoints = $_SESSION['upoints'];.Но отображаемое на странице значение не совпадает со значением в базе данных.

Это моя страница index.php:

<?php
session_start();
require 'dbpdo.php';
$sid = $_SESSION['userid'];
$supoints = $_SESSION['upoints'];
?>
<h3>index.php page</h3>
<?php echo $supoints; ?>
<form action="pointshand.php" method="post">
    <input name="buycshamt">
    <button type="submit" name="buyptsbut">Buy</button>
</form>

Все, что делает форма, это передает значение<input name="buycshamt"> в столбце таблицы моей базы данных upoints.Моя таблица базы данных users выглядит следующим образом:

userid | username | upass | upoints
   1   |  user1   | pass1 |  100

Она не будет совпадать, поскольку при первом входе пользователя значение для $supoints равно 100, ОДНАКО, когда пользователь вводитновое значение для <input name="buycshamt">, например 300, и сообщает, что это новое значение будет обновлено в таблице users, но НЕ в переменной $supoints.$supoints останется как 100 на веб-странице, но в таблице он успешно обновится до 100 + 300, что равно 400 (то есть число, которое должно отображаться на веб-странице.Что вызывает такое поведение, которое препятствует обновлению значения для $supoints?

Это мой pointshand.php, который вставляет входное значение в мою таблицу базы данных:

<?php
session_start();
require 'dbpdo.php';
if(isset($_POST['buyptsbut'])) {
    $buycshamt = $_POST['buycshamt'];
    $sid = $_SESSION['userid'];
    $stmt = $pdo->prepare("UPDATE users2 SET upoints=upoints+? WHERE userid=?");
    $stmt->bindParam(1, $buycshamt);
    $stmt->bindParam(2, $sid);
    $stmt->execute();
    $stmt = null;
    header('Location: index.php'); exit();
}
$pdo = null;
?>

И этомой signinhand.php, который регистрирует пользователя с переменными сеанса:

<?php
if (isset($_POST['login'])) {
    require 'dbpdo.php';
    $useremail = $_POST['useremail'];
    $password = $_POST['password'];
    if (!empty($useremail) || !empty($password)) {
        $stmt = $pdo->prepare("SELECT userid, username, upoints, upass FROM users2 WHERE username=?");
        $stmt->bindParam(1, $useremail, PDO::PARAM_STR);
        $stmt->execute();
        $rows = $stmt->fetchAll();
        foreach ($rows as $row) {
            $sid = $row['userid'];
            $sname = $row['username'];
            $supoints = $row['upoints'];
            $supass = $row['upass'];
        }
        $stmt = null;
        $pwdCheck = password_verify($password, $supass);
        if ($pwdCheck == true) {
            session_start();
            $_SESSION['userid'] = $row['userid'];
            $_SESSION['username'] = $row['username'];
            $_SESSION['upoints'] = $row['upoints'];
            header("Location: index.php?login=success");
            exit();
        }
    }
}
$pdo = null;
?>

1 Ответ

0 голосов
/ 20 сентября 2019

Если вы хотите, чтобы значение в сеансе синхронизировалось с базой данных, вам необходимо обновить оба одновременно.

Это будет сделано в вашем файле pointshand.php, где вы обрабатываетеОтправка формы и обновление БД.Это лучше всего делать в транзакции, чтобы избежать гоночных условий на ваших данных.Например

$buycshamt = $_POST['buycshamt'];
$sid = $_SESSION['userid'];
$pdo->beginTransaction();
try {
    $stmt = $pdo->prepare('UPDATE users2 SET upoints = upoints + ? WHERE userid = ?');
    $stmt->bindParam(1, $buycshamt, PDO::PARAM_INT); // make sure it's handled as an int
    $stmt->bindParam(2, $sid);
    $stmt->execute();

    // fetch the updated value
    $stmt = $pdo->prepare('SELECT upoints FROM users2 WHERE userid = ?');
    $stmt->execute([$sid]);
    $_SESSION['upoints'] = $stmt->fetchColumn(); // update the value in the session
    $pdo->commit();

    header('Location: index.php');
    exit();
} catch (PDOException $e) {
    $pdo->rollBack();
    throw $e;
}
...