0

私は最も奇妙な問題を経験しています。助けてください。

他のクラス オブジェクトを拡張するために使用するデータベース オブジェクトがあります。そうすることで、結果セットをクラス変数に簡単にアタッチし、アプリケーション内のどこからでも結果を静的に呼び出すことができます。パラメータを設定するために使用する「選択」関数を次に示します。

    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->_useridget_all_roles 関数を出力すると、1 つではなく 3 つの値が返されますか? また、このクラス内で実行するすべてのクエリは、結果の先頭に空の配列を追加します。空の配列の数は、結果の数と同じです。次に、最後の配列はすべてのオブジェクトを保持しますか?

助けてください、私は非常に混乱しています。どんな助けでも大歓迎です。

4

2 に答える 2

0

確かに非常に奇妙です。アプリケーションがクラッシュしている場所を確認するために、エラーログからの出力を投稿してください。一見、明らかに間違っているものは何も見つかりませんが、エラーはほとんど詳細にあります。

于 2012-08-21T11:24:12.597 に答える
0

上記の私のコメントによると、これが私が現在使用している更新された DB Run Method です。

    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);
        }
    }
}
于 2012-08-22T08:00:06.347 に答える