【问题标题】:how to change array scheme result of a query?如何更改查询的数组方案结果?
【发布时间】:2017-04-30 01:39:02
【问题描述】:
class user{

protected $permissions;

public function can( $permission )
    {
        if (!isset($this->permissions)) {
            /*
             fetch permissions for this user from the database, and set the
             User::permissions property, to allow caching.
             */
            $cnx = $this->connexion();
            $stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id');
            $stmt->bind_param('s', $_SESSION["user_id"]);
            $stmt->execute();
            $result = $stmt->get_result();

            $people = array("Peter", "Joe", "Glenn", "Cleveland");
            var_dump($people);
            $this->permissions= $result->fetch_all(MYSQLI_ASSOC);    

            var_dump($this->permissions);    
        }

        return in_array($permission, $this->permissions);
    }
}

(方案1)数组的结果如下所示:

array (size=8)
  0 => 
    array (size=1)
      'permission_name' => string 'Peut créer une permission' (length=26)
  1 => 
    array (size=1)
      'permission_name' => string 'Peut modifier une permission' (length=28)
  2 => 
    array (size=1)
      'permission_name' => string 'Peut voir des comptes utilisateurs' (length=34)

我试过fetch_array而不是fetch_all,但它只返回一行

(方案 2)无论如何都可以使该数组看起来像这样,因为如果这样做,它将起作用:

array (size=4)
  0 => string 'Peter' (length=5)
  1 => string 'Joe' (length=3)
  2 => string 'Glenn' (length=5)

实例化用户

$that_guy = new user();
if ( $that_guy->can('Peut créer une permission')) {
  echo"yay";
}else {
  echo"you can't";
}

有没有办法改变方案1的数组,让它看起来像方案2的数组?

【问题讨论】:

  • 不清楚实际问题出在哪里!?什么没有按预期工作?
  • 对于最后一个代码,我总是必须使用循环来获取权限名称,我想要将第一个代码转换为 mysqli
  • 为什么不在你的 sql 中过滤呢?
  • 或者你翻转返回的数组得到$permissions = Array('edit'=>true, 'read'=>true, 'delete'=>false)
  • 我想你可以用return $stmt->fetchAll();替换:$result = $stmt->get_result(); $stmt->bind_result($user_id); $stmt->store_result(); while($t=$stmt->fetch()){ $result[]=$t; } return $result;

标签: php mysql arrays oop mysqli


【解决方案1】:

遍历数组

public function can( $permission )
        {
            if (!isset($this->permissions)) {

                $cnx = $this->connexion();
                $stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id');
                $stmt->bind_param('s', $_SESSION["user_id"]);
                $stmt->execute();

                $result = $stmt->get_result();
                $stmt->bind_result($permission_name);
                $stmt->store_result();


                $this->permissions = array();
                while(($row = $result->fetch_assoc())) {
                    $this->permissions[] = $row['permission_name'];
                }


            }

            return in_array($permission, $this->permissions);
        }

结果会如您所愿(方案 2)

【讨论】:

  • 谢谢你,我已经尝试过你的解决方案,它就像魅力循环一样有效
【解决方案2】:

使用 mysqli 是不可能的,这是你应该使用 PDO 的一个很好的理由

$cnx = $this->connexion();
$stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id');
$stmt->execute([$_SESSION["user_id"]]);
$this->permissions = $stmt->fetchAll(PDO::FETCH_COLUMN);

就是这样。
这段代码不仅缩短了两倍,而且还为您提供了您想要的确切结果。

【讨论】:

    【解决方案3】:

    在 PHP 端你可以使用array_column:

    $this->permissions = array_column($this->permissions, 'permission_name');
    

    另外,我还会使用array_flip

    $this->permissions = array_flip(
        array_column($this->permissions, 'permission_name')
    );
    

    这样您可以使用isset($this->permissions[$permission]) 代替in_array($permission, $this->permissions);,因为它更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 2023-03-23
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2021-11-12
      相关资源
      最近更新 更多