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

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

+83
источник поделиться
16 ответов

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

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

+103
источник

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

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

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

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

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

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

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

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

+31
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
+15
источник

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

function clearStoredResults(){
    global $mysqli;

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

}
+7
источник

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

$this->db->reconnect();

Исправлено.

+2
источник

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

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

+1
источник

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

$numRecords->execute();

$numRecords->store_result();

что все

+1
источник

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

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

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

+1
источник

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

stmt->execute();

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

stmt->close();

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

+1
источник

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

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

0
источник

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

0
источник

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

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

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

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

0
источник

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

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

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

0
источник

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

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

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

0
источник

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

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

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

0
источник

Моя проблема заключалась в том, что я использовал сначала оператор подготовки, а затем я использовал запрос 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

-1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос