21

スクリプトで使用していた関数があります。openDBConn()そしてcloseDBConn()これらは両方ともmysql_connect()関数を呼び出しました。以下のように使用されます

openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();

このようにすることで、次のこともできます

openDBConn();
mysqlStartTranscation();

upgradeCarColor($car_id);
addNewWing($car_id);

mysqlCommit();
closeDBConn();

今のジレンマは、mysqliに移動する場合、接続リンクを渡す必要があるということです。

また、mysql_*が非推奨になっていることも読みました。質問は次のとおりです。

  1. ほとんどの機能が機能しなくなるまでにどれくらいの時間がありますか?
  2. 関数にパラメーターを追加するのは面倒なので、現在のmysqli接続にアクセスする現在または将来の方法はありますか?
  3. 手続き的な方法で現在のmysqli接続リンクにアクセスする適切なコーディング方法はありますか?手続き型でない場合、OOP方式で何が最善ですか?
4

2 に答える 2

15
  1. 彼らは自分たちで仕事をやめることは決してないので、あなたは世界中にずっといます!
  2. はい、これを行うにはいくつかの方法があります。
  3. はい。ただし、万能のソリューションはありません。すべての状況は異なり、特定の状況に適切なものがすべての状況に適切であるとは限りません。

まず、古いext /mysqlはPHP5.5.0で非推奨になりましたが、拡張機能自体が最終的にPHP PECLリポジトリに移動されるため(削除するときに)、完全に機能しなくなることはありません。ただし、私たちはまだそこにいないので、そのバージョンのPHPにアップグレードすることを選択した場合にのみ影響を受ける可能性があります。拡張機能を削除するための正確な時間は決定されていません。

次に、古いext / mysql拡張機能が舞台裏で行っていたように、変数を使用してデータベース接続を格納できます。トリックは、それが何をしているのかを知らなかったということでした(mysql_connectを呼び出したときに作成した最後に開いた接続を使用し、mysql_queryなどを呼び出してデータベースにアクセスするたびにそれを使用します)。

これは、手続き型スタイルを使用して関数内の静的変数で行うことができます。

function openDBConn() {
    static $link;
    if (!isset($link)) {
      $link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
    }
    return $link; // returns the link
}

または、OOPを使用してクラス静的変数でこれを行うことができます...

Class MyDBConnect {

    public static $link;

    public function openDBConn() {
        if (!isset(static::$link)) {
            static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
        }
    }

}

新しいAPIを使用することをお勧めします。また、それを称賛しますが、前進する際には注意も必要です。関数を古いext/mysql関数から新しいmysqli拡張機能に移植し始めるときは、古い拡張機能の悪い習慣(古いSQL文字列の連結やエスケープ手法ext /の使用など)も移植しないように注意してください。 mysqlが提供されます)。代わりに、MySQLiで準備されたステートメントとパラメーター化されたクエリを利用してください。

私があなたの注意を向けたいのは、MySQLデータベース(つまり、PDOとMySQLi)とインターフェースするために新しいAPIを使用することの利点です。

于 2012-12-08T11:33:58.547 に答える
3

まず、移行を開始するのは良いことなので、質問に+1を付けます。

OOP と引数

OOP プログラミングと引数の受け渡しについては、Singleton Factory パターンに基づくソリューションを次に示します。

class MysqliConnection{
   private static $connection = null;
   public static function getConnection(){
       
      
       if(self::$connection === null){
           //Here get some routine to make your configuration extern
           self::$connection = new Mysqli(/*args*/);
       }
       return self::$connection;
}

クエリを送信する場合は、次のように使用できます。

 function methodWhichSendsAQuery(){
      $mysqli = MysqliConnection::getConnection();
      $query = $mysqli->prepare(/*your query*/);
      /*some param bindings with $query->bindParam()*/
      $query->execute();
      return $query->fetchAll(); //an array with all results
  }

クリーンで読みやすく、グローバル変数に依存しないため、他のソリューションよりもこのソリューションを好みます。単一責任の原則が尊重され、問題ありません。

mysql_ から mysqli へのリファクタリング

古い方法で mysql_ を処理することに慣れている場合、リファクタリングは非常に困難になる可能性があります。つまり、リソース引数なしmysql_escape_stringなどです。

Mysql は、mysql_ から mysqli に移行するための強力なスクリプトを提供しています。詳細については、こちらを参照してください

私が言えることは、mysqli は「プリペアド ステートメント」と呼ばれる非常に強力で強力なセキュリティ機能を備えているということです。mysqli がプリペアド ステートメントを処理する方法は、PDO の方法よりもユーザー フレンドリーではありませんが、プロパティは同じです。

于 2012-12-08T11:31:10.117 に答える