循环MySQL结果并将值保存到$ _SESSION

时间:2013-08-10 00:55:42

标签: php mysql loops for-loop while-loop

我试图将我的数据库中的每个列名存储到它自己的$ _SESSION中。例如,假设我的列名是column_one,column_two,column_three,column_four和column_five。我希望这些存储在$ _SESSION中,如$ _SESSION ['column_one'],$ _SESSION ['column_two']等。我试图在循环中执行此操作,但我没有成功。我如何设置循环来实现这一目标?

$query = "SELECT * FROM table WHERE user_id = $id";
$result = mysqli_query($dbc, $query);
$num = mysqli_num_rows($result);

if ($num == 1) {

    //User was found
    while($row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
        $_SESSION['user_id'] = $row['user_id'];
    }

}

3 个答案:

答案 0 :(得分:3)

你可以试试这个:

$id = mysqli_real_escape_string($dbc,$id);
$query = "SELECT * FROM table WHERE user_id = $id";
$result = mysqli_query($dbc, $query);
$num= mysqli_num_rows(result);
if ($num == 1) {
    $row = mysqli_fetch_assoc($result);
    $_SESSION['UserData'] = $row;
}else{
//handle error or user not found
}

echo '<pre>';
print_r($_SESSION['UserData']);
echo '</pre>';

你没有必要使用while或other循环,所以只有一行

答案 1 :(得分:2)

这样的事情应该有效:

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    foreach($row as $column => $value) {
        $_SESSION[$column] = $value;
    }
}

防止SQL注入的额外建议,有以下两行:

$id = mysqli_real_escape_string($dbc, $id);
$query = "SELECT * FROM table WHERE user_id = '$id'";

更新:

感谢EmilioGort指出mysqli_real_escape_string中缺少的连接参数。请参阅mysqli_real_escape_string文档。

答案 2 :(得分:0)

虽然其他答案提出了一种方法,但我强烈建议不要这样做。为什么呢?

首先,$row包含定义良好的数组形式的用户的所有详细信息。通常很好地保持这种结构的准备。

更重要的是:展平$ row可能会导致名称冲突,如下所示:

假设$row有一个属性userName,并且您的应用程序中的其他位置最终设置了

$_SESSION[ 'userName' ] = $newUserName;

$_SESSION[ 'userName' ] 的新作业可能会无意中更改在登录过程中保存的属性。

您可能会说“现在,我的代码在$_SESSION中没有使用userName。”对!不幸的是,您可能会在几个月后使用此名称作为其他内容...

更好的解决方案

我会像这样保存用户详细信息:

$_SESSION[ 'sys$userDetails' ] = $row;

假设前缀sys$是框架生成的会话属性的指示符。

因此,与业务逻辑相关的会话数据不应具有sys$前缀。