Próbuję wykonać mój kod PHP, który wywołuje dwa zapytania MySQL za pośrednictwem mysqli i wyświetla komunikat o błędzie „Polecenia nie są zsynchronizowane; nie można teraz uruchomić tego polecenia”.
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 jestem pewien, co robić. Czytałem o wynikach w sklepie i wynikach bezpłatnych, jednak nie miały one znaczenia podczas ich używania. Nie jestem pewien, w którym dokładnie momencie ten błąd jest spowodowany, i chciałbym wiedzieć, dlaczego jest on powodowany i jak go naprawić.
Przechodząc przez moje instrukcje debugowania, pierwsza pętla if dla countQuery nie została nawet wprowadzona z powodu błędu w mojej składni sql blisko near '% ? %'
. Jeśli jednak po prostu wybiorę *
zamiast próbować ograniczyć na podstawie klauzuli LIKE, nadal otrzymuję błąd braku synchronizacji polecenia.
$stmt->store_result();
Myślę, że odpowiedź powinna uczynić to bardziej jasne.$select_stmt->close();
aby je podzielić (nie jednoczesne, ale proceduralneRozwiązałem ten problem w mojej aplikacji C - oto jak to zrobiłem:
Cytowanie z forów mysql:
Po uruchomieniu zapytania i zajęciu się wynikami [C API:
mysql_store_result()
] iteruję po wszelkich dalszych potencjalnie oczekujących wynikach, które pojawiają się poprzez wykonanie wielu instrukcji SQL, takich jak dwie lub więcej instrukcji select (z powrotem do tyłu bez zajmowania się wynikami).Faktem jest, że moje procedury nie zwracają wielu wyników, ale baza danych nie wie tego, dopóki nie wykonam: [C API:
mysql_next_result()
]. Robię to w pętli (na dokładkę), dopóki nie zwróci wartości niezerowej. Wtedy bieżący program obsługi połączenia wie, że można wykonać kolejne zapytanie (buforuję moje programy obsługi, aby zminimalizować narzut połączenia).Oto pętla, której używam:
for(; mysql_next_result(mysql_handler) == 0;) /* do nothing */;
Nie znam PHP, ale na pewno ma coś podobnego.
źródło
mysql
rozszerzeniu?Dzisiaj miałem ten sam problem, ale tylko podczas pracy z procedurą składowaną. To sprawia, że zapytanie zachowuje się jak złożone zapytanie, więc przed wykonaniem kolejnego zapytania należy „skonsumować” inne dostępne wyniki.
while($this->mysql->more_results()){ $this->mysql->next_result(); $this->mysql->use_result(); }
źródło
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()); }
źródło
Kiedyś użyłeś
stmt->execute();
Ci MOŻE zamknąć go użyć innego zapytania.
stmt->close();
Ten problem polował na mnie godzinami. Miejmy nadzieję, że to naprawi twoje.
źródło
$stmt1->execute(); $stmt2=$conn->prepare(...)
dałby ten błąd, ale$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
działałby dobrze.Używam CodeIgniter. Jeden serwer OK ... ten prawdopodobnie starszy ... W każdym razie używając
$this->db->reconnect();
Naprawione.
źródło
Problemem jest biblioteka C klienta MySQL, na której jest zbudowana większość interfejsów API MySQL. Problem polega na tym, że biblioteka C nie obsługuje jednoczesnego wykonywania zapytań, więc wszystkie interfejsy API zbudowane na niej również nie obsługują. Nawet jeśli używasz niebuforowanych zapytań. Jest to jeden z powodów, dla których napisano asynchroniczne API MySQL. Komunikuje się bezpośrednio z serwerem MySQL przy użyciu protokołu TCP i drutu protokołu nie obsługuje jednoczesnych zapytań.
Twoim rozwiązaniem jest albo zmodyfikowanie algorytmu, aby nie trzeba było mieć obu jednocześnie w toku, albo zmiana ich na zapytania buforowane, co jest prawdopodobnie jednym z pierwotnych powodów ich istnienia w bibliotece C (drugim jest zapewniają rodzaj kursora).
źródło
Aby rozwiązać ten problem, musisz zapisać dane wyników przed ich użyciem
to wszystko
źródło
Inna przyczyna: store_result () nie może zostać 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 mieć znaczenia dla oryginalnego przykładowego kodu, ale może być istotne dla osób poszukujących odpowiedzi na ten błąd).
źródło
Oto jaki był MÓJ PROBLEM !!!
Wiązanie parametrów było „dynamiczne”, więc miałem zmienną, która ustawia parametry danych, aby użyć bind_param . Więc ta zmienna była błędna, ale zamiast zgłaszać błąd, taki jak „nieprawidłowe dane parametrów”, wyświetla komunikat „niezsynchronizowany bla bla bla”, więc byłem zdezorientowany ...
źródło
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 ponownie go użyć?
Inną możliwością jest to, że wracasz w połowie czasu pobierania pętli. Nigdy nie kończysz tego zewnętrznego pobierania.
źródło
Sprawdź, czy poprawnie wpisujesz wszystkie parametry. Zgłasza ten sam błąd, jeśli liczba parametrów zdefiniowanych, a następnie przekazanych do funkcji jest inna.
źródło
Nie jest to związane z pierwotnym 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, zanim zrozumiałem problem, więc może być przydatny dla innych:
NIE używam mysqli, nadal używam mysql_connect. Miałem kilka prostych zapytań, ale JEDNE 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 rozpoznała wartości zwracanej przez mysql (php po prostu nie wiedział, co zrobić z formatem JSON, ponieważ wbudowany moduł mysql był zbyt stary (przynajmniej tak mi się wydaje))
na razie zmieniłem JSON-Field-Type na Text (na razie nie potrzebuję natywnej funkcjonalności mysql JSON) i wszystko działa dobrze
źródło
Jeśli używasz zbuforowanego lub niebuforowanego zestawu wyników do pobierania danych, 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ę na prawym końcu skryptu, aby rozwiązać problem
$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch
Odniesienie z dokumentacji PHP
źródło
Napotkałem ten błąd za pomocą Doctrine DBAL QueryBuilder.
Utworzyłem zapytanie za pomocą QueryBuilder, które używa podselekcji kolumn, również utworzonych za pomocą QueryBuilder. Podselekcje zostały utworzone tylko przez
$queryBuilder->getSQL()
i nie zostały wykonane. Wystąpił błąd podczas tworzenia drugiej podselekcji. Dzięki tymczasowemu wykonaniu każdej podselekcji$queryBuilder->execute()
przed użyciem$queryBuilder->getSQL()
wszystko działało. To tak, jakby połączenie$queryBuilder->connection
pozostawało w nieprawidłowym stanie do utworzenia nowego kodu SQL przed wykonaniem aktualnie przygotowanego kodu SQL, pomimo nowej instancji QueryBuilder na każdej podselekcji.Moim rozwiązaniem było napisanie podselekcji bez QueryBuilder.
źródło
Używam ODBC i ta poprawka działa dla mnie: ODBC -> zakładka Systemowe DSN -> kliknij dwukrotnie, aby skonfigurować moje źródło danych -> szczegóły -> zakładka Kursory -> Odznacz [Nie buforuj wyników kursorów tylko do przodu] - > kliknij OK
źródło
Często trafiam na ten błąd i zawsze, gdy uruchamiam procedurę składowaną, debuguję w phpmyadmin lub SQL Workbench (pracuję w php łącząc się z mysqli).
Błąd wynika z faktu, że debugowanie polega na wstawianiu instrukcji SELECT w strategicznych punktach kodu, aby poinformować mnie o stanie 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 niezsynchronizowane ”błąd podczas wywołania z php. Rozwiązaniem jest zawsze wykomentowanie lub usunięcie zaznaczeń debugowania, aby procedura miała tylko jeden zestaw wyników.
źródło
Tak dla odniesienia miałem ten problem z mieszaniem obu
multi_query
iwquery
tym samym kodzie:Które z tego, co przeczytałem, miały nieużywane wyniki, powodując w ten sposób wspomniany błąd.
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
miejscu wstawiają, więc nie interesowały mnie same wyniki.źródło
Mój problem polegał na tym, że najpierw korzystałem z instrukcji przygotowania, a następnie używałem zapytania mysqli na tej samej stronie i otrzymywałem błąd „Polecenia nie są zsynchronizowane; nie możesz teraz uruchomić tego polecenia”. Błąd pojawił się dopiero wtedy, gdy korzystałem z kodu, który miał przygotować instrukcję.
Zamknąłem pytanie. i zadziałało.
mysqli_stmt_close ($ stmt);
Mój kod
get_category.php (tutaj przy użyciu instrukcji przygotowania)
<?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 właśnie przyszło mi do głowy, ponownie dodaję zmienną połączenia za pośrednictwem globalnego połączenia $ ;. Myślę więc, że po zakończeniu instrukcji przygotowania za pomocą mysqli_stmt_close ($ stmt) uruchamia się cały nowy zestaw zapytań; a także dodaję te pliki i inne rzeczy przez include
źródło
To jest stare pytanie, ale żadna z opublikowanych odpowiedzi nie zadziałała w moim przypadku, odkryłem, że w moim przypadku miałem selekcje i aktualizacje w tabeli w mojej procedurze składowanej, ta sama tabela miała wyzwalacz aktualizacji, który był wyzwalany i sengowanie procedurę w nieskończoną pętlę. Po znalezieniu błędu błąd zniknął.
źródło
Utwórz dwa połączenia, używaj obu oddzielnie
$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS"); $conn = new mysqli("localhost", "Admin", "dilhdk", "SMS");
źródło