문제

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;
        }
    }
}

나는 이것에 대해 읽으려고 노력했지만 무엇을 해야할지 확신 할 수 없습니다. 상점 결과와 무료 결과에 대해 읽었지만 사용할 때는 아무런 차이가 없었습니다. 나는이 오류가 어느 시점에서 발생하는지 정확히 확실하지 않으며 그것이 왜 발생하는지, 그리고 그것을 고치는 방법을 알고 싶습니다.

Debug 문에 따르면 Countquery의 첫 번째 IF 루프는 입력되지 않았습니다. '% ? %'. 그러나 내가 단지 선택한다면 * 같은 절을 기반으로 제한하려고하는 대신 여전히 동기화 오류에서 명령을 얻습니다.

도움이 되었습니까?

해결책

MySQLI는 기본적으로 부패하지 않은 쿼리를 사용하기 때문에 두 개의 동시 쿼리를 가질 수 없습니다 (준비된 명령문의 경우; 바닐라의 반대입니다. mysql_query). 첫 번째를 배열로 가져 오거나이를 통해 루프하거나 MySQLI에 쿼리를 버퍼링하도록 지시 할 수 있습니다. $stmt->store_result()).

보다 여기 자세한 내용은.

다른 팁

C 응용 프로그램 에서이 문제를 해결했습니다 - 다음은 다음과 같습니다.

  1. MySQL 포럼에서 인용 :

    이 오류는 당신이 할 때 발생합니다 애플리케이션 내부의 세미콜론 구분표로 쿼리를 종료하십시오.. 명령 줄이나 쿼리 브라우저에서 실행할 때 세미콜론 구분 기호로 쿼리를 종료해야하지만 응용 프로그램 내부의 쿼리에서 구분기를 제거하십시오.

  2. 쿼리를 실행하고 결과를 처리 한 후 [C API : mysql_store_result()], 나는 두 개 이상의 선택 문과 같은 여러 SQL 명령문 실행을 통해 발생하는 잠재적으로 보류중인 결과를 반복합니다 (결과를 다루지 않고 뒤로 연속).

    사실 내 절차는 여러 결과를 반환하지 않지만 데이터베이스는 실행 될 때까지 다음을 알지 못합니다 : [C API : mysql_next_result()]. 나는 0이 아닌 반환 될 때까지 루프로 (좋은 측정을 위해) 이것을한다. 현재 연결 핸들러가 다른 쿼리를 실행해도 괜찮다는 것을 알고 있습니다 (핸들러를 캐시하여 연결 오버 헤드를 최소화 함).

    이것은 내가 사용하는 루프입니다.

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

나는 PHP를 모르지만 비슷한 것이 있다고 확신합니다.

나는 오늘 같은 문제를 겪었지만 저장된 절차로 작업 할 때만. 이렇게하면 쿼리가 멀티 쿼리처럼 행동하게되므로 다른 쿼리를 만들기 전에 다른 결과를 "소비"해야합니다.

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

$ mysqli-> 쿼리를 사용하기 전에 매번이 기능을 호출합니다.

function clearStoredResults(){
    global $mysqli;

    do {
         if ($res = $mysqli->store_result()) {
           $res->free();
         }
        } while ($mysqli->more_results() && $mysqli->next_result());        

}

나는 CodeIgniter를 사용합니다. 하나의 서버 OK ... 이것은 아마도 오래된 것 ... 어쨌든 사용

$this->db->reconnect();

고쳤다.

문제는 대부분의 MySQL API가 구축 된 MySQL Client C 라이브러리입니다. 문제는 C 라이브러리가 쿼리의 동시 실행을 지원하지 않으므로 그 위에 내장 된 모든 API도 그렇지 않다는 것입니다. 부패하지 않은 쿼리를 사용하더라도. 이것이 비동기 MySQL API가 작성된 이유 중 하나입니다. TCP 및 Wire-Protocol을 사용하여 MySQL 서버와 직접 통신합니다. 하다 동시 쿼리를 지원합니다.

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

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

$numRecords->execute();

$numRecords->store_result();

그게 다야

이전 답변이 도움이되지 않은 사람들을 위해 ... 여기 내 문제가 무엇인지 여기에 있습니다 !!!

매개 변수 바인딩은 "동적"이므로 사용하기 위해 데이터의 매개 변수를 설정하는 변수가있었습니다. bind_param. 따라서 변수는 잘못되었지만 "잘못된 매개 변수 데이터"와 같은 오류를 던지는 대신 "Sync Bla Bla Bla에서"라고 말합니다. 그래서 나는 혼란 스러웠습니다 ...

나는 그것이 누군가를 도왔기를 바랍니다!

일단 사용하면

stmt->execute();

다른 쿼리를 사용하려면 닫아야합니다.

stmt->close();

이 문제는 몇 시간 동안 나를 사냥했습니다. 바라건대, 그것은 당신의 것을 고칠 것입니다.

문제는 당신이 함수에 새로운 연결을하고 결국 그것을 닫지 않는다는 것입니다. 기존 연결을 통과시키고 재사용 해보지 않겠습니까?

또 다른 가능성은 당신이 시간 루프 페치의 중간에서 돌아 오는 것입니다. 당신은 그 외부 페치를 완성하지 않습니다.

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

이것은 원래 질문과 관련이 없지만 동일한 오류 메시지가 있었고이 스레드는 Google에서 처음으로 인기를 얻었으며 문제가 무엇인지 알아내는 데 시간이 걸렸으므로 다른 사람들에게는 사용될 수 있습니다.

MySQLI를 사용하지 않고 MySQL_Connect를 사용하고 있습니다. 간단한 쿼리가 있었지만 하나의 쿼리로 인해 다른 모든 쿼리가 동일한 연결 내에서 실패했습니다.

MySQL 5.7과 PHP 5.6을 사용하여 데이터 유형 "JSON"이있는 테이블이있었습니다. 분명히, 내 PHP 배반은 MySQL의 반환 값을 인식하지 못했습니다 (PHP는 내장 된 MySQL 모듈이 너무 오래 되었기 때문에 JSON- 형식으로 무엇을 해야할지 몰랐습니다.

지금은 JSON-Field 유형을 텍스트로 변경했습니다 (지금은 기본 MySQL JSON 기능이 필요하지 않습니다).

데이터를 가져 오기 위해 버퍼 또는 부패하지 않은 결과 세트를 사용하는 경우 먼저 메모리에서 가져온 데이터를 간단히 지워야합니다. 일단 모든 데이터를 가져 오면. 메모리를 제거 할 때까지 동일한 연결에서 다른 MySQL 프로 시저를 실행할 수 없으므로. 아래 기능을 추가하여 스크립트의 오른쪽 끝을 추가하므로 문제를 풀다

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

PHP 문서의 참조

나는 교리 dbal querybuilder를 사용 하여이 오류를 일으켰습니다.

QueryBuilder로 만든 열 서브 셀렉션을 사용하는 QueryBuilder가있는 쿼리를 만들었습니다. 하위 선택 사항은 만으로만 생성되었습니다 $queryBuilder->getSQL() 그리고 실행되지 않았습니다. 오류는 두 번째 하위 선택을 만들 때 발생했습니다. 각 하위 선택 사항을 임시적으로 실행함으로써 $queryBuilder->execute() 사용하기 전에 $queryBuilder->getSQL(), 모든 것이 효과가있었습니다. 마치 연결처럼 보입니다 $queryBuilder->connection 각 하위 선택의 새로운 QueryBuilder 인스턴스에도 불구하고 현재 준비된 SQL을 실행하기 전에 새 SQL을 생성하기위한 유효하지 않은 상태로 유지됩니다.

내 해결책은 QueryBuilder없이 하위 선택 사항을 작성하는 것이 었습니다.

내 문제는 첫 번째 준비 명령문을 사용하고 같은 페이지에서 mySQLI 쿼리를 사용하고 있었고 "동기화에서 명령을 내리고 지금이 명령을 실행할 수 없습니다"라는 오류가 발생했다는 것입니다. 오류는 준비 명령문이있는 코드를 사용할 때만 이루어졌습니다.

내가 한 일은 질문을 닫는 것이 었습니다. 그리고 그것은 효과가있었습니다.

mysqli_stmt_close ($ stmt);

내 코드

get_category.php (여기서 준비 문을 사용하여)

    <?php


    global $connection;
    $cat_to_delete =    mysqli_real_escape_string($connection, $_GET['get'] );

    $sql = "SELECT category_name FROM categories WHERE category_id = ? ;";


    $stmt = mysqli_stmt_init($connection);

    if (!mysqli_stmt_prepare($stmt, $sql))
        $_SESSION['error'] = "Error at preaparing for deleting query. mysqli_stmt_error($stmt) ." & redirect('../error.php');

    mysqli_stmt_bind_param($stmt, 's', $cat_to_delete);

    if (!mysqli_stmt_execute($stmt))
        $_SESSION['error'] = "ERror at executing delete category ".mysqli_stmt_error($stmt) &
            redirect('../error.php');


    mysqli_stmt_bind_result($stmt, $cat_name);

    if (!mysqli_stmt_fetch($stmt)) {
        mysqli_stmt_error($stmt);
    }



    mysqli_stmt_free_result($stmt);
    mysqli_stmt_close($stmt);

admin_get_category_body.php (여기서 mysqli)

        <?php

        if (isset($_GET['get']) && !empty($_GET['get']) )
        {
            include 'intodb/edit_category.php';
        }


        if (check_method('get') && isset($_GET['delete']) )
        {
            require 'intodb/delete_category.php';
        }


        if (check_method('get') && isset($_GET['get']) )
        {
            require 'intodb/get_category.php';
        }


        ?>

        <!--            start: cat body          -->

        <div     class="columns is-mobile is-centered is-vcentered">
            <div class="column is-half">
                <div   class="section has-background-white-ter box ">


                    <div class="has-text-centered column    " >
                        <h4 class="title is-4">Ctegories</h4>
                    </div>

                    <div class="column " >


                        <?php if (check_method('get') && isset($_GET['get'])) {?>
                        <form action="" method="post">
                            <?php } else {?>
                            <form action="intodb/add_category.php" method="post">
                                <?php } ?>

                                <label class="label" for="admin_add_category_bar">Add Category</label>
                                <div class="field is-grouped">

                                    <p class="control is-expanded">

                                        <?php if (check_method('get') && isset($_GET['get'])) {?>

                                            <input id="admin_add_category_bar" name="admin_add_category_bar_edit" class="input" type="text" placeholder="Add Your Category Here" value="<?php echo $cat_name; ?>">

                                            <?php


                                            ?>
                                        <?php } else {?>
                                            <input id="admin_add_category_bar" name="admin_add_category_bar" class="input" type="text" placeholder="Add Your Category Here">

                                        <?php } ?>
                                    </p>
                                    <p class="control">
                                        <input type="submit" name="admin_add_category_submit" class="button is-info my_fucking_hover_right_arrow" value="Add Category">
                                    </p>
                                </div>
                            </form>


                            <div class="">

                                <!--            start: body for all posts inside admin          -->


                                <table class="table is-bordered">
                                    <thead>
                                    <tr>
                                        <th><p>Category Name</p></th>
                                        <th><p>Edit</p></th>
                                        <th><p>Delete</p></th>
                                    </tr>
                                    </thead>

                                    <?php

                                    global $connection;
                                    $sql = "SELECT * FROM categories ;";

                                    $result = mysqli_query($connection, $sql);
                                    if (!$result) {
                                        echo mysqli_error($connection);
                                    }
                                    while($row = mysqli_fetch_assoc($result))
                                    {
                                        ?>
                                        <tbody>
                                        <tr>
                                            <td><p><?php echo $row['category_name']?></p></td>
                                            <td>
                                                <a href="admin_category.php?get=<?php echo $row['category_id']; ?>" class="button is-info my_fucking_hover_right_arrow" >Edit</a>

                                            </td>

                                            <td>
                                                <a href="admin_category.php?delete=<?php echo $row['category_id']; ?>" class="button is-danger my_fucking_hover_right_arrow" >Delete</a>

                                            </td>
                                        </tr>


                                        </tbody>
                                    <?php }?>
                                </table>

                                <!--           end: body for all posts inside admin             -->




                            </div>

                    </div>
                </div>


            </div>

        </div>
        </div>

방금 내 마음을 넘어간 것, 나는 또한 Global $ Connection을 통해 연결 변수를 다시 추가하고 있습니다. 따라서 기본적으로 MySQLI_STMT_CLOSE ($ STMT)와 함께 준비 문을 종료 한 후 완전히 새로운 쿼리 시스템 세트가 시작되고 있다고 생각합니다. 또한이 파일 및 기타 물건을 포함하여

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top