1

これは簡単な答えに違いないと確信していますが、私はそれを見ていません。残りのすべてのコードを簡素化するために、すべてのデータベース コードをクラスに移動して実験しています。

このエラーが発生しましたが、理由がわかりません

Fatal error: Using $this when not in object context in /var/www/php/dbclass.php on line 18 (18 行目に矢印を付けました)

ここに私のクラスがあります

<?php

class kdb {

    var $dbhost = "localhost";
    var $dbname = "name";
    var $dbuser = "root";
    var $dbpass = "pass";

    var $error;

//    function __construct($persons_name) {
//        $this->name = $persons_name;
//    }
    //function to insert safely

    public static function exe($qry_string, $var_array) {
        $host = $this->dbhost;  <------------------ LINE 18
        $name = $this->dbname;
        $user = $this->dbuser;
        $pass = $this->dbpass;
        $retries = 30;
        while ($retries > 0) {
            try {
                $pdo_conn = new PDO("mysql:host={$host};dbname={$name}", $user, $pass);
                $retries = 0;
                //echo 'run query';
            } catch (PDOException $e) {
                $retries--;
                sleep(1); // Wait 1s between retries.
                log::enter_log("Error connecting: {$retries} retries left");
            }
        }
        $q = $pdo_conn->prepare($qry_string);
        $q->execute($var_array);
        $return_arr = $q->fetchAll();
        $this->error = $q->errorInfo();
        //dbconn::logquery($qry_string, $var_array, $q->rowCount(), $error[2]);
        return $return_arr;
    }

}

?>

ページ上のコード

    $db = new kdb();   
    $db_list = $db->exe('select * from table where id = ?', array(42));
    var_dump($db_list);

まだ半分しか完成していないことに注意してください。現時点では、必要以上に複雑になっていることを認識しています。

4

2 に答える 2

1

その宣言から削除staticして、次のようにします。

public function exe($qry_string, $var_array) {

静的コンテキストにいる場合、$this疑似変数は使用できません。ただし、メソッドをオブジェクトメソッドとして呼び出しているため、見落としだったと思います。

于 2013-04-09T23:36:35.613 に答える
0

self::静的メソッドから静的変数にアクセスするために使用できます。$this通常はオブジェクトを指し、静的関数の場合は参照するオブジェクトがないため、意味がありません。

特定のケースでは、exe関数は静的メソッドではなくインスタンス メソッドである必要があるように思われるためstatic、メソッド定義からキーワードを削除することをお勧めします。

于 2013-04-09T23:38:58.667 に答える