Невозможно установить переменные сеанса

0

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

Вот мой код:

$user_data = array(); 

$get_user_data = "SELECT 
  user_id
, user_level
, user_type
FROM users 
WHERE user_name = :user_name";
$query = $pdo->prepare($get_user_data);
$query->bindParam(":user_name", $username); 
$query->execute();     
while($row = $query->fetch(PDO::FETCH_ASSOC)){
    $user_id =$row['user_id'];
    $user_level =$row['user_level'];
    $user_type =$row['user_type'];

//do something with the variables
    $_SESSION['user_id'] = $user_id;
    $_SESSION['user_level'] = $user_level;
    $_SESSION['user_type'] = $user_type;

// var_dump inside the brackets here returns the variable values fine

}

// var_dump outside the brackets here returns the variables as NULL

Это полный код для страницы:

<?php 
session_start();

    error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

//include config
require_once('includes/config.php');
//include header template
require('includes/header.php');

//check if already logged in move to home page
if( $user->is_logged_in() ){ 
    echo '<div id="errors">You are already logged in. </div>'; 

} 

//process login form if submitted
if(isset($_POST['submit'])){

    $username = $_POST['user_name'];
    $password = $_POST['user_password'];

    if($user->login($username,$password)){ 
        $_SESSION['user_name'] = $username; // set session variable of username to that of logged in user

    $user_data = array(); 

    $get_user_data = "SELECT 
      user_id
    , user_level
    , user_type
    FROM users 
    WHERE user_name = :user_name";
    $query = $pdo->prepare($get_user_data);
    $query->bindParam(":user_name", $username); 
    $query->execute();     
    while($row = $query->fetch(PDO::FETCH_ASSOC)){
        $user_id =$row['user_id'];
        $user_level =$row['user_level'];
        $user_type =$row['user_type'];

    //do something with the variables
        $_SESSION['user_id'] = $user_id;
        $_SESSION['user_level'] = $user_level;
        $_SESSION['user_type'] = $user_type;

    // var_dump inside the brackets here returns the variable values fine

    }

    // var_dump outside the brackets here returns the variables as NULL

        // ordinarily I redirect the user, but for testing this is turned off. 
        //header('Location: chapter.php');
        //exit;

    } else {
        $error[] = 'Wrong username or password or your account has not been activated.';
    }

}//end if submit

//define page title
$title = 'Login'; 
?>
<div id = "wrapper">
            <div id = "errors">
            <?php         
            var_dump($row['user_id']);
            var_dump($row['user_level']);
            var_dump($row['user_type']);
            var_dump($_SESSION['user_name']);
            ?></div>
            <form role="form" method="post" action="" autocomplete="off">
                <?php
                //check for any errors
                if(isset($error)){
                    foreach($error as $error){
                        echo '<p class="bg-danger">'.$error.'</p>';
                    }
                }

                if(isset($_GET['action'])){

                    //check the action
                    switch ($_GET['action']) {
                        case 'active':
                            echo "<h2 class='bg-success'>Your account is now active you may now log in.</h2>";
                            break;
                        case 'reset':
                            echo "<h2 class='bg-success'>Please check your inbox for a reset link.</h2>";
                            break;
                        case 'resetAccount':
                            echo "<h2 class='bg-success'>Password changed, you may now login.</h2>";
                            break;
                    }

                }


                ?>

                <div id = "form-section">
                    <div id = "form-header"><img src="img/ds-icon20px.png"> Log in.</div><HR SIZE = "1" WIDTH="100%" NOSHADE>
                    <small>Username: </small><br />
                    <input type="text" name="user_name" id="username" placeholder="User Name" value="<?php if(isset($error)){ echo $_POST['user_name']; } ?>" tabindex="1">
                    <small>Password: </small><br />
                    <input type="password" name="user_password" id="password" placeholder="Password" tabindex="2">
                    <br /><br />
                    <input type="submit" name="submit" value="Login" tabindex="3"> <a href='reset.php'>Forgot your Password?</a>
                </div>
            </form>
    </div>
<?php 
//include footer template
require('includes/footer.php'); 
?>
  • 2
    Добавьте session_start() вверху вашего кода.
  • 0
    Это только часть моего кода. Я не хотел публиковать всю страницу, потому что проблема, похоже, заключается только в той части, которая вызывает БД. Я добавил код на всю страницу ниже моего первого раздела.
Показать ещё 3 комментария
Теги:
session

2 ответа

1
Лучший ответ

Извините, не вписывался в комментарий

игнорируя сеансы в течение секунды. Если вы объявляете переменную до вашего цикла while, как $ testdata = 'beforeforewhile'; затем установите значение $ user_id. Существует ли это через некоторое время?

$testdata='beforewhile';
while($row = $query->fetch(PDO::FETCH_ASSOC)){
echo 'FIRST '.$testdata;
    $user_id =$row['user_id'];
    $user_level =$row['user_level'];
    $user_type =$row['user_type'];

//do something with the variables
    $_SESSION['user_id'] = $user_id;
    $_SESSION['user_level'] = $user_level;
    $_SESSION['user_type'] = $user_type;
$testdata=$user_id;
// var_dump inside the brackets here returns the variable values fine
echo 'LAST '.$testdata;
}
echo 'after '.$testdata;
  • 0
    Он существует после цикла while, но теперь в нем есть user_id ... так что же означает этот вопрос?
  • 0
    Я имею в виду, у вас может быть какая-то удивительная мысль ... но для меня не очевидно, к чему вы клоните.
Показать ещё 12 комментариев
0

Ваши переменные существуют только внутри во while цикла, попробуйте определения их снаружи и перед петлей.

Вы устанавливаете значение каждой переменной несколько раз, я думаю, вам нужно использовать массив для хранения всех строк:

$rowList = array();
while($row = $query->fetch(PDO::FETCH_ASSOC)){
    $rowList[] = $row;
}

Затем вы можете показать такие значения:

 echo $rowList[0]['user_id'];
 echo $rowList[0]['user_level'];

Если ваш запрос возвращает только одну строку, которую можно использовать, if вместо того, чтобы while:

$user_id = null;
$user_level = null;
$user_type = null;
if($row = $query->fetch(PDO::FETCH_ASSOC)){
    $user_id =$row['user_id'];
    $user_level =$row['user_level'];
    $user_type =$row['user_type'];

    //do something with the variables
    $_SESSION['user_id'] = $user_id;
    $_SESSION['user_level'] = $user_level;
    $_SESSION['user_type'] = $user_type;
}

var_dump($user_id);
var_dump($user_level);
var_dump($user_type);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню