6

したがって、SOの常連である人なら誰でも気付いていると思いますが、このmysql_関数は非推奨になり、mysqli_代わりに使用することをお勧めしPDOます。mysql_したがって、コード内で単純な検索/置換を実行し、すべてをに置き換えて、mysqliに移行することにしましたmysqli_。これはDreamweaverで問題なく機能しているようで、構文エラーなどは発生しませんでした。新しいmysqli_機能はすべて青色で表示され、有効な機能として認識されました。

しかし、すべてを保存してコードを実行すると、mysqlに関係するコードが機能しなくなっていることに気付きました。置換を元に戻すと、問題は解決しました。

私のサーバーはおそらくmysqli機能をサポートしていませんか?私はそれがphp5とmysql5を実行していることを知っています。おそらくあなたがコードに追加しなければならない何か他のものがありますか?私は何が欠けていますか?

4

5 に答える 5

4

ext/mysqlPHP 7.0がコアから関数を削除したので、今すぐ切り替えるのに良い時期です。

次のレガシーコードを検討してください

$res = mysql_query($sql);

関数は、開いている接続を使用するというmysql_点で怠惰でした。しかしmysqli_、それは怠惰であるだけでなく、オブジェクトであり、接続リソースではありません(これがmysql_connect()返されるものです)。データベースに接続するには、ここでこれらの行を見てください

$mysqli = new mysqli('host', 'username', 'password', 'db');
$mysqli = mysqli_connect('host', 'username', 'password', 'db');

それらの両方があなたに同じことを与えます...

MySQLサーバーへの接続を表すオブジェクトを返します。

はい、そうです。手続き型接続関数でさえ、オブジェクトを返します。それを直接使用する最も簡単な方法は、オブジェクト形式です

$mysqli->query($sql);

手続き型関数は、このための単なるラッパーです。しかし、彼らは怠惰ではありません。違いを確認してください

mysqli_query($mysqli, $sql);

この中で最大の落とし穴(単純な検索と置換が失敗する理由mysql_mysqli_は、ほとんどの関数で最初の引数として接続オブジェクトmysqli_を渡す必要があることです。結果もオブジェクト(mysqli_resultクラス)であることに注意することも重要ですが、それらの手続き型の対応物は結果セットのみを必要とするため、それらを簡単に検索/置換できます。

完全を期すために、あまり一般的ではないもう1つの落とし穴があります(これは本当に古いコードです):mysql_result。この関数には、に相当するものはありませんmysqli_。次のような全行戻り関数に切り替える必要がありますmysqli_fetch_assoc($result)

于 2015-12-02T18:57:43.757 に答える
1

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developersをチェックしてみてください。これは、mysql_コードの移行について知っておく必要のあるすべてのことを教えてくれるはずですが、MySQLiではなくPDOに伝えてください。

于 2015-12-02T19:21:30.543 に答える
1

コードを置き換えるときに行われた可能性のある多くの問題があることを知っておく必要があります。

  1. ここでmysqliのインストールを確認してください。
  2. ここでmysqliの構成を確認してください。
  3. 次の2つの方法でDB接続を確認してください。

    ** natimysqlのような単純な接続:

    $con = mysqli_connect("localhost","my_user","my_password","my_db");

    しかし今、あなたはそれをそのように使わなければなりません

    mysqli_query($con,"SELECT * FROM Table"); // $con is the connection which is must for executing the sql query

    **私の最善の方法は、次のような新しいmysqliオブジェクトとして処理することです。

    $con = new mysqli('localhost', 'user', 'pass', 'demo');

    今、あなたはそのようにそれをします:

    $sql = "SELECT * FROM Table";
    $con->query($sql);
    

    以前に行ったすべてのクエリをチェックした場合これらのエラーの1つ、特に3番目のポイントのエラーを見つける必要があります。ここここ、またはここのチュートリアルでツアーに参加できます。

于 2015-12-08T12:46:31.710 に答える
0

驚いたことに、mysql_関数とmysqli_関数が完全に類似しているわけではないため、検索と置換は必ず失敗します。また、mysqli_は通常、データベース接続パラメーターを要求します(手続き型モードで使用する場合、これは、目的としているものです)。ここで、mysql_は、コードで以前に開かれた接続を取得します。

デバッグを有効にしている場合は、エラーを処理できるはずです。

最も一般的な「落とし穴」は、mysql_result()に相当するmysqliがないことです。これは、単一の結果を取得するときによく使用されます。私はあなたのコードが"mysqli_result()"呼び出しで散らばっていることに賭けたいと思いますが、それはすべて失敗します。

これが基本的な修正です。「良い」修正は、すべてのSQL呼び出しに専用クラスを使用することです。これにより、コードベース全体で、すべて1つのファイルでmysqli関数を使用できるのはほんの一握りになります。そうすれば、リファクタリングするときに、さまざまなmysqli関数をさまざまに使用してファイルの山を検索する必要がなくなります。

「MySQLの信頼できるソースが必要->MySQLiの移行」の場合は、GoogleというWebサイトをお勧めします;-)「MySQL->MySQLiの移行」と入力します。

たとえば、この「ダミー用」ページには、コードを機能させるために対処する必要のあるさまざまな関数の違いが示されています。

http://www.dummies.com/how-to/content/how-to-convert-mysqli-functions-to-mysql-functions.html

于 2015-12-07T16:30:10.867 に答える
-1

mysql_関数は非推奨になりました

いいえ、まだです

コードで簡単な検索/置換を行うことでmysqliに移行することにしました

問題はおそらく、mysqli関数のパラメーターの順序が逆であり、接続リソースを明示的に必要とするという事実にあります。

それでも、このような一括置換で成功したとしても、コードに少しでも影響を与えることはないので、このサイトでの熱狂的なキャンペーンにもかかわらず、そのままにしておくことをお勧めします。

  1. 急ぐ理由はありません。不便に気付くまでに少なくとも5年はあります。
  2. mysql関数に関するこのすべてのノイズの目的は、一部のAPIを別のAPIに変更することではなく、通常のPHPコードを少し賢明で安全にすることです。検索と置換だけでは、これらの目標のどちらにも到達しません。したがって、それを実行する理由はまったくありません。

本当に必要なのは、クエリを処理するインテリジェントな方法であり、ライブラリクラスにカプセル化されています。これにより、SQLクエリの実行エクスペリエンスが向上するだけでなく、すべてのAPI関数が1つの場所に移動し、任意のAPIに簡単に置き換えることができます。一部の人々はあなたに使用を強制することを決定します。

于 2013-01-19T19:39:37.597 に答える