7

私は新しいPHPプロジェクトを開始したばかりで、phpの提案に従い、代わりにmysqlとswithtomysqliの使用をやめる時が来たと思っていました。しかし、これは私に問題を与えました。

通常、私のセットアップは次のようになります

Index.phpファイルとこのファイル内に2つのrequireステートメントがあります。1つはdb.phpファイルを呼び出し、もう1つはfunctions.phpファイルを呼び出します。ここまでは順調ですね。

Functions.phpファイルには、ホームページ全体で使用されるさまざまな関数があり、これらの多くはSQLを使用しています。phpの古いmysqlAPIでは、これは問題ありませんでしたが、新しいmysqli apiでは、含まれているファイルからの接続を使用できません。

たとえば、私のdb.phpには、connectステートメントがあります。$db = mysql_connect(*******); そして私のfunction.phpには私が持っていてmysql_query(******)、それは完璧に機能します。

$db = mysqli_connect(*****); しかし、関数.phpファイルでdb.phpをThenに変更すると、を呼び出すことができませんmysqli_query(***)。(私もオブジェクト指向をテストしましたが、同じ問題が発生します)。

では、この問題を回避するにはどうすればよいでしょうか。PHPは、SQLステートメントを使用するすべてのファイルの先頭にmysqli_connectステートメントを配置することを期待していますか?

4

3 に答える 3

8

はい、MySQLiはオブジェクト指向$dbであり、データベース接続を必要とする関数にオブジェクトを渡す必要があります。手続き上の代替案でも、$dbオブジェクトが機能する必要があります。暗黙のグローバル接続(実際には、任意の形式のグローバル状態)は悪い習慣であるため、これはあなた自身のためです。mysql拡張が暗黙の接続を許可したことは、そもそも良くありませんでした。

于 2012-08-24T14:18:07.917 に答える
8

オプションは次のとおりです。mysqliオブジェクトをパブリック静的変数として保持するためだけに静的クラスを作成します。

class DBi {
    public static $conn;
}
DBi::$conn = new mysqli(HOST, USER, PASS, DB);

...インクルードファイル、データベースヘルパーなど。

次に、mysqli呼び出しを行いたい場所ならどこでも実行します

DBi::$conn->query(...) 

必要に応じてグローバルにします。そして、必要に応じて、そこに独自のカスタム関数(メソッド)を簡単にポップし始めることができます-DBi :: custom_method()

これは、 mysqlからmysqliへの変換で与えられた答えの一種の改良です-スーパーグローバル接続オブジェクトを取得する方法は?

于 2013-04-18T14:50:44.663 に答える
5

関数で必要な場合は、$mysqli変数をグローバルに設定する必要があります。

このようなもの:

...
function name (){  
        global $mysqli; 

...
于 2012-08-24T14:32:10.847 に答える