1

データベース関数を使用するphpページで次のエラーが発生します。

警告:mysql_real_escape_string()[function.mysql-real-escape-string]:ユーザー'apache'@'localhost'のアクセスが拒否されました

データベースへの接続が機能している必要があることはわかっていますが、ここに「問題」があります。私のデータベースに接続するクラスは次のようになります。

class Database
{
    private static $instance = null;
    private static $conn;

    private function __construct()
    {
        try {
            self::$conn = new mysqli('localhost', 'root', 'user', 'database');
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
        }
    }

    public static function getInstance()
    {
        try {
            if (self::$instance == null) {
                self::$instance = new Database();
            }
            return self::$instance;
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
            return false;
        }
    }

    public function query($sql)
    {
        try {
            return self::$conn->query($sql);
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
            return false;
        }
    }
}

ご覧のとおり、これにはシングルトンパターンを使用します。でも入れても

Database::getInstance();

接続を開くためのコードの最初で、このエラーが発生し続けます。mysql_real_escape_string()関数を使用できるように、接続を正しく開くにはどうすればよいですか?

ありがとう。

そしてここにルフィックスがあります

次の関数をDatabaseクラスに追加しました。

public static function getConnection()
{
    self::getInstance();
    return self::$conn;
}

すべてのmysql_real_escape_string(をmysqli_real_escape_string(Database :: getConnection())に置き換えました。

4

1 に答える 1

2

問題は、を使用していることだと思いますmysql_real_escape_string()

それはとは別のライブラリからのものですmysqli、多分それが接続がない理由ですか?

mysql_real_escape_stringPHPマニュアルのページから:

string mysql_real_escape_string(string $ unscaped_string [、resource $ link_identifier = NULL])

これは、2番目のパラメーターの定義です$link_identifier

MySQL接続。リンク識別子が指定されていない場合、mysql_connect()によって開かれた最後のリンクが想定されます。そのようなリンクが見つからない場合は、引数なしでmysql_connect()が呼び出されたかのようにリンクを作成しようとします。接続が見つからないか確立されていない場合、E_WARNINGレベルのエラーが生成されます。


可能ですが、一種の醜い解決策は、dbシングルトンのmysqliインスタンスのreal_escape_stringメソッドにラッパーを追加することです。

public function escapeString($value){
    return $this->conn->real_escape_string($value);
}

もう1つの方法は、mysqliライブラリの手続き型バージョンを使用することです(ただし、両方を混在させることができるかどうかは実際には試していませんが、可能だと思います)。mysqli_real_escape_string

于 2012-04-21T17:33:03.850 に答える