web-dev-qa-db-ja.com

盲目的にすべてのmysql_関数をmysqli_で置き換えることはできますか?

プロジェクト全体でmysql_query()を使用しました。しかし、私はちょうど_mysql__がPHP 5.5から廃止され、PHP 7。

私のプロジェクトで_mysql__関数をすべて盲目的に_mysqli__で置き換えることができるかどうか知りたいですか?たとえば、mysql_query()mysqli_query()に置き換えるだけです。悪影響はありますか?

25

短い答えはnoで、関数は同等ではありません。

良いニュースは、多くの呼び出し/プロジェクトを変更する必要がある場合に役立つコンバータツールがあることです。これにより、スクリプトがすぐに機能します。

https://github.com/philip/MySQLConverterTool

これは、Oracleオリジナルバージョンの分岐バージョンであり、コーシャです。

とはいえ、コードを更新するのはそれほど難しくないので、とにかくオブジェクト指向の方法論に移行したいかもしれません...

1)接続

すべての意図と目的のために、接続をPHP変数として保存する新しい接続関数が必要です。

$mysqli = new mysqli($Host,$username,$password,$database);

接続を$mysqliに保存したことに注意してください。 $dbまたは任意の場所に保存できますが、コード全体でこれを使用して接続を参照する必要があります。

ただし、接続エラーを必ず確認してください。

if ($mysqli->connect_errno) echo "Error - Failed to connect to MySQL: " . $mysqli->connect_error;

2)クエリ

注:MySQLiで使用可能な準備済みステートメントを使用して、SQLインジェクションから保護する必要があります。 PHPでSQLインジェクションを防ぐにはどうすればよいですか? をご覧ください。ただし、ここでは基本を説明します。

ここで、クエリおよびその他のmysqli_関数に引数として接続を含める必要があります。手続き型コードでは、OOの最初の引数です。クラスメソッドのように記述します。

手続き:

$result = mysqli_query($mysqli,$sql);

OO:

$result = $mysqli->query($sql);

3)結果の取得

結果の取得は、手続き上の古いmysql_関数に似ています。

while($row = mysqli_fetch_assoc($result))

しかし$resultはmysqliのオブジェクトなので、オブジェクト関数呼び出しを使用できます。

while($row = $result->fetch_assoc())

4)接続を閉じる

したがって、以前と同様に、close関数に接続を含める必要があります。手続きの議論として。

mysqli_close($mysqli);

そして、オブジェクト指向で関数を実行するオブジェクトとして;

$mysqli->close();

私がそれらすべてを経験したなら、私は永遠にここにいるでしょうが、あなたはそのアイデアを得ます。詳細については、 ドキュメント をご覧ください。接続のクローズ、結果のリリース、エラーおよび行カウント機能を変換することを忘れないでください。

基本的な経験則は、データベース接続を使用する関数の場合、それを関数に含める必要があります(手続きの最初の引数として、またはオブジェクト指向で関数を呼び出すために使用するオブジェクトとして)、または結果セット関数をmysqli_に変更するか、結果セットをオブジェクトとして使用できます。

41
worldofjr

古いプロジェクトでmysqli関数のすべての呼び出しを変換できない場合は、ライブラリ php7-mysql-shim をインストールして含めることができます。

PHP 7でmysqliを使用してmysqlの透過的な置換を作成しようとします。明らかにパフォーマンスは遅くなりますが、数分で問題を回避する解決策です。 PHP 5.6で動作するプロジェクトのライブラリ(無視されます)。

if (defined('PHP_VERSION_ID') && (PHP_VERSION_ID >= 50600)) { require_once "mysql-shim.php"; }
7
MiguelR

できません。 mysqlとmysqliの一部の関数には、異なるパラメーターが必要です。したがって、どちらが同じパラメーターを使用するかを知っておく必要があります。

2
mokh223