私は最も奇妙な問題を経験しています。助けてください。
他のクラス オブジェクトを拡張するために使用するデータベース オブジェクトがあります。そうすることで、結果セットをクラス変数に簡単にアタッチし、アプリケーション内のどこからでも結果を静的に呼び出すことができます。パラメータを設定するために使用する「選択」関数を次に示します。
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);
}
上記の関数 SQL クエリとパラメーターを実際に実行し、それをオブジェクトで返すデータベース クラス関数 Run を次に示します。これにより、オブジェクトを簡単に使用できるようになります。
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 クラスでは、クラスのコンストラクターで、クラスの _userid 変数をセッション変数と同じに設定しました... しかし$this->_userid
、get_user_roles 関数を呼び出すために使用すると、アプリケーションがクラッシュしますか? また、$this->_userid
get_all_roles 関数を出力すると、1 つではなく 3 つの値が返されますか? また、このクラス内で実行するすべてのクエリは、結果の先頭に空の配列を追加します。空の配列の数は、結果の数と同じです。次に、最後の配列はすべてのオブジェクトを保持しますか?
助けてください、私は非常に混乱しています。どんな助けでも大歓迎です。