-2

SQL クラスをより適切なものに変換しようとしています。クラス コンストラクターは次のようになります。

class sql{

private $db_name = CONFIG_DB_NAME;
private $db_user = CONFIG_DB_USER;
private $db_pass = CONFIG_DB_PASS;      
private $db_host = CONFIG_DB_HOST;
private $use_pconnect = CONFIG_DB_USEP;


function __construct(){

    if($this->use_pconnect){

        $connection = new mysqli('p:'.$this->db_host, $this->db_user, $this->db_pass, $this->db_name);
    }else{

        $connection = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name);
    }   

    if($connection->connect_errno){

        $this->sql_handle_errors($connection->connect_error, __FILE__, __LINE__);
        exit();
    }

    $this->connection = $connection;

    // Set DB charset
    if(!mysqli_set_charset($this->connection, CONFIG_CHARSET)){

        $this->sql_handle_errors(mysqli_error($this->connection), __FILE__, __LINE__);
    }

    if(file_exists(PATH_LOGS.'sql.txt')){

        $this->test_query = true;
    }
}
}

$sql = new sql;

そして、私がテストしている結果は次のようになります。

$result = $sql->connection->prepare("SELECT * FROM admin WHERE id = :id LIMIT 1");
$result->bind_param(':id', '1');
$result->execute();
$result->store_result();
$result->fetch();

bind_param 関数が見つからないと言っています。何か理由は?ありがとう。

4

2 に答える 2

1

SQL クラスには複数の問題があります。

最後に: コンストラクターは何も返しません! return $connection;いかなる目的も果たしません。それを除く。

$this->use_pconnect次に、宣言されていない複数のクラス プロパティを使用しています:$this->db_hostなど。コードでそれらを省略しましたか、それとも本当に存在しませんか? それもエラーになります。

また、コードには存在しないいくつかのメソッドを呼び出しています$this->sql_handle_errors()

この行では手続き型スタイルの使用を避けることができるはずです: if(!mysqli_set_charset($this->connection, CONFIG_CHARSET))should be if(!$this->connection->set_charset(CONFIG_CHARSET))、それが適切なオブジェクト指向スタイルであるためです。

そして最後になりましたが、あなたのクラスの使用法はあまり良くありません。基本的に、それを使用して のインスタンスを作成し、mysqliそのインスタンスを常に使用する必要があります。これ自体は悪いことではありませんが、mysqliこのインスタンスを公開して直接使用するのではなく、通常はこのインスタンスをラップする必要があるため、そうすることに実際の価値はありません。

最後のヒント: デバッグを学ぶ必要があります。var_dump()変数内の値の種類を確認するために使用します。の戻り値をダンプして$sql->connection->prepare()、それが のインスタンスであるmysqli_stmtかどうかを確認します。

于 2013-10-15T23:32:02.580 に答える