PHPでMySQL APIを混在させることはできますか?


106

私はネットを検索し、これまで私が見たものを使用できるということですしているmysql_mysqli_一緒に意味します:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

または

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

有効ですが、このコードを使用すると、次のようになります。

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

最初のものと同じですが、mysqli_close()。二つ目です。

何が問題ですか?mysql_mysqli一緒に使用できませんか?それとも正常ですか?接続が有効かどうかを確認する方法はありますか?(if(mysq...)


5
mysqlは非推奨になりました。それらが一緒に機能しないことだけが理にかなっています。なぜそうしようとしているのですか。
スターリングアーチャー

7
mysql_*関数を完全に使用することは避けてください。これらはエラーが発生しやすく安全ではないため、間もなくPHPから削除されます(現時点では非推奨としてマークさています)。[この素晴らしい答え] [0]は彼らが悪い理由をより詳細に説明ています。[0]:stackoverflow.com/a/12860046/1055295
AndreiBârsan2013

2
1)あなたは古くからの古臭いインターフェース(mysql)を使用することを主張しています。これは古くからドキュメントで廃止されているとマークされています。 )あなたはとても驚いていて、あなたがそれについてSOに尋ねるのはうまくいかないのですが、あなたがしていることがナンセンスであることはかなり明白です。
fvu 2013

1
それは迷信ではありません。もちろん、mysqli_*関数を使って悪いコードを、関数を使って良いコードを書くことができmysql_*ます。ただし、後者のカテゴリは、OOスタイルの呼び出しや準備されたステートメント(2つの例を挙げると)をサポートできないため、下位の関数セットであるため、非推奨としてマークされています。同じ作業を行うために2つのツールを選択した場合、そのうちの1つは長期的に見て明らかに優れており、より柔軟ですが、正しい答えは明らかではありませんか?
AndreiBârsan2013

1
もちろん違います。しかし、非推奨の機能とアクティブにサポートされている機能のどちらかを選択するオプション(たとえば、独自の抽象化を行うため)を考えると、なぜ古い関数を使用するのでしょうか。
AndreiBârsan2013

回答:


65

いいえ、あなたは使用することはできませんmysqlmysqli一緒に。それらは別個のAPIであり、それらが作成するリソースは互いに互換性がありません。

ありますmysqli_closeけれども、。


とにかく接続を閉じる必要はないはずですが、オブジェクトは、どこからも参照されなくなったときに自分自身をクリーンアップします。(プレーンな古いリソースがそれを行うかどうかは
わかり

@cHaoだけでなく、スクリプトが終了すると、PHPは開いているMySQL接続をすべて閉じます
Explosion Pills 2013

1
しかし、必ずしもそうとは限らないので、私の経験では、常にファイルの最後にクローズを配置します。
RationalRabbit 2017

14

参照付きの3つのMYSQL APIに関する一般的な答えをここに示します。

次の3つ(のいずれかの混在させることはできませんmysql_*mysqli_*PDOそれだけでは動作しません、一緒にPHPから)MYSQLのAPIのを。それはマニュアルFAQにもあります

拡張機能を混在させることはできません。したがって、たとえば、mysqli接続をPDO_MySQLまたはext / mysqlに渡しても機能しません


接続からクエリまで、同じMySQL APIとその関連関数を使用する必要があります。


ある人は今日mysql_real_escape_string()、コードの残りの部分がPDOであるものと混合するときに問題/エラーがないことを私に伝えようとしました。これらのさまざまなAPIを使用していたときにここで取得できなかったものはありますか?私はここで無知ですか?これは「削除済み」の質問用のものです。stackoverflow.com/ q / 34209127誰でも不思議に思うはずですが、10,000人以上のメンバーだけが表示できます。これに関連して$stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))-ここで何か不足していますか?
Funk Forty Niner、2015

1
@ Fred-ii-あなたは正しいです:) マニュアルを読むと、あなたが正しいことがわかります。おそらく何が起こったのでしょうか、それmysql_real_escape_string()黙ってデフォルトのパラメータ接続を試み、それがOPのために機能しました。したがって、文字セットを取得するための接続を作成しただけです。OPには2つの接続があります
Rizier123

OPが少なくとも2つの別々の接続を持っていると私に教えてくれたのなら、おそらく同意するでしょう。彼らは別の方法で決定しました。しかし、それがどのように機能するかはまだわかりません。もしそうなら、私は困惑しています。
Funk Forty Niner、2015

@ Fred-ii-参照:link_identifierデフォルトの接続設定を使用しますini_get()。したがって、おそらくデフォルト設定でOPに対してのみ機能します。私はそのままにして新しいコーヒーを飲みます(would)。
Rizier123

について何か追加したいと思うかもしれませんsqlsrv_query()。私はここで質問を閉じました。stackoverflow.com/ q / 41263771
Funk Forty Niner '21 / 12/21

2

技術的には、必要な数の個別の接続を使用できますが、問題は単なるタイプミスによって引き起こされます。ある拡張機能のリソースを別の拡張機能の関数と共に使用することはできません。

ただし、単一のAPIからのものでも、異なるAPIからのものでも、同じスクリプトからの複数の接続は避けください。それはあなたのデータベースサーバーに負担をかけ、そのリソースを使い果たすでしょう。したがって、技術的には可能ですが、コードに異なる拡張機能を混在させないでください。短期間のリファクタリングのために保存してください。


これはおそらく良い考えですが、接続プーリングはこのために開発されました。Webサーバーにヒットする複数のWebリクエストがある場合、同じ接続を簡単に使用できないため、新しい接続を開きます。接続プールは、アプリサーバーとデータベースのオーバーヘッドを節約します。
Doug

-3

MySQLiMySQLとにかく、現在非推奨となっているよりもはるかに安全です。だからこそ、あなたはこだわる必要MySQLiがあり、両方が異なるのでそれらを混ぜることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.