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

StackOverflow https://stackoverflow.com/questions/614671

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

<Ол>
  • Цитирование на форумах mysql:

      

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

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

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

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

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    
  • Я не знаю PHP, но уверен, что у него есть что-то похожее.

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

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

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

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

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

    $this->db->reconnect();
    

    Исправлено.

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

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

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

    $numRecords->execute();
    
    $numRecords->store_result();
    

    это все

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

    привязка параметра была " динамическая " поэтому у меня была переменная, которая устанавливает параметры данных для использования bind_param . Таким образом, эта переменная была неправильной, но вместо того, чтобы выдавать ошибку вроде & Quot; неправильный параметр data & Quot; там написано & "несинхронизировано бла бла бла &" поэтому я растерялся ...

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

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

    stmt->execute();
    

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

    stmt->close();
    

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

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

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

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

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

    я НЕ использую mysqli, все еще использую mysql_connect у меня было несколько простых запросов, но ОДИН запрос вызвал сбой всех других запросов в том же соединении.

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

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

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top