Php 如何利用PDO使用游标获取方法?
我需要使用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
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();