Команды не синхронизированы; Вы не можете запустить эту команду сейчас
Я пытаюсь выполнить мой 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, я все еще получаю команду из-за ошибки синхронизации.
24 ответа
У вас не может быть двух одновременных запросов, потому что 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, но я уверен, что у него есть что-то подобное.
Я вызываю эту функцию каждый раз перед использованием $mysqli->query Работает также с хранимыми процедурами.
function clearStoredResults(){
global $mysqli;
do {
if ($res = $mysqli->store_result()) {
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
У меня сегодня была такая же проблема, но только при работе с хранимой процедурой. Это приводит к тому, что запрос ведет себя как мультизапрос, поэтому вам нужно "использовать" другие доступные результаты, прежде чем делать другой запрос.
while($this->mysql->more_results()){
$this->mysql->next_result();
$this->mysql->use_result();
}
После того, как вы использовали
stmt->execute();
Вы должны закрыть его, чтобы использовать другой запрос.
stmt->close();
Эта проблема преследовала меня часами. Надеюсь, это исправит ваше.
Чтобы решить эту проблему, вы должны сохранить данные результатов, прежде чем использовать его
$numRecords->execute();
$numRecords->store_result();
это все
Я использую CodeIgniter. Один сервер в порядке... этот, вероятно, старше... Во всяком случае, используя
$this->db->reconnect();
Починил это.
Для тех, что предыдущие ответы не помогли... вот что было МОЕЙ ПРОБЛЕМОЙ!!!
привязка параметров была "динамической", поэтому у меня была переменная, которая устанавливает параметры данных для использования bind_param. Так что эта переменная была неправильной, но вместо того, чтобы выдавать ошибку типа "неверные данные параметров", она говорит "несинхронизировано, бла-бла-бла", так что я был сбит с толку...
Я надеюсь, что это помогло кому-то!
Просто для справки у меня возникла проблема с смешиванием обоих
multi_query
и
query
в том же коде:
$connection->multi_query($query);
...
$connection->query($otherQuery);
Который для того, что я читал, имел ожидающие неизрасходованные результаты, поэтому вызывало указанную ошибку.
Я решил это с помощью цикла, потребляющего все результаты
multi_query
:
$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);
В моем случае все запросы в
multi_query
где вставки, так что меня не интересовали сами результаты.
Другая причина: store_result() нельзя вызвать дважды.
Например, в следующем коде печатается ошибка 5.
<?php
$db = new mysqli("localhost", "something", "something", "something");
$stmt = $db->stmt_init();
if ($stmt->error) printf("Error 1 : %s\n", $stmt->error);
$stmt->prepare("select 1");
if ($stmt->error) printf("Error 2 : %s\n", $stmt->error);
$stmt->execute();
if ($stmt->error) printf("Error 3 : %s\n", $stmt->error);
$stmt->store_result();
if ($stmt->error) printf("Error 4 : %s\n", $stmt->error);
$stmt->store_result();
if ($stmt->error) printf("Error 5 : %s\n", $stmt->error);
(Это может не иметь отношения к исходному образцу кода, но может иметь отношение к людям, ищущим ответы на эту ошибку.)
Проблема в клиентской C-библиотеке MySQL, на которой построено большинство MySQL API. Проблема в том, что библиотека C не поддерживает одновременное выполнение запросов, поэтому все API, созданные поверх этого, также не поддерживают. Даже если вы используете небуферизованные запросы. Это одна из причин, почему был написан асинхронный MySQL API. Он напрямую связывается с сервером MySQL по протоколу TCP, а проводной протокол поддерживает одновременные запросы.
Ваше решение состоит в том, чтобы либо изменить алгоритм, чтобы вам не нужно было одновременно выполнять оба процесса, либо изменить их, чтобы использовать буферизованные запросы, что, вероятно, является одной из первоначальных причин их существования в библиотеке C (другой заключается в предоставить вид курсора).
Я поместил эту строку кода после того, как закончил собирать результаты первого запроса. Работал на меня
mysqli_next_result($connection);
Я часто сталкиваюсь с этой ошибкой, и это всегда, когда я запускаю хранимую процедуру, которую я отлаживал в phpmyadmin или SQL Workbench (я работаю в php, соединяясь с mysqli).
Ошибка возникает из-за того, что отладка включает в себя вставку операторов SELECT в стратегические точки кода, чтобы сообщить мне состояние переменных и т. Д. Запуск хранимой процедуры, которая выдает несколько наборов результатов в этих клиентских средах, нормально, но она дает " Ошибка "рассинхронизация команд" при вызове из php. Решение всегда состоит в том, чтобы закомментировать или удалить отладочные выборки, чтобы процедура имела только один набор результатов.
Проверьте, правильно ли вы вводите все параметры. Выдает ту же ошибку, если количество параметров, определенных, а затем переданных функции, отличается.
Я столкнулся с этой ошибкой, используя Doctrine DBAL QueryBuilder.
Я создал запрос с помощью QueryBuilder, который использует подвыборы столбцов, также созданные с помощью QueryBuilder. Подвыборы были созданы только через $queryBuilder->getSQL()
и не выполнено. Произошла ошибка при создании второго подвыбора. Предварительно выполняя каждый подпункт с $queryBuilder->execute()
Перед использованием $queryBuilder->getSQL()
все работало. Это как если бы соединение $queryBuilder->connection
остается в недопустимом состоянии для создания нового SQL перед выполнением подготовленного в настоящий момент SQL, несмотря на новый экземпляр QueryBuilder в каждом подвыборе.
Мое решение состояло в том, чтобы написать подвыборы без QueryBuilder.
Если для выборки данных вы используете либо Buffered, либо Unbuffered набор результатов, сначала вы должны просто очистить извлеченные данные из памяти, как только вы извлечете все данные. Поскольку вы не можете выполнить другую процедуру MYSQL для того же соединения, пока не очистите извлеченную память. Добавьте эту функцию ниже правого конца вашего скрипта, чтобы она решала проблему
$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch
Я использую ODBC, и это исправление у меня работает: ODBC -> вкладка Системный DSN -> дважды щелкните, чтобы настроить мой источник данных -> подробности -> вкладка Курсоры -> снимите флажок [Не кэшировать результаты курсоров только вперед] -> нажмите ОК
Я думаю, проблема в том, что вы устанавливаете новое соединение в функции, а затем не закрываете его в конце. Почему бы вам не попробовать передать существующее соединение и использовать его повторно?
Другая возможность заключается в том, что вы возвращаетесь из цикла извлечения цикла. Вы никогда не завершите эту внешнюю выборку.
Это не связано с исходным вопросом, но у меня было то же сообщение об ошибке, и эта тема является первым попаданием в Google, и мне потребовалось некоторое время, чтобы выяснить, в чем проблема, поэтому она может быть полезна для других:
я не использую mysqli, все еще использую mysql_connect, у меня было несколько простых запросов, но ОДИН запрос вызвал сбой всех других запросов в том же Соединении.
Я использую MySQL 5.7 и PHP 5.6 У меня была таблица с типом данных "JSON". очевидно, моя php-версия не распознала возвращаемое значение из mysql (php просто не знал, что делать с JSON-форматом, потому что встроенный mysql-модуль был слишком стар (по крайней мере, я так думаю))
на данный момент я изменил JSON-Field-Type на Text (сейчас мне не нужна нативная mysql-JSON-функциональность) и все работает нормально
Это старый вопрос, но ни один из опубликованных ответов в моем случае не сработал, я обнаружил, что в моем случае у меня были выборки и обновления в таблице в моей хранимой процедуре, в той же таблице был триггер обновления, который запускался и отправлял процедура в бесконечный цикл. Как только ошибка была обнаружена, ошибка исчезла.
<?php
$getData = $db->query("CALL `pet_sitter_list`()");
while ($row = mysqli_fetch_object($getData)): ?>
your data fetching ...
<?php endwhile;
$getData->close();
$db->next_result();
?>
таким образом вы можете без проблем вызвать другой запрос.
Окончательное решение этой ошибки следующее:
1) Вы должны скопировать и вставить этот код над следующим запросом к хранимой процедуре.
do if($result=mysqli_store_result($myconnection)){ mysqli_free_result($result); } while(mysqli_more_results($myconnection) && mysqli_next_result($myconnection));
Моя проблема заключалась в том, что я использовал сначала оператор подготовки, а затем я использовал запрос 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
Создайте два соединения, используйте оба по отдельности
$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS");
$conn = new mysqli("localhost", "Admin", "dilhdk", "SMS");