>백엔드 개발 >PHP 튜토리얼 >MySQL 쿼리를 사용할 때 PHP에서 '명령이 동기화되지 않음' 오류가 발생하는 이유는 무엇입니까?

MySQL 쿼리를 사용할 때 PHP에서 '명령이 동기화되지 않음' 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-19 21:28:16183검색

Why Do I Get a

MySQL 쿼리가 포함된 PHP 코드에서 "명령이 동기화되지 않음" 오류

mysqli를 사용하여 여러 MySQL 쿼리가 포함된 PHP 스크립트를 실행할 때, 오류가 발생할 수 있습니다: "명령이 동기화되지 않았습니다. 지금은 이 명령을 실행할 수 없습니다." 이 문제는 이전 쿼리의 결과를 가져와 처리하거나 MySQL 서버의 쿼리 명령 캐시를 지우기 전에 후속 쿼리를 시도할 때 발생합니다.

질문에 제공된 코드는 두 개의 쿼리를 실행합니다. 하나는 레코드 수를 계산하고 다른 하나는 쿼리입니다. 검색 문자열을 기반으로 행을 검색합니다. 그러나 첫 번째 쿼리 결과를 가져오기 전에 두 번째 쿼리가 실행됩니다. 이로 인해 "동기화되지 않음" 오류가 발생합니다.

오류 원인

  • 버퍼되지 않은 쿼리: MySQLI는 기본적으로 버퍼되지 않은 쿼리를 사용합니다. 준비된 명령문의 경우 결과가 사용 가능한 대로 부분적으로 스트리밍된다는 의미입니다. 첫 번째 쿼리 결과를 버퍼링하기 전에 후속 쿼리를 시도하면 명령이 동기화되지 않아 오류가 발생할 수 있습니다.
  • 불완전한 쿼리 실행: 쿼리를 제대로 처리하지 않고 여러 쿼리를 시도하는 경우 결과적으로 불완전한 명령이 서버 캐시에 누적될 수 있습니다. 이로 인해 후속 쿼리가 중단되고 오류가 발생할 수 있습니다.

가능한 해결 방법

  • 버퍼 결과: 이 오류를 방지하려면, $stmt->store_result()를 사용하여 다음 쿼리를 실행하기 전에 쿼리 결과를 버퍼링하세요. $stmt->fetch()를 사용하여 버퍼링된 결과를 가져온 다음 $stmt->free_result()를 사용하여 서버의 캐시를 지웁니다.
  • 첫 번째 쿼리 결과 가져오기: 또는 모두 가져오기 배열에 대한 첫 번째 쿼리의 결과입니다. 이렇게 하면 결과가 소비되고 가져오지 않은 결과로 인한 간섭 없이 후속 쿼리를 실행할 수 있습니다.
  • 트랜잭션 사용: 여러 쿼리가 관련되어 있고 순차적으로 실행되어야 하는 경우 트랜잭션을 사용하여 프로세스를 처리하는 것이 좋습니다. 단일 원자로서 단위.

다음은 $stmt->store_result()를 사용하여 첫 번째 쿼리 결과를 버퍼링하는 예입니다.

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
$con->query("SET NAMES 'utf8'");
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $numRecords->store_result(); // Buffer the results
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
}

위 내용은 MySQL 쿼리를 사용할 때 PHP에서 '명령이 동기화되지 않음' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.