Php 如何利用PDO使用游标获取方法?

Php 如何利用PDO使用游标获取方法?,php,pdo,Php,Pdo,我需要使用PHP中的游标获取方法获取每个数据集行。但在现代,我也想利用PDO的优势。在我的示例中,它与一个经典的组变化相结合: 我有以下表格: create table profile ( id int not null auto_increment, email char(50) not null, password char(100) not null, name char(100) not null, surname char(50) not nul

我需要使用PHP中的游标获取方法获取每个数据集行。但在现代,我也想利用PDO的优势。在我的示例中,它与一个经典的组变化相结合:

我有以下表格:

create table profile
(
    id int not null auto_increment,
    email char(50) not null,
    password char(100) not null,
    name char(100) not null,
    surname char(50) not null,
    street char(50) not null,
    homeno char(5) not null,
    group_id int not null,
    primary key(id)
);
create table usergroups
(
    id int auto_increment not null,
    name char(30) not null,
    primary key(id)
);

create table actions
(
    id int not null auto_increment,
    name char(50) not null,
    primary key(id)
);

create table group_rights
(
    id int auto_increment not null,
    action_id int not null,
    group_id int not null,
    allowed int(1) not null,
    primary key(id)
);
所以,在第三范式中

我的PHP代码看起来是这样的(目前它可以工作,但我认为我应该以更好的方式利用PDO):

只是对保存PDO类对象的singleton的引用。打电话

$authmdl = new AuthModel();
$authlist = $authmdl->load();

您将获得ACL。

“我需要使用游标获取方法获取每个数据集行”
-为什么?因为组更改(当游标获取流中有一个或多个内部循环在新的组条件下中断时,称为组更改)。我可以使用fetchAll,但是在相同的数据上运行了两个循环。所以,在我看来,这是性能浪费。真的吗?你试过测量吗?
class AuthList
{
    const USER_ALREADY_SET = -1;
    const USER_GROUP_CHANGED = 0;
    const USER_SUCCESSFULLY_ADDED = 1;

    const ACTION_ALREADY_ALLOWED = -1;
    const ACTION_SUCCESSFULLY_ALLOWED = 0;

    const ACTION_ALREADY_DENIED = -1;
    const ACTION_SUCESSFULLY_DENIED = 0;

    const GROUP_ALREADY_EXISTS = -1;
    const GROUP_SUCCESSFULLY_ADDED = 0;

    const ACTION_ACCEPT = 'OK';
    const ACTION_DENY = 'NOK';

    const LIST_KEY_NAME = 'list';

    protected $_rights;
    protected $_list;
    protected $_groups;

    public function __construct()
    {
        $this->_list = array();
        $this->_groups = array();
    }

    public function addAction ($sAction)
    {
        if (is_callable($sAction))
        {
            $this->_list[] = $sAction->__toString();
        }
        else
        {
            $this->_list[] = $sAction;
        }
    }

    public function addGroup ($sGroupName, $rights = array())
    {
        $iRetCode = -2;
        if (in_array($sGroupName, $this->_groups))
        {
            $iRetCode = self::GROUP_ALREADY_EXISTS;
        }
        else
        {
            if (empty($rights))
            {
                $this->_groups[$sGroupName] = array();
            }
            else
            {

                $this->_groups[$sGroupName][self::LIST_KEY_NAME] = $rights;
            }
            $iRetCode = self::GROUP_SUCCESSFULLY_ADDED;
        }

        return $iRetCode;
    }

    public function setPrimaryUserGroup ($sGroupName, $sUser)
    {
        $iRetCode = -2;

        foreach ($this->_groups as $sKeyGroupName => $users)
        {
            if (in_array($sUser, $users) && $sGroupName === $sKeyGroupName)
            {
                // User already are in the requested group, finish working
                $iRetCode = self::USER_ALREADY_SET;
                break;
            }

            elseif (in_array($sUser, $users) && $sGroupName !== $sKeyGroupName)
            {
                for ($iUserPos = 0; $iUserPos < count($users); $iUserPos++)
                {
                    if ($users[$iUserPos] === $sUser)
                    {
                        $iUserNo = $iUserPos;
                        break;
                    }
                }
                unset($users[$iUserNo]);
                $this->_groups[$sGroupName][] = $sUser;
                $iRetCode = self::USER_GROUP_CHANGED;
                break;
            }

            else
            {
                $this->_groups[$sGroupName][] = $sUser;
                $iRetCode = self::USER_SUCCESSFULLY_ADDED;
                break;
            }
        }

        return $iRetCode;
    }

    public function allowAction ($sGroupName, $sActionName)
    {
        $iRetCode = -2;
        if ($this->_groups[$sGroupName][self::LIST_KEY_NAME][$sActionName] === self::ACTION_ACCEPT)
        {
            $iRetCode = self::ACTION_ALREADY_ALLOWED;
        }
        else
        {
            $this->_groups[$sGroupName][self::LIST_KEY_NAME][$sActionName] = self::ACTION_ACCEPT;
            $iRetCode = self::ACTION_SUCCESSFULLY_ALLOWED;
        }

        return $iRetCode;
    }

    public function denyAction ($sGroupName, $sActionName)
    {
        $iRetCode = -2;
        if ($this->_groups[$sGroupName][self::LIST_KEY_NAME][$sActionName] === self::ACTION_DENY)
        {
            $iRetCode = self::ACTION_ALREADY_DENIED;
        }
        else
        {
            $this->_groups[$sGroupName][self::LIST_KEY_NAME][$sActionName] = self::ACTION_DENY;
            $iRetCode = self::ACTION_SUCESSFULLY_DENIED;
        }

        return $iRetCode;
    }

    public function isAllowed ($sUserName, $sActionName)
    {
        $rw = false;

        foreach ($this->_groups as $users)
        {
            if (in_array($sUserName, $users))
            {
                if (array_key_exists($sActionName, $users[self::LIST_KEY_NAME]))
                {
                    $rw = $users[self::LIST_KEY_NAME][$sActionName] === self::ACTION_ACCEPT;
                }
                break;
            }
        }

        return $rw;
    }

    public function dump()
    {
        var_dump($this->_groups);
    }
}
$this->_db
$authmdl = new AuthModel();
$authlist = $authmdl->load();