PHP PDO:从查询中获取第一列

时间:2013-11-19 09:40:59

标签: php pdo

我有一个非常愚蠢的问题,但我无法立即开始工作 如何使用单个PDO语句仅将查询结果数组的一个字段加载到会话(数组)中? 我评论了下面缺少的代码:

public function getPermissions($user_role_id){
    if(!isset($user_role_id) || empty($user_role_id)){ 
        $_SESSION['user']['user_permissions'] = '';
    }else{
        $db = Database::get_database();
        $query = "
            SELECT 
                rp.role_id, rp.permission_id 
            FROM 
                role_permission_tbl rp 
            WHERE
                rp.role_id = :role_id"; 

            $query_params = array( 
                ':role_id' => $user_role_id
            );

            try 
            {
                $stmt = $db->prepare($query); 
                $result = $stmt->execute($query_params); 
            } 
            catch(PDOException $ex) 
            { 
                 die("Failed to run query: " . $ex->getMessage());
            }

            $row = $stmt->fetchAll();
            if($row){
                //I only want to retrieve the field "permission_id" 
                $_SESSION['user']['user_permissions'] = $row;
            }else{
                $_SESSION['user']['user_permissions'] = '';
            }
        }
}

谢谢

3 个答案:

答案 0 :(得分:4)

看到您以后的评论后,您似乎想要将所有权限数据保存在会话变量中,以便您可以通过权限ID查找:

$rows = $stmt->fetchAll();
foreach($rows as $row){
    //Add to session, keyed by permission ID.
    $_SESSION['user']['user_permissions'][$row['permission_id']] = $row;
}

//Then, if you want to see if said permission ID #21 exists:
if(isset($_SESSION['user']['user_permissions'][21])){
    echo 'This user has permissions with ID 21!';
    $permissionDetails = $_SESSION['user']['user_permissions'][21];
    var_dump($permissionDetails);
}

答案 1 :(得分:1)

如果只从表中获取一条记录,您可以尝试$row = $stmt-> fetch();而不是$row = $stmt->fetchAll();

 $row["permission_id"];

答案 2 :(得分:1)

与任何其他“立即行动”一样,这个问题具有矛盾的条件 与任何其他PHP代码一样,它比所需的长十倍 像许多其他SO问题一样,它可以通过快速手动查找来解决。

如果您需要数组

中的权限
public function getPermissions($user_role_id){
    $sql = "SELECT permission_id FROM role_permission_tbl WHERE role_id = ?"; 
    $stm = Database::get_database()->prepare($sql);
    return $stm->execute(array($user_role_id))->fetchAll(PDO::FETCH_COLUMN);
}

请注意,在函数内部分配变量是一种非常糟糕的做法。所以,最好这样称呼它

$_SESSION['user']['user_permissions'] = $user->getPermissions($user_role_id);
  • isset()与empty()无关,后者覆盖前者。
  • isset()和empty()对函数变量也没用,因为它总是由设计设置
  • 可以对此特定输入变量进行验证,但对于设计合理的应用程序,则不需要。
  • 将要使用in_array()测试的变量设置为空字符串将产生错误。
  • 单个表的别名没有用处。
  • PDO方法可以被大大缩短的方式调用,没有用于将一个简单的查询调用拉伸到整个代码屏幕。
  • 向站点用户回显系统错误消息是一种糟糕的做法。
  • fetchAll()的手册页包含了从查询结果中获取单列这一问题的确切示例。
  • 没有明确测试返回值的用法,因为它已经包含结果或空值(幸运的是,fetchAll()将返回所需类型的空值)。