Команды не синхронизированы; вы не можете запустить эту команду сейчас

Я пытаюсь выполнить свой 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, я все равно получаю команду от ошибки синхронизации.

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

function clearStoredResults(){
    global $mysqli;

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

}

Ответ 5

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

$this->db->reconnect();

Исправлено.

Ответ 6

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

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

Ответ 7

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

$numRecords->execute();

$numRecords->store_result();

что все

Ответ 8

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

привязка param была "динамической", поэтому у меня была переменная, которая устанавливает параметры данных, чтобы использовать bind_param. Так что эта переменная была неправильной, но вместо того, чтобы бросать ошибку, например, "неверные данные параметров", она говорит "вне синхронизации bla bla bla", поэтому я был смущен...

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

Ответ 9

После того, как вы использовали

stmt->execute();

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

stmt->close();

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

Ответ 10

Я думаю, проблема в том, что вы создаете новое соединение в этой функции, а затем не закрываете ее в конце. Почему бы вам не попробовать перейти в существующее соединение и повторно использовать его?

Другая возможность заключается в том, что вы возвращаетесь из середины цикла. Вы никогда не завершаете эту внешнюю выборку.

Ответ 11

Проверьте, правильно ли вы печатаете все параметры. Он выдает ту же ошибку, если количество параметров, определенных и переданных функции, различно.

Ответ 12

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

Я НЕ использую mysqli, используя mysql_connect У меня были простые запросы, но один запрос заставил все остальные запросы сбой в одном и том же соединении.

Я использую mysql 5.7 и php 5.6 У меня была таблица с данными типа "JSON". очевидно, что моя php-версия не распознала возвращаемое значение из mysql (php просто не знал, что делать с JSON-Format, потому что встроенный mysql-модуль был слишком старым (по крайней мере, я думаю))

на данный момент я изменил JSON-Field-Type на Text (так как теперь мне не нужны собственные функции mysql JSON), и все работает отлично

Ответ 13

На самом деле, я столкнулся с этими проблемами в SQLyog

Команды не синхронизированы; вы не можете запустить эту команду сейчас

Я просто перезагрузил SQLyog, и я решил проблему.

Ответ 14

Если вы используете либо буферный, либо небуферизованный результирующий набор для извлечения данных, сначала вы должны просто очистить извлеченные данные из памяти, как только вы извлекли все данные. Поскольку вы не можете выполнить другую процедуру MYSQL в том же соединении, пока вы не очистите извлеченную память. Добавьте это ниже справа в конец вашего script, так что решит проблему

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

Ссылка из документации PHP

Ответ 15

Я столкнулся с этой ошибкой, используя Doctrine DBAL QueryBuilder.

Я создал запрос с помощью QueryBuilder, который использует подвыборы столбцов, также созданные с помощью QueryBuilder. Подвыборы были созданы только через $queryBuilder->getSQL() и не были выполнены. Произошла ошибка при создании второго подвыбора. Предварительно выполнив каждый подвыбор с помощью $queryBuilder->execute() перед использованием $queryBuilder->getSQL(), все $queryBuilder->getSQL(). Это как если бы соединение connection $queryBuilder->connection оставалось в недопустимом состоянии для создания нового SQL перед выполнением текущего подготовленного SQL, несмотря на новый экземпляр QueryBuilder в каждой подвыборке.

Мое решение состояло в том, чтобы написать подвыборы без QueryBuilder.

Ответ 16

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

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

mysqli_stmt_close ($ STMT);

Мой код

get_category.php (здесь с использованием оператора prepare)

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