111

mysqliを介して2つのMySQLクエリを呼び出すPHPコードを実行しようとしていますが、「コマンドが同期していません。現在、このコマンドを実行できません」というエラーが表示されます。

これが私が使っているコードです

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
}  else {

print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "user", "password", "db");
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

私はこれを読んでみましたが、どうしたらよいかわかりません。ストアの結果と無料の結果について読んだことがありますが、これらを使用しても違いはありません。このエラーが発生している正確な時点がわかりません。原因とその修正方法を知りたいと思います。

私のデバッグステートメントを見ると、nearの近くにある私のsql構文のエラーのために、countQueryの最初のifループも入力されていません'% ? %'。ただし*、LIKE句に基づいて制限しようとするのではなく、選択しただけでも、コマンドの同期がとれていないエラーが発生します。

4

22 に答える 22

127

mysqli はデフォルトでバッファリングされていないクエリを使用するため、2 つの同時クエリを使用することはできません (準備されたステートメントの場合。vanilla の場合は逆ですmysql_query)。最初のものを配列にフェッチしてループするか、mysqli にクエリをバッファリングするように指示することができます ( を使用$stmt->store_result())。

詳しくはこちらをご覧ください。

于 2009-03-05T13:24:45.990 に答える
39

Cアプリケーションでこの問題を解決しました-これが私がやった方法です:

  1. mysql フォーラムからの引用:

    このエラーは、アプリケーション内でセミコロン区切り文字を使用してクエリを終了すると発生します。コマンド ラインまたはクエリ ブラウザからクエリを実行する場合は、クエリをセミコロン区切り記号で終了する必要がありますが、アプリケーション内のクエリから区切り記号を削除してください。

  2. クエリを実行して結果を処理した後 [C API: mysql_store_result()]、複数の SQL ステートメントの実行 (結果を処理せずに背中合わせに) など、複数の SQL ステートメントの実行によって発生する保留中の可能性のある結果を反復処理します。

    実際には、私の手順は複数の結果を返さないのですが、データベースは実行するまでそれを知りません: [C API: mysql_next_result()]. ゼロ以外が返されるまで、これを(適切な測定のために)ループで行います。その時点で、現在の接続ハンドラーは、別のクエリを実行しても問題ないことを認識します (接続のオーバーヘッドを最小限に抑えるために、ハンドラーをキャッシュします)。

    これは私が使用するループです:

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    

私はPHPを知りませんが、似たようなものがあると確信しています。

于 2009-11-30T18:08:35.210 に答える
18

今日も同じ問題がありましたが、ストアド プロシージャを使用している場合のみでした。これにより、クエリはマルチクエリのように動作するため、別のクエリを作成する前に、利用可能な他の結果を「消費」する必要があります。

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
于 2015-02-20T22:37:58.690 に答える
4

CodeIgniter を使用しています。1つのサーバーOK ...これはおそらく古い...とにかく使用

$this->db->reconnect();

修正しました。

于 2012-09-13T00:39:25.787 に答える
1

この問題を解決するには、使用する前に結果データを保存する必要があります

$numRecords->execute();

$numRecords->store_result();

それで全部です

于 2014-10-28T14:53:02.457 に答える
1

問題は、ほとんどの MySQL API が構築されている MySQL クライアント C ライブラリです。問題は、C ライブラリがクエリの同時実行をサポートしていないため、その上に構築されたすべての API もサポートしていないことです。バッファリングされていないクエリを使用する場合でも。これが、非同期 MySQL API が作成された理由の 1 つです。TCP を使用して MySQL サーバーと直接通信し、ワイヤ プロトコル同時クエリをサポートします。

あなたの解決策は、両方を同時に進行させる必要がないようにアルゴリズムを変更するか、バッファリングされたクエリを使用するように変更することです。一種のカーソルを提供します)。

于 2009-03-06T03:59:25.670 に答える
0

問題は、関数で新しい接続を作成していて、最後に閉じていないことだと思います。既存の接続を渡して再利用してみませんか?

もう 1 つの可能性は、while ループ フェッチの途中から戻っていることです。その外部フェッチを完了することはありません。

于 2009-03-05T13:15:13.813 に答える
0

Doctrine DBAL QueryBuilder を使用してこのエラーに遭遇しました。

同じく QueryBuilder で作成された、列のサブセレクトを使用するクエリを QueryBuilder で作成しました。サブセレクトは経由でのみ作成され$queryBuilder->getSQL()、実行されませんでした。2 番目の副選択の作成時にエラーが発生しました。$queryBuilder->execute()を使用する前に、各サブセレクトを暫定的に実行すること$queryBuilder->getSQL()で、すべてが機能しました。$queryBuilder->connection各副選択で新しい QueryBuilder インスタンスがあるにもかかわらず、現在準備されている SQL を実行する前に新しい SQL を作成するには、接続が無効な状態のままであるかのようです。

私の解決策は、QueryBuilder を使用せずにサブセレクトを作成することでした。

于 2019-03-25T15:41:56.193 に答える