我试图将我的数据库中的每个列名存储到它自己的$ _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'];
}
}
答案 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$
前缀。