0

私は現在のコードを持っています:

    Database::connect();
?>

<table>
    <thead>
        <tr>
            <th>ID</th> 
            <th>Title</th>
        </tr>
    </thead>
    <tbody>
        <?php       
            $query = "SELECT * FROM app";  
            $dbr = Database::query( $query ); 
            while( $row = Database::$mysqli->fetch_object( $dbr->result ) ){
                ?>
                <tr>
                    <td><?php echo $row->id; ?></td> 
                    <td><?php echo $row->title; ?></td>
                </tr>
                <?php
            }
        ?>
    </tbody>
</table>        

<?php
    Database::close();
?>

これがDatabaseクラスとDatabaseQueryクラスです

class DatabaseQuery{
    public $result;
    public $mysql_num_rows;        
}

class Database{            
    public static $mysqli;   
    private static $db_name = '';
    private static $username = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   

    public static function connect(){  
        self::$mysqli = new mysqli( self::$host, self::$username, self::$password, self::$db_name );

        if (self::$mysqli->connect_error) {
            die('Connect Error (' . self::$mysqli->connect_errno . ') '
                . self::$mysqli->connect_error);
        }
    }

    public static function query( &$query ){
        $query = self::$mysqli->real_escape_string( $query );

        if ($stmt = self::$mysqli->prepare($query)) {
            $stmt->execute();
            $stmt->store_result();            

            $DatabaseQuery = new DatabaseQuery();
                $DatabaseQuery->result = $stmt;       
                $DatabaseQuery->mysql_num_rows = $stmt->num_rows();                 
                $stmt->close();
                return $DatabaseQuery;                   
        }
    }

    public static function close(){
        self::$mysqli->close(); 
    }
}

呼び出しコードでエラーが発生します:致命的なエラー:未定義のメソッドmysqli :: fetch_object()を呼び出します

何か案は?

4

3 に答える 3

1

次の行を置き換えます。

while( $row = Database::$mysqli->fetch_object( $dbr->result ) ){

これについて:

while( $row = $dbr->fetch_object( $dbr->result ) ){

fetch_object ()は mysqli_result オブジェクトのメソッドであり、一般的な mysqli オブジェクトのメソッドではないためです。

于 2012-12-12T16:05:54.010 に答える
1

これはあなたの問題だと思いますが、データベースにアクセスして操作するための非常に簡単な方法である PDO を調べることをお勧めします。

<?php       
        $query = "SELECT * FROM app";  
        $dbr = Database::query( $query ); 

            //Change this here since your method is query and not $mysqli
            while( $row = Database::$dbr->fetch_object( $dbr->result ) ){
            ?>
            <tr>
                <td><?php echo $row->id; ?></td> 
                <td><?php echo $row->title; ?></td>
            </tr>
            <?php
        }
    ?>

気にしないのであれば、クラスを非常に複雑にしていると思います。理由がある場合は、そうでない場合でも、このようにすることができます。

class Database{            
    private static $mysqli;   
    private static $db_name = '';
    private static $username = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   

    public function __construct(){  
        self::$mysqli = new mysqli( self::$host, self::$username, self::$password, self::$db_name );

         if (self::$mysqli->connect_error) {
        die('Connect Error (' . self::$mysqli->connect_errno . ') '
            . self::$mysqli->connect_error);
        }
    }

    public function query( $query ){
         $query = self::$mysqli->real_escape_string( $query );

        if ($query = self::$mysqli->prepare($query)) {
            $query->execute();
            $query->store_result();            


            $stmt = $query->result;        
            //$query->mysql_num_rows = $stmt->num_rows();                 
            $query->close();
            return $stmt;                   
    }
}
}

クラスを使用するファイル

 //Include the file unless u have a autoloader
    <tr>
    <?php       
    $query = "SELECT * FROM app";

    $dbr = new Database(); 


        //Change this here since your method is query and not $mysqli
        while( $row = $dbr->query($query)->fetch_object() ){


           echo '<td>'. $row['IDcolumnName'] . '</td>' ;
           echo '<td>'. $row['TitlecolumnName'] . '</td>' ;


    }
?>
</tr>
于 2012-12-12T16:07:56.300 に答える
0

あなたの論理は壊れています:

    $query = self::$mysqli->real_escape_string( $query );

クエリ全体をエスケープしません。クエリに挿入するデータをエスケープします。たとえば、次のようなものがある場合

 SELECT id, name, ... WHERE firstname = '$searchterm'

の値をエスケープします$searchterm。クエリ全体をエスケープすると、次のようになります

 SELECT id, name, ... WHERE firstname = \'$searchterm\'

$searchterm の周りに引用符がなくなったため、構文エラーが発生します。裸の文字列の一部として無視される文字がいくつかあります。

次に、次のとおりです。

        $stmt->store_result();            

store_result()後で結果を取得するために使用できるステートメント ハンドルを返します。そのハンドルをキャプチャしていないため、クエリが適切に実行されたとしても、DB の結果は単に破棄されます。

于 2012-12-12T16:06:42.377 に答える