将 PDO::FETCH_ASSOC 结果分配给 $_SESSION 变量


Assigning PDO::FETCH_ASSOC result to a $_SESSION variable

我有一个登录页面,收集登录时映射某个用户的客户端。

$query_acct = "select client from app_reports.user_map where user_name = '".$username."'";
$acct = $DB_con->prepare($query_acct);
$acct->execute();
$row_acct = $acct->fetchAll(PDO::FETCH_ASSOC);
if (!empty($row_acct['client'])){
    foreach($row_acct as $r) {
        $client[] = $r['client'];
    }
    $_SESSION['client'] = $client;
}

据我了解,$_SESSION['client']应该存储存储在$client中的数组。但是当我尝试打印出来时:

foreach($_SESSION['client'] as $key=>$value){
    // and print out the values
    echo 'The value of $_SESSION['."'".$key."'".'] is '."'".$value."'".' <br />';
}

我得到:

注意:未定义的索引:客户端

警告:为 foreach() 提供的参数无效

我想获得一些有关如何在会话中正确存储数组的建议,以便我可以打印出来(将用作下拉列表等)

fetchAll()返回一个数组(可能是一个空数组)。

结合 PDO::FETCH_ASSOC 参数,如果数组不为空,则它将包含关联数组的索引数组。

这在逻辑上意味着!empty($row_acct['client'])永远无法满足。 或者,可能存在$row_acct[0]['client']

仅仅因为查询逻辑可以保证结果集中为零行或一行,并不意味着 pdo 会为你返回平坦行。

此外,你永远不会在有条件执行的循环之外声明$client,所以 php 对未声明的变量吠叫也就不足为奇了。

因此,让我们从头开始。

  1. 在编写 mysql 关键字/函数时始终使用全部大写。
  2. 预准备语句是无用的开销,除非您将值绑定到占位符。事实上,您的查询可能不稳定/不安全,因为您将变量直接写入 sql。
  3. 使用 fetch() 访问结果集的单行。 如果结果集为空,则返回值将为 false

建议代码:

$sql = "SELECT client
        FROM app_reports.user_map 
        WHERE user_name = ?";
$stmt = $DB_con->prepare($sql);
$stmt->execute([$username]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) { // no row = false
    $_SESSION['client'] = $row['client'];
}