복붙노트

동기화되지 않은 명령. 이 명령을 지금 실행할 수 없습니다.

PHP

동기화되지 않은 명령. 이 명령을 지금 실행할 수 없습니다.

mysqli를 통해 두 개의 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;
        }
    }
}

나는 이것을 읽으려고했지만, 나는 무엇을해야할지 확신이 없다. 나는 상점 결과와 자유 결과에 대해 읽었지만, 이것들을 사용할 때 아무런 차이가 없다. 이 오류가 발생하는 정확한 시점을 확신 할 수 없으며 원인과 해결 방법을 알고 싶습니다.

내 디버그 문에 의해, countQuery에 대한 첫 번째 if 루프가 심지어 근처에 '%에 가까운 SQL 구문의 오류 때문에 입력되지 않습니다? % '. 그러나 LIKE 절을 기반으로 제한하려고 시도하는 대신 *를 선택하면 여전히 동기화 오류가 발생합니다.

해결법

  1. ==============================

    1.

    mysqli는 기본적으로 버퍼없는 쿼리를 사용하기 때문에 (준비된 명령문의 경우 이것은 바닐라 mysql_query와 반대이다), 두 개의 동시 쿼리를 가질 수 없다. 첫 번째 배열을 가져 와서 루프를 돌리거나 mysqli에 쿼리를 버퍼하도록 지시 할 수있다 ($ stmt-> store_result () 사용).

    자세한 내용은 여기를 참조하십시오.

  2. ==============================

    2.

    나는 C 애플리케이션에서이 문제를 해결했다.

    나는 PHP를 모르지만 그것은 비슷한 것을 가지고 있다고 확신한다.

  3. ==============================

    3.

    오늘도 같은 문제가 있었지만 저장 프로 시저로 작업 할 때만 마찬가지였습니다. 이렇게하면 쿼리가 다중 쿼리처럼 동작하므로 다른 쿼리를 만들기 전에 다른 결과를 "소비"해야합니다.

    while($this->mysql->more_results()){
        $this->mysql->next_result();
        $this->mysql->use_result();
    }
    
  4. ==============================

    4.

    $ mysqli-> query를 사용하기 전에 매번이 함수를 호출합니다. 저장 프로 시저에서도 작동합니다.

    function clearStoredResults(){
        global $mysqli;
    
        do {
             if ($res = $mysqli->store_result()) {
               $res->free();
             }
            } while ($mysqli->more_results() && $mysqli->next_result());        
    
    }
    
  5. ==============================

    5.

    나는 CodeIgniter를 사용한다. 하나의 서버 OK ...이 하나 더 오래된 ... 어쨌든 사용

    $this->db->reconnect();
    

    고쳤다.

  6. ==============================

    6.

    문제는 대부분의 MySQL API가 기반으로하는 MySQL 클라이언트 C 라이브러리입니다. 문제는 C 라이브러리가 쿼리의 동시 실행을 지원하지 않기 때문에 위에 빌드 된 모든 API도 쿼리를 지원하지 않는다는 것입니다. 버퍼링되지 않은 쿼리를 사용하는 경우에도 마찬가지입니다. 이것이 비동기 MySQL API가 작성된 한 가지 이유입니다. TCP를 사용하여 MySQL 서버와 직접 통신하며 와이어 프로토콜은 동시 쿼리를 지원합니다.

    해결책은 알고리즘을 수정하여 동시에 진행할 필요가 없도록하거나 버퍼링 된 쿼리를 사용하도록 변경하는 것입니다. 이는 아마도 C 라이브러리에 존재하는 원래 이유 중 하나 일 것입니다 (다른 하나는 커서의 종류를 제공하십시오).

  7. ==============================

    7.

    이 문제를 해결하려면 사용하기 전에 결과 데이터를 저장해야합니다.

    $numRecords->execute();
    
    $numRecords->store_result();
    

    그게 다야

  8. ==============================

    8.

    문제는 당신이 함수에서 새로운 연결을 만들고, 마지막에 그것을 닫지 않는다는 것입니다. 기존 연결을 전달하고 다시 사용 해보는 것은 어떨까요?

    또 다른 가능성은 당신이 while 루프를 가져 오는 도중에 돌아오고 있다는 것입니다. 그 바깥 쪽 가져 오기를 절대 완료하지 마십시오.

  9. ==============================

    9.

    모든 매개 변수를 올바르게 입력했는지 확인하십시오. 정의 된 매개 변수의 양과 함수에 전달 된 매개 변수의 양이 다른 경우에도 동일한 오류가 발생합니다.

  10. ==============================

    10.

    이것은 원래 질문과 관련이 없지만 동일한 오류 메시지가 있었으며이 스레드는 Google의 첫 번째 히트이며 문제가 무엇인지 파악하는 데 시간이 걸렸으므로 다른 사용자에게 유용 할 수 있습니다.

    나는 mysql_connect를 사용하면서 mysqli를 사용하지 않는다. 몇 가지 간단한 쿼리가 있었지만 하나의 쿼리로 인해 다른 모든 쿼리가 동일한 Connection 내에서 실패했습니다.

    나는 MySQL 5.7과 PHP 5.6을 사용한다. 나는 데이터 형식 "JSON"테이블을 가졌다. 분명히 내 php 버전은 MySQL에서 반환 값을 인식하지 못했습니다 (php는 JSON 형식과 관련하여 무엇을해야할지 몰랐습니다. 내장 된 mysql 모듈이 너무 오래 되었기 때문입니다.)

    지금은 JSON 필드 유형을 텍스트로 변경했습니다 (지금은 원시 MySQL의 JSON 기능이 필요하지 않습니다). 모든 것이 잘 작동합니다.

  11. ==============================

    11.

    데이터를 가져 오기 위해 Buffered 또는 Unbuffered 결과 집합을 사용하는 경우 먼저 모든 데이터를 가져온 후에 메모리에서 가져온 데이터를 지워야합니다. 가져온 메모리를 지울 때까지 동일한 연결에서 다른 MYSQL 프로 시저를 실행할 수 없기 때문에. 이 기능을 스크립트의 오른쪽 끝에 추가하면 문제가 해결됩니다.

    $numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch
    

    PHP 문서에서 참조

  12. ==============================

    12.

    이전 답변이 도움이되지 못했던 사람들은 ... 내 문제가 무엇인지 알려주세요 !!!

    param 바인딩은 "동적"이므로 bind_param을 사용하기 위해 데이터의 매개 변수를 설정하는 변수가있었습니다. 그래서 변수가 잘못되었지만 "잘못된 매개 변수 데이터"와 같은 오류가 발생하는 대신 "out of sync bla bla bla"라고 표시되어 혼란 스러웠습니다.

    나는 그것이 누군가를 도왔 으면 좋겠어!

  13. from https://stackoverflow.com/questions/614671/commands-out-of-sync-you-cant-run-this-command-now by cc-by-sa and MIT lisence