【问题标题】:Looping through MySQL results and saving values to a $_SESSION循环遍历 MySQL 结果并将值保存到 $_SESSION
【发布时间】:2013-08-12 00:44:55
【问题描述】:

我正在尝试将数据库中的每个列名存储到它自己的 $_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'];
    }

}

【问题讨论】:

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


    【解决方案1】:

    你可以试试这个:

    $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 或另一个循环,所以只有一行

    【讨论】:

      【解决方案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 文档。

      【讨论】:

      • 你错过了value上的$->$_SESSION[$column] = value;
      • mysqli_real_escape_string($dbc,$id) 中缺少连接参数
      【解决方案3】:

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

      首先$row 以定义明确的数组形式包含用户的所有详细信息。准备好这个结构通常是件好事。

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

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

      $_SESSION[ 'userName' ] = $newUserName;
      

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

      您可能会争辩说“现在,我的代码没有在 $_SESSION' 中使用用户名。是的!不幸的是,您可能会在很多个月后只使用这个名称来做其他​​事情......

      更好的解决方案

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

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

      将前缀sys$ 想象为会话的框架生成属性的指示符。

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

      【讨论】:

      • $_SESSION['UserData'] = $row;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2016-10-05
      • 2010-12-17
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多