Команды не синхронизированы; Вы не можете запустить эту команду сейчас - PullRequest
83 голосов
/ 05 марта 2009

Я пытаюсь выполнить свой PHP-код, который вызывает два MySQL-запроса через mysqli, и выдает ошибку «Команды не синхронизированы; вы не можете запустить эту команду сейчас».

Вот код, который я использую

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

Я пытался прочитать об этом, но я не уверен, что делать. Я читал о результатах магазина и бесплатном результате, однако они не имели никакого значения при их использовании. Я не уверен, в каком именно месте возникает эта ошибка, и хотел бы знать, почему она вызывается, и как ее исправить.

Судя по моим операторам отладки, первый цикл if для countQuery даже не вводится из-за ошибки в моем синтаксисе sql около '% ? %'. Однако если я просто выберу * вместо попытки ограничить на основе предложения LIKE, я все равно получу команду из-за ошибки синхронизации.

Ответы [ 15 ]

103 голосов
/ 05 марта 2009

У вас не может быть двух одновременных запросов, потому что mysqli по умолчанию использует небуферизованные запросы (для подготовленных операторов; для vanilla mysql_query все наоборот). Вы можете либо извлечь первый из них в массив и пройти через него, либо указать mysqli для буферизации запросов (используя $stmt->store_result()).

Подробнее см. здесь .

31 голосов
/ 30 ноября 2009

Я решил эту проблему в своем приложении C - вот как я это сделал:

  1. Цитата из форумов mysql:

    Эта ошибка возникает, когда вы завершаете свой запрос точкой с запятой внутри приложения . Хотя при завершении его из командной строки или в браузере запросов необходимо завершать запрос с помощью точки с запятой, удалите его из запроса внутри приложения.

  2. После выполнения моего запроса и работы с результатами [C API: mysql_store_result()] я перебираю любые дальнейшие потенциально ожидающие результаты, возникающие в результате выполнения нескольких операторов SQL, например двух или более операторов выбора (вплотную без учета результатов).

    Дело в том, что мои процедуры не возвращают несколько результатов, но база данных не узнает об этом, пока я не выполню: [C API: mysql_next_result()]. Я делаю это в цикле (для хорошей меры), пока он не вернет ненулевое значение. Именно тогда текущий обработчик соединения знает, что можно выполнить другой запрос (я кеширую свои обработчики, чтобы минимизировать издержки соединения).

    Это цикл, который я использую:

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

Я не знаю PHP, но уверен, что у него что-то похожее.

15 голосов
/ 21 февраля 2015

У меня сегодня была такая же проблема, но только при работе с хранимой процедурой. Это приводит к тому, что запрос ведет себя как мультизапрос, поэтому вам необходимо «использовать» другие доступные результаты, прежде чем выполнять другой запрос.

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
7 голосов
/ 12 сентября 2016

Я вызываю эту функцию каждый раз перед использованием $ mysqli-> query Работает и с хранимыми процедурами.

function clearStoredResults(){
    global $mysqli;

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

}
2 голосов
/ 13 сентября 2012

Я использую CodeIgniter. Один сервер в порядке ... этот, вероятно, старше ... В любом случае, используя

$this->db->reconnect();

Исправлено.

1 голос
/ 01 июня 2019

Как только вы использовали

stmt->execute();

Вы должны закрыть его, чтобы использовать другой запрос.

stmt->close();

Эта проблема преследовала меня часами. Надеюсь, это исправит ваше.

1 голос
/ 06 марта 2018

Для тех, кому предыдущие ответы не помогли ... вот что было МОЕЙ ПРОБЛЕМОЙ !!!

привязка параметров была «динамической», поэтому у меня была переменная, которая устанавливает параметры данных для использования bind_param . Так что эта переменная была неправильной, но вместо того, чтобы выдавать ошибку типа «неверные данные параметров», она говорит «несинхронизировано, бла-бла-бла», так что я был в замешательстве ...

Надеюсь, это кому-то помогло!

1 голос
/ 28 октября 2014

, чтобы решить эту проблему, вы должны сохранить данные результатов перед использованием

$numRecords->execute();

$numRecords->store_result();

это все

1 голос
/ 06 марта 2009

Проблема в клиентской библиотеке MySQL C, на которой построено большинство MySQL API. Проблема в том, что библиотека C не поддерживает одновременное выполнение запросов, поэтому все API, созданные поверх этого, также не поддерживают. Даже если вы используете небуферизованные запросы. Это одна из причин, почему был написан асинхронный API MySQL. Он напрямую связывается с сервером MySQL по протоколу TCP, а проводной протокол поддерживает одновременные запросы.

Ваше решение - либо изменить алгоритм, чтобы вам не нужно было одновременно выполнять оба процесса, либо изменить их на использование буферизованных запросов, что, вероятно, является одной из первоначальных причин их существования в библиотеке C другое - предоставить вид курсора).

0 голосов
/ 04 мая 2019

Моя проблема заключалась в том, что я использовал сначала оператор подготовки, а затем я использовал запрос mysqli на той же странице и получал ошибку «Команды не синхронизированы; вы не можете запустить эту команду сейчас». Ошибка была только тогда, когда я использовал код с оператором prepare.

Я закрыл вопрос. и это сработало.

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>

Что-то, что только что пришло мне в голову, я также снова добавляю переменную соединения через глобальное $ connection ;. Поэтому я думаю, что в целом после завершения оператора prepare запускается целый новый набор систем запросов с помощью mysqli_stmt_close ($ stmt); а также я добавляю эти файлы и другие вещи через include

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...