php - PHP / MySQLiの複数のSQLオブジェクト

原文 php mysql mysqli

しばらくの間、「このコマンドは現在実行できません。コマンドが同期していません」というエラーを回避するために、phpで複数のSQL接続を使用しています。

1つの接続だけで実行できる場合と、複数の接続が必要な場合を判断できないようです。次のコードは、相互に関連するさまざまなテーブルから物を取得する方法です。

$sqlは、同じデータベースに接続されているデフォルトのmysqliオブジェクトです。例は、問題の難解なバージョンであり、疑問に思っている場合に備えて、実際の目的は果たしません。

$stmt1 = $sql1->prepare ('SELECT orderid,date FROM orders');
$stmt2 = $sql2->prepare ('SELECT product,price FROM orderlines WHERE orderid= ?');

$stmt1->execute();
$stmt1->bind_result($orderid,$date);

while ($stmt1->fetch()) {

echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";

$stmt2->bind_param("i",$orderid);
$stmt2->execute();
$stmt2->bind_result($product, $price);

 while ($stmt2->fetch() {
  echo "Product from order is: " . $product . " and costs " . $price . "<br>";
 }

echo "End of order " . $orderid;

}

$stmt1->close();
$stmt2->close();

$sql1->close();
$sql2->close();


これは機能しますが、同じmysqliオブジェクトを使用しない場合のみです。 1つの共通$sqlオブジェクトのみで両方を実行しようとすると、2番目のstmtの結果は空のままです。

だから問題は、これは起こるはずですか、そして上記のアプローチは良い習慣か悪い習慣ですか?

私はこれで問題はありません-すべてが本当にうまくいきますが、これが行われる方法は私には奇妙に思われ、この特定の問題について何も見つけることができません。

編集:これが発生する場所を表示するために、質問を注文と注文ラインの例に更新しました。

編集2:two mysqli querys, one in a while loopを見つけました-しかし、それは私の質問を解決策として投稿します。
答え
1つのMySQL接続では、一度に1つのクエリしか処理できません。一度により多くのステートメントを準備することもできます(これらのデータは引き続きMySQLiドライバーに保持されます)。ただし、execute()を使用すると、ステートメントはデータベースに送信され、データベースは今後のすべてのbind_param()およびbind_result()リクエストが新しいステートメントを送信するまで、同じステートメント。

同時に2つのステートメント=> DBへの2つの接続=> 2つのmysqliオブジェクト。



さらに、問題は次のような1つのクエリで解決できます。

$stmt1 = $sql1->prepare ('SELECT o.orderid,o.date,b.product,b.price FROM orders o LEFT JOIN orderlines b ON b.orderid=o.orderid ORDER BY o.orderid');
$stmt1->execute();
$stmt1->bind_result($orderid,$date,$product,$price);
$prev_order_id=false;
while ($stmt1->fetch())
{
    if($prev_order_id!=$orderid)
    {
        if($prev_order_id!==false)
            echo "End of order " . $prev_orderid."<br>";
        echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";
    }
    if(is_null($product))
        echo "Product from order is: " . $product . " and costs " . $price . "<br>";
    $prev_order_id=$orderid;
}
if($prev_order_id!==false)
    echo "End of order " . $prev_orderid."<br>";
$stmt1->close();
$sql1->close();
関連記事

php - CentOSにPHP FileInfoモジュールをインストールする方法

php - データベースから取得した文字列Null

php - HtmlPurifierBundle config.yml Symfony2でURI.SafeIframeRegexpを構成する方法

php - mysqlはローカルdbプロジェクトのスキーマを使用して、phpで新しいdbを作成するときにdb構造を作成します

php - Functions.phpでメニューCSSワードプレスをオーバーライドする

php - Laravelブレードテンプレートを使用してJSONコンテンツをループする正しい方法?

php - WPパンくずリストに「カテゴリ」を追加したい

php - ajax post request content-type application / formdata vs application / jsonのJSON文字列

javascript - データベースからデータを取得した後、Googleマップにマーカーを表示する

php - Yii urlManagerでドメインを書き換える方法