0

mysql_* を mysqli に変換していますが、以下の問題が発生します。

php クラス (Functions.php):

class Functions{

    public static function filter($data){
        $data = trim(htmlentities(strip_tags($data)));

        if(get_magic_quotes_gpc())
            $data = stripslashes($data);
            $data = $mysqli->real_escape_string($data);

            return $data;
        }

}

DB 接続 (dbconnect.php):

$dbhost = 'localhost';
$dbuser = 'xxxxxx';
$dbpass = 'xxxxxx';
$dbname = 'xxxxxx';

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if(mysqli_connect_errno()){
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

上記のファイルを header.php のように含めます

include('inc/dbconnect.php');
include('inc/Functions.php');

次のようなクラス関数をページに呼び出してもらいました。

$params = Functions::filter($_GET['param']);

ページをロードすると、次のエラーが発生しました。

致命的なエラー: C:\xampp\htdocs\site\inc\functions.php 行 XX の非オブジェクトでメンバ関数 real_escape_string() を呼び出します

dbconnect.php で mysqli 用のオブジェクトを既に作成していませんか? なぜこのエラーが表示されるのですか? これは、Functions.php 内の関連するすべての mysqli で発生します。

アドバイスください、どうもありがとう。

4

2 に答える 2

1

グローバル スコープで mysqli オブジェクトを作成したのでglobal $mysqli;、メソッドに追加するか、$GLOBALS['mysqli']代わりに使用する必要があります。

public static function filter($data) {
    global $mysqli;

    $data = trim(htmlentities(strip_tags($data)));

    if(get_magic_quotes_gpc())
        $data = stripslashes($data);
        $data = $mysqli->real_escape_string($data);

        return $data;
    }
}

ただし、オブジェクトを関数の引数として渡すことをお勧めします。

public static function filter($data, $mysqli) {
    $data = trim(htmlentities(strip_tags($data)));

    if(get_magic_quotes_gpc())
        $data = stripslashes($data);
        $data = $mysqli->real_escape_string($data);

        return $data;
    }
}

その後:

$params = Functions::filter($_GET['param'], $mysqli);
于 2013-03-23T21:10:08.533 に答える
0

$mysqliグローバル スコープからアクセスできるようにしようとしているため、メソッドglobal $mysqli内で宣言する必要があります。Functions::filter

可能な限り、静的クラスとグローバルを使用しないことを強くお勧めします。次の方法でクラスを編集して、Functionsより OOP 指向にすることができます。

class Functions {

    private $mysqli;

オブジェクトを保持するプライベート プロパティを宣言しmysqliます。そこは許可できないことに注意してくださいNULL。したがって、プロパティを初期化するコンストラクタを宣言する必要があります。

    public function __construct(mysqli $mysqli_) {
        $this->mysqli = $mysqli_;
    }

mysqliこれは、型ヒントを使用して、パラメーターとして渡されるオブジェクトではないものをすべて回避します。filter次に、メソッドをインスタンス メソッドにする必要があります。

    public function filter($data){
        $data = trim(htmlentities(strip_tags($data)));

        if(get_magic_quotes_gpc())
            $data = stripslashes($data);
            $data = $this->mysqli->real_escape_string($data);

        return $data;
    }

}

クラスのインスタンス プロパティを使用しているためです$mysqli$this->mysqli

于 2013-03-23T21:10:40.373 に答える