Polecenia nie są zsynchronizowane; nie możesz teraz uruchomić tego polecenia

Próbuję wykonać mój kod PHP, który wywołuje dwa zapytania MySQL za pośrednictwem mysqli i wyświetla błąd "Komendy out of sync; you can 't run this command now".

Oto kod, którego używam

<?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;
        }
    }
}
Próbowałem to przeczytać, ale nie wiem, co robić. Czytałem o store result I free result, jednak nie robiły one żadnej różnicy podczas ich używania. Nie jestem pewien, w którym dokładnie momencie ten błąd jest spowodowany i chciałbym wiedzieć, dlaczego jest być spowodowane i jak to naprawić.

Idąc za moimi instrukcjami debug, pierwsza pętla if dla countQuery nie jest nawet wprowadzana, z powodu błędu w mojej składni SQL w pobliżu '% ? %'. Jeśli jednak po prostu wybieram * zamiast próbować ograniczyć na podstawie klauzuli LIKE, nadal otrzymuję polecenie z błędu synchronizacji.

Author: Peter O., 2009-03-05

21 answers

Nie możesz mieć dwóch jednoczesnych zapytań, ponieważ mysqli domyślnie używa zapytań niebufferowanych(dla gotowych instrukcji; jest odwrotnie dla vanilla mysql_query). Możesz albo pobrać pierwszą do tablicy i zapętlić przez nią, albo powiedzieć mysqli, aby buforowała zapytania (za pomocą $stmt->store_result()).

Zobacz TUTAJ Po szczegóły.

 118
Author: HoLyVieR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-13 16:21:17

Rozwiązałem ten problem w mojej aplikacji C - oto jak to zrobiłem:

  1. Cytowanie z forów mysql:

    Ten błąd występuje, gdy zakończysz zapytanie ogranicznikiem średnika wewnątrz aplikacji . Chociaż podczas wykonywania zapytania z linii poleceń lub w przeglądarce zapytań wymagane jest zakończenie zapytania za pomocą średnika, usuń go z zapytania wewnątrz aplikacji.

  2. Po uruchomieniu mojego zapytanie i radzenie sobie z wynikami [C API: mysql_store_result()], iteruję kolejne potencjalnie oczekujące wyniki, które występują za pomocą wielu poleceń SQL, takich jak dwa lub więcej poleceń select (z powrotem do tyłu bez zajmowania się wynikami).

    Faktem jest, że moje procedury nie zwracają wielu wyników, ale baza danych o tym nie wie, dopóki nie wykonam: [C API: mysql_next_result()]. Robię to w pętli (na dobrą miarę), dopóki nie zwróci niezerowej. Wtedy bieżący moduł obsługi połączenia wie jest w porządku, aby wykonać inne zapytanie(buforuję moje procedury obsługi, aby zminimalizować koszty połączenia).

    To jest pętla, której używam:

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

Nie znam PHP, ale jestem pewien, że ma coś podobnego.

 35
Author: tracy.brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 19:02:04

Miałem dzisiaj ten sam problem, ale tylko podczas pracy z procedurą składowaną. To sprawia, że zapytanie zachowuje się jak wiele zapytań, więc musisz "zużywać" inne Dostępne wyniki przed wykonaniem innego zapytania.

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
 17
Author: stalin beltran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 22:47:12

Wywołuję tę funkcję za każdym razem przed użyciem $mysqli - >query Działa również z procedurami składowanymi.

function clearStoredResults(){
    global $mysqli;

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

}
 11
Author: Juergen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-12 15:17:24

Po użyciu

stmt->execute();

Możesz zamknąć go, aby użyć innego zapytania.

stmt->close();
Ten problem polował na mnie godzinami. Mam nadzieję, że to naprawi Twoje.
 7
Author: Carl James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-04 17:00:41

Używam CodeIgniter. Jeden serwer OK ... ten pewnie starszy ... Anyway using

$this->db->reconnect();

Naprawiłem to.

 3
Author: Norman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-13 07:45:51

Problemem jest biblioteka C klienta MySQL, na której zbudowana jest większość interfejsów API MySQL. Problem polega na tym, że biblioteka C nie obsługuje jednoczesnego wykonywania zapytań, więc wszystkie API zbudowane na tej podstawie również nie. Nawet jeśli używasz zapytań niebuforowanych. Jest to jeden z powodów, dla których asynchroniczne API MySQL zostało napisane. Komunikuje się bezpośrednio z serwerem MySQL za pomocą protokołu TCP, a wire-protocol Obsługuje jednoczesne zapytania.

Twoim rozwiązaniem jest albo zmodyfikowanie algorytmu więc nie musisz mieć obu w toku naraz, lub zmienić je, aby używać buforowanych zapytań, co jest prawdopodobnie jednym z oryginalnych powodów ich istnienia w bibliotece C (drugim jest dostarczenie pewnego rodzaju kursora).

 1
Author: staticsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-06 03:59:25

Aby rozwiązać ten problem, musisz zapisać dane wyniku przed użyciem

$numRecords->execute();

$numRecords->store_result();

To wszystko

 1
Author: Nader Ben Mabrouk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 14:57:01

Inna przyczyna: store_result() nie może być wywołana dwukrotnie.

Na przykład w poniższym kodzie drukowany jest błąd 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);

(może to nie być istotne dla oryginalnego przykładowego kodu, ale może być istotne dla osób szukających odpowiedzi na ten błąd.)

 1
Author: David G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-19 00:53:45

Oto, co było moim problemem!!!

Wiązanie param było "dynamiczne", więc miałem zmienną, która ustawia param danych w celu użycia bind_param. Więc ta zmienna była zła, ale zamiast rzucać błąd jak "złe dane param" to mówi "out of sync bla bla bla" więc byłem zdezorientowany...

 1
Author: Ari Waisberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-07 09:38:11

Myślę, że problem polega na tym, że tworzysz nowe połączenie w funkcji, a następnie nie zamykasz go na końcu. Dlaczego nie spróbujesz przekazać istniejącego połączenia i użyć go ponownie?

Inną możliwością jest to, że wracasz ze środka pętli while. Nigdy nie dokończysz tego zewnętrznego aportowania.

 0
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 13:25:42

Sprawdź, czy poprawnie wpisujesz wszystkie parametry. Wyświetla ten sam błąd, jeśli ilość parametrów zdefiniowanych i następnie przekazanych do funkcji jest inna.

 0
Author: Mixtelf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-04 16:11:33

Nie jest to związane z oryginalnym pytaniem, ale miałem ten sam komunikat o błędzie i ten wątek jest pierwszym hitem w Google i zajęło mi trochę czasu, aby dowiedzieć się, w czym był Problem, więc może być przydatny dla innych:

Nie używam mysqli, nadal używam mysql_connect miałem kilka prostych zapytań, ale jedno zapytanie spowodowało, że wszystkie inne zapytania zawiodły w tym samym połączeniu.

Używam mysql 5.7 i php 5.6 miałem tabelę z typem danych "JSON". oczywiście moja wersja php nie rozpoznaj wartość zwracaną z mysql (php po prostu nie wiedział, co zrobić z formatem JSON, ponieważ wbudowany Moduł mysql był zbyt stary (przynajmniej tak myślę))

Na razie zmieniłem JSON-field-Type Na Text (jak na razie nie potrzebuję natywnego mysql JSON-functionality) i wszystko działa dobrze

 0
Author: mech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 12:54:36

Napotkałem ten błąd używając Doctrine DBAL QueryBuilder.

Utworzyłem zapytanie za pomocą Querybuildera, które używa podelektów kolumn, również utworzonych za pomocą Querybuildera. Podelekty zostały utworzone tylko przez $queryBuilder->getSQL(), a nie wykonane. Błąd wystąpił podczas tworzenia drugiego zaznaczenia podrzędnego. Po tymczasowym wykonaniu każdego podzbioru za pomocą $queryBuilder->execute() przed użyciem $queryBuilder->getSQL(), wszystko działało. To tak, jakby połączenie $queryBuilder->connection pozostało w nieprawidłowym stanie do utworzenia nowego SQL przed wykonaniem bieżącego przygotowany SQL, pomimo nowej instancji QueryBuilder na każdym podwyzszeniu.

Moim rozwiązaniem było napisanie podelektów bez Querybuildera.

 0
Author: Fabian Picone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-25 15:41:56

Używam ODBC, i ta poprawka działa dla mnie: ODBC -> system tab DSN - > kliknij dwukrotnie, aby skonfigurować moje źródło danych - > szczegóły - > Kursory tab - > odznacz [nie buforuj wyników kursorów tylko do przodu]- > kliknij Ok

 0
Author: Teemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-07 02:08:12

Często pojawia się ten błąd i to zawsze, gdy uruchamiam procedurę składowaną, którą debuguję w phpmyadmin lub SQL Workbench (pracuję w PHP łącząc się z mysqli).

Błąd wynika z faktu, że debugowanie polega na wstawieniu w kodzie instrukcji SELECT w strategicznych punktach, aby podać mi stan zmiennych itp. Uruchamianie procedury składowanej, która generuje wiele zestawów wyników w tych środowiskach klienckich, jest w porządku, ale generuje " polecenia bez synchronizacji" błąd podczas wywoływania z php. Rozwiązaniem jest Zawsze komentowanie lub usuwanie wybranych opcji debugowania, aby procedura miała tylko jeden zestaw wyników.

 0
Author: Nikkorian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 01:37:34

W celach informacyjnych miałem ten problem mieszając oba multi_query i query w tym samym kodzie:

$connection->multi_query($query);
...
$connection->query($otherQuery);

Które z tego co przeczytałem nie przyniosły oczekiwanych rezultatów, co spowodowało we wspomnianym błędzie.

Rozwiązałem to za pomocą pętli pochłaniającej wszystkie wyniki multi_query:

$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);

W moim przypadku wszystkie zapytania w multi_query gdzie wstawia więc nie interesowały mnie same wyniki.

 0
Author: Isac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-23 17:59:27

Aby wyczyścić pamięć podręczną i uruchomić następny plik MYSQL fetch

Jeśli do pobierania danych używasz zestawu wyników Buffered lub Unbuffered, najpierw musisz po prostu wyczyścić pobrane dane z pamięci, po pobraniu wszystkich danych. Ponieważ nie możesz wykonać innej procedury MYSQL na tym samym połączeniu, dopóki nie wyczyścisz pobranej pamięci.

Dodaj poniższą funkcję po prawej stronie skryptu, aby rozwiązała problem

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

Bibliografia z dokumentacji PHP

 0
Author: Kaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-07 09:58:55

Mój problem polegał na tym, że najpierw używałem instrukcji prepare, a następnie używałem zapytania mysqli na tej samej stronie i otrzymywałem błąd "Komendy out of sync; you can 't run this command now". Błąd był tylko wtedy, gdy używałem kodu, który miał prepare oświadczenie.

To, co zrobiłem, to zamknięcie pytania. i zadziałało.

Mysqli_stmt_close ($stmt);

Mój kod

Get_category.php (tutaj używając instrukcji 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 (tutaj 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>

Coś, co przyszło mi do głowy, ponownie dodaję zmienną connection poprzez globalną $connection;. Więc myślę, że w zasadzie cały Nowy Zestaw Systemu zapytań jest uruchamiany po zakończeniu instrukcji prepare z mysqli_stmt_close ($stmt); a także dodaję te pliki i inne rzeczy poprzez include

 -1
Author: Mahad Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-04 15:43:59

Jest to stare pytanie, ale żadna z zamieszczonych odpowiedzi nie zadziałała w moim przypadku, odkryłem, że w moim przypadku miałem selects and updates na tabeli w mojej procedurze składowanej, ta sama tabela miała WYZWALACZ aktualizacji, który był wyzwalany i senging procedurę w nieskończonej pętli. Po znalezieniu błędu błąd zniknął.

 -1
Author: shelbypereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-08 04:25:19

Utwórz dwa połączenia, używaj obu oddzielnie

$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS");

$conn = new mysqli("localhost", "Admin", "dilhdk", "SMS"); 
 -3
Author: Janaka Bandara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-01 20:44:27