Php 使用类变量的调用和超时前的空数组?
我遇到了最奇怪的问题。请帮忙 我有一个数据库对象,用于扩展其他类对象。通过这样做,我可以轻松地将结果集附加到类变量上,并从应用程序中的任何位置静态调用结果。这是我的“选择”功能,我用它来设置参数:Php 使用类变量的调用和超时前的空数组?,php,arrays,class,pdo,Php,Arrays,Class,Pdo,我遇到了最奇怪的问题。请帮忙 我有一个数据库对象,用于扩展其他类对象。通过这样做,我可以轻松地将结果集附加到类变量上,并从应用程序中的任何位置静态调用结果。这是我的“选择”功能,我用它来设置参数: public static function select($where="", $bind="", $fields="*", $table="") { global $db; $object = get_called_class();
public static function select($where="", $bind="", $fields="*", $table="") {
global $db;
$object = get_called_class();
if(empty($table))
$table = static::$table;
$sql = "SELECT " . $fields . " FROM " . $table;
if(!empty($where))
$sql .= " WHERE " . $where;
$sql .= ";";
return $db->run($object, $sql, $bind);
}
下面是数据库类函数Run,它实际执行上述函数SQL query和parameters,然后将其返回到一个对象中,以便我可以轻松地使用该对象:
public function run($object, $sql, $bind='') {
$this->sql = trim($sql);
$this->bind = $this->cleanup($bind);
try {
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
switch(strtok($this->sql, ' ')) {
case 'DESCRIBE':
case 'PRAGMA':
return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
break;
case 'DELETE':
case 'INSERT':
case 'UPDATE':
case 'REPLACE':
case 'TRUNCATE':
return $pdostmt->rowCount();
break;
default:
if($object == 'SessionHandler') {
if($pdostmt->rowCount() === 1) {
return $pdostmt->fetch(PDO::FETCH_ASSOC);
} else {
return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
}
} else {
if($pdostmt->rowCount() === 1) {
$pdostmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $object);
return $pdostmt->fetch();
} else {
$pdostmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $object);
return $pdostmt->fetchAll();
}
}
break;
}
}
} catch(PDOException $e) {
$msg = 'Last SQL Query: ' . $this->sql . "\n";
$msg .= 'SQL Error Message: ' . $e->getMessage();
Logger::logToFile(__CLASS__, $msg);
die($msg);
}
}
当我使用一个类并从另一个页面获取信息时,这些函数非常有效。但请考虑以下内容:
class ACL extends DatabaseObject {
private $_permissions = array();
private $_userid = 0;
private $_user_roles = array();
public function __construct($userid = 0) {
global $session;
if($userid == 0) {
$this->_userid = $session->userid;
} else {
$this->_userid = $userid;
}
$this->get_user_roles($this->_userid);
$this->get_all_roles();
}
public function get_user_roles($userid = 0) {
$bind = array('userid' => $userid);
$roles = self::select('userid = :userid', $bind, '*', 'user_roles');
if(is_object($roles)) {
$this->_user_roles[] = $roles->roleid;
} else {
foreach($roles as $role) {
$this->_user_roles[] = $role->roleid;
}
}
}
public function get_all_roles($format = 'id') {
$format = strtolower($format);
echo $this->_userid . '<br />';
}
}
类ACL扩展了DatabaseObject{
私有$_权限=数组();
私有$_userid=0;
私有$\u用户\角色=数组();
公共函数构造($userid=0){
全球会议;
如果($userid==0){
$this->_userid=$session->userid;
}否则{
$this->_userid=$userid;
}
$this->get\u user\u角色($this->\u userid);
$this->get_all_roles();
}
公共函数获取用户角色($userid=0){
$bind=array('userid'=>$userid);
$roles=self::select('userid=:userid',$bind',*','user_roles');
if(is_对象($roles)){
$this->_user_roles[]=$roles->roleid;
}否则{
foreach($roles作为$role){
$this->_user_roles[]=$role->roleid;
}
}
}
公共函数获取所有角色($format='id'){
$format=strtolower($format);
echo$this->_userid.
;
}
}
在上面的ACL类中,在类的构造函数中,我将类的_userid变量设置为等于会话变量。。。但是当我使用$this->\u userid
调用get\u user\u roles函数时,应用程序崩溃了吗?另外,当我打印get_all_roles函数的$this->\u userid
时,会向我返回三个值,而不是一个?此外,我在这个类中运行的所有查询都会在结果的前面追加空数组。空数组的数量等于结果的数量。那么最后一个数组将容纳所有对象
请帮忙,我很困惑。任何帮助都将不胜感激。确实很奇怪。您能否发布错误日志的任何输出,以查看您的应用程序在哪里崩溃?乍一看,我并没有发现任何明显的错误,但错误主要在细节上。根据我上面的评论,这里是我现在使用的更新的DB Run方法
public function run($object, $sql, $bind='', $type='object') {
$this->sql = trim($sql);
$this->bind = $this->cleanup($bind);
try {
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
switch(strtok($this->sql, ' ')) {
case 'DESCRIBE':
case 'PRAGMA':
return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
break;
case 'DELETE':
case 'INSERT':
case 'UPDATE':
case 'REPLACE':
case 'TRUNCATE':
return $pdostmt->rowCount();
break;
default:
if($type == 'array') {
if($pdostmt->rowCount() === 1) {
return $pdostmt->fetch(PDO::FETCH_ASSOC);
} else {
return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
}
} elseif($type == 'object') {
if($pdostmt->rowCount() === 1) {
$pdostmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $object);
return $pdostmt->fetch();
} else {
$pdostmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, $object);
return $pdostmt->fetchAll();
}
}
break;
}
}
} catch(PDOException $e) {
$msg = 'Last SQL Query: ' . $this->sql . "\n";
$msg .= 'SQL Error Message: ' . $e->getMessage();
Logger::logToFile(__CLASS__, $msg);
die($msg);
}
}
}
我想我已经发现了问题所在。发生了什么事?我正在从查询返回ACL对象。。。我认为这就是导致挂起和空数组的原因,因为每个ACL对象都将ACL类变量设置为自己的值。我的假设正确吗?我现在所做的是以关联数组的形式返回结果,并使用数组键设置一个ACL类的值,到目前为止,它似乎仍然有效。这一行就是罪魁祸首:PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,$object。它基本上告诉PDO类用提供的数据填充该对象。顺便问一下,我可以问一下你为什么要通过这个物体吗?我注意到在类名上有一个
if
条件,这并不是最灵活的做法。为什么不删除$object
参数,并将其设置为$return\u format
呢?是的,在意识到发生了什么之后不久,我改变了我的DB run函数,如下所示:见下文