Команды не синхронизированы; Вы не можете запустить эту команду сейчас - 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 ]

0 голосов
/ 25 марта 2019

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

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

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

0 голосов
/ 05 марта 2018

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

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

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

0 голосов
/ 16 августа 2016

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

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

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

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

0 голосов
/ 04 апреля 2015

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

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

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

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

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