Saya mencoba menjalankan kode PHP saya, yang memanggil dua kueri MySQL melalui mysqli, dan mendapatkan pesan kesalahan "Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang".
Ini kode yang saya gunakan
<?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;
}
}
}
Saya telah mencoba membaca tentang ini, tetapi saya tidak yakin apa yang harus dilakukan. Saya telah membaca tentang hasil toko dan hasil gratis, namun tidak ada bedanya saat menggunakannya. Saya tidak yakin pada titik mana kesalahan ini terjadi, dan ingin tahu mengapa itu terjadi, dan bagaimana cara memperbaikinya.
Dengan pernyataan debug saya, loop if pertama untuk countQuery bahkan tidak dimasukkan, karena kesalahan dalam sintaks sql saya dekat dekat '% ? %'
. Namun jika saya hanya memilih *
alih-alih mencoba membatasi berdasarkan klausa LIKE, saya masih mendapatkan perintah dari kesalahan sinkronisasi.
$stmt->store_result();
Saya pikir tanggapan Anda harus membuatnya lebih jelas.$select_stmt->close();
untuk membaginya (tidak simultan tetapi proseduralSaya memecahkan masalah ini di aplikasi C saya - inilah cara saya melakukannya:
Mengutip dari forum mysql:
Setelah menjalankan kueri saya dan menangani hasil [C API:
mysql_store_result()
], saya mengulangi hasil yang berpotensi tertunda lebih lanjut yang terjadi melalui beberapa eksekusi pernyataan SQL seperti dua atau lebih pernyataan pilih (kembali ke belakang tanpa berurusan dengan hasil).Faktanya adalah bahwa prosedur saya tidak mengembalikan banyak hasil tetapi database tidak mengetahuinya sampai saya mengeksekusi: [C API:
mysql_next_result()
]. Saya melakukan ini dalam satu lingkaran (untuk ukuran yang baik) sampai mengembalikan bukan nol. Saat itulah penangan koneksi saat ini tahu tidak apa-apa untuk menjalankan kueri lain (saya menyimpan cache penangan saya untuk meminimalkan overhead koneksi).Ini adalah loop yang saya gunakan:
Saya tidak tahu PHP tapi saya yakin itu mirip.
sumber
mysql
ekstensi lama ?Saya memiliki masalah yang sama hari ini, tetapi hanya ketika bekerja dengan prosedur tersimpan. Ini membuat kueri berperilaku seperti kueri multi, jadi Anda perlu "menggunakan" hasil lain yang tersedia sebelum membuat kueri lain.
sumber
Saya memanggil fungsi ini setiap kali sebelum menggunakan $ mysqli-> query Bekerja dengan prosedur yang tersimpan juga.
sumber
Setelah Anda menggunakan
Anda MUNGKIN menutupnya untuk menggunakan kueri lain.
Masalah ini memburuku selama berjam-jam. Mudah-mudahan, ini akan memperbaiki milik Anda.
sumber
$stmt1->execute(); $stmt2=$conn->prepare(...)
akan memberikan kesalahan ini, tetapi$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
akan berfungsi dengan baik.Saya menggunakan CodeIgniter. Satu server Oke ... yang ini mungkin lebih tua ... Pokoknya menggunakan
Diperbaiki.
sumber
Masalahnya adalah pustaka C klien MySQL, tempat sebagian besar API MySQL dibuat. Masalahnya adalah pustaka C tidak mendukung eksekusi kueri secara bersamaan, jadi semua API yang dibangun di atasnya juga tidak. Bahkan jika Anda menggunakan kueri tanpa buffer. Inilah salah satu alasan mengapa API MySQL asinkron ditulis. Ini berkomunikasi langsung dengan server MySQL menggunakan TCP dan protokol kabel melakukannya mendukung query simultan.
Solusi Anda adalah dengan memodifikasi algoritme sehingga Anda tidak perlu keduanya dalam proses sekaligus, atau mengubahnya untuk menggunakan kueri yang di-buffer, yang mungkin merupakan salah satu alasan asli keberadaannya di pustaka C (yang lainnya adalah untuk sediakan semacam kursor).
sumber
untuk mengatasi masalah ini Anda harus menyimpan data hasil sebelum menggunakannya
itu saja
sumber
Penyebab lain: store_result () tidak dapat dipanggil dua kali.
Misalnya, dalam kode berikut, Kesalahan 5 dicetak.
(Ini mungkin tidak relevan dengan kode sampel asli, tetapi dapat relevan untuk orang yang mencari jawaban atas kesalahan ini.)
sumber
Inilah MASALAH SAYA !!!
Pengikatan param adalah "dinamis" jadi saya memiliki variabel yang menetapkan parameter data untuk menggunakan bind_param . Jadi variabel itu salah tapi bukannya menampilkan kesalahan seperti "data param salah" justru mengatakan "tidak sinkron bla bla bla" jadi saya bingung ...
sumber
Saya pikir masalahnya adalah Anda membuat koneksi baru dalam fungsi tersebut, dan kemudian tidak menutupnya di akhir. Mengapa Anda tidak mencoba meneruskan koneksi yang ada dan menggunakannya kembali?
Kemungkinan lainnya adalah Anda kembali keluar dari tengah pengambilan loop sementara. Anda tidak pernah menyelesaikan pengambilan luar itu.
sumber
Periksa untuk melihat apakah Anda mengetik semua parameter dengan benar. Ini melempar kesalahan yang sama jika jumlah parameter yang ditentukan dan kemudian diteruskan ke fungsi berbeda.
sumber
Ini tidak terkait dengan pertanyaan awal, tetapi saya memiliki pesan kesalahan yang sama dan utas ini adalah hit pertama di Google dan saya butuh beberapa saat untuk mencari tahu apa Masalahnya, jadi mungkin berguna untuk orang lain:
Saya TIDAK menggunakan mysqli, masih menggunakan mysql_connect saya punya beberapa pertanyaan sederhana, tetapi SATU kueri menyebabkan semua pertanyaan lain gagal dalam Koneksi yang sama.
Saya menggunakan mysql 5.7 dan php 5.6 saya memiliki tabel dengan tipe data "JSON". jelas, versi-php saya tidak mengenali nilai kembalian dari mysql (php hanya tidak tahu apa yang harus dilakukan dengan JSON-Format karena modul mysql bawaan terlalu tua (setidaknya menurut saya))
untuk saat ini saya mengubah JSON-Field-Type menjadi Text (seperti untuk saat ini saya tidak memerlukan fungsionalitas JSON mysql asli) dan semuanya berfungsi dengan baik
sumber
Jika Anda menggunakan kumpulan hasil Buffered atau Unbuffered untuk mengambil data, pertama-tama Anda harus menghapus data yang diambil dari memori, setelah Anda mengambil semua data . Karena Anda tidak dapat menjalankan prosedur MYSQL lain pada koneksi yang sama sampai Anda menghapus memori yang diambil. Tambahkan fungsi di bawah ini di ujung kanan skrip Anda, sehingga ini akan menyelesaikan masalah
Referensi dari dokumentasi PHP
sumber
Saya mengalami kesalahan ini menggunakan Doctrine DBAL QueryBuilder.
Saya membuat kueri dengan QueryBuilder yang menggunakan subpilihan kolom, juga dibuat dengan QueryBuilder. Subpilihan hanya dibuat melalui
$queryBuilder->getSQL()
dan tidak dijalankan. Terjadi kesalahan saat membuat subpilihan kedua. Dengan menjalankan sementara setiap subselect$queryBuilder->execute()
sebelum menggunakan$queryBuilder->getSQL()
, semuanya bekerja. Seolah-olah koneksi$queryBuilder->connection
tetap dalam keadaan tidak valid untuk membuat SQL baru sebelum menjalankan SQL yang saat ini disiapkan, meskipun ada instance QueryBuilder baru di setiap subpilihan.Solusi saya adalah menulis subpilihan tanpa QueryBuilder.
sumber
Saya menggunakan ODBC, dan perbaikan ini berfungsi untuk saya: ODBC -> tab System DSN -> klik dua kali untuk mengkonfigurasi sumber data saya -> detail -> tab Cursor -> Hapus centang [Jangan cache hasil dari kursor forward-only] - > klik Ok
sumber
Saya sering mengalami kesalahan ini dan selalu ketika saya menjalankan prosedur tersimpan yang saya telah debugging di phpmyadmin atau SQL Workbench (Saya bekerja di php menghubungkan dengan mysqli).
Hasil kesalahan dari fakta bahwa debugging melibatkan penyisipan pernyataan SELECT pada titik-titik strategis dalam kode untuk memberi tahu saya status variabel, dll. Menjalankan prosedur tersimpan yang menghasilkan beberapa kumpulan hasil dalam lingkungan klien ini baik-baik saja, tetapi menghasilkan " Perintah tidak sinkron "kesalahan saat dipanggil dari php. Solusinya adalah selalu memberikan komentar atau menghapus pilihan debugging sehingga prosedur hanya memiliki satu rangkaian hasil.
sumber
Masalah saya adalah bahwa saya menggunakan pernyataan persiapkan pertama dan kemudian saya menggunakan kueri mysqli pada halaman yang sama dan mendapatkan kesalahan "Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang". Kesalahan itu baru terjadi ketika saya menggunakan kode yang telah menyiapkan pernyataan.
Yang saya lakukan adalah menutup pertanyaan itu. dan itu berhasil.
mysqli_stmt_close ($ stmt);
Kode saya
get_category.php (di sini menggunakan pernyataan persiapan)
admin_get_category_body.php (di sini mysqli)
Sesuatu yang baru saja terlintas di benak saya, saya juga menambahkan variabel koneksi melalui global $ connection ;. Jadi saya pikir pada dasarnya satu set sistem kueri baru sedang dimulai setelah mengakhiri pernyataan persiapkan dengan mysqli_stmt_close ($ stmt); dan juga saya menambahkan file ini dan hal lainnya melalui penyertaan
sumber
Ini adalah pertanyaan lama, tetapi tidak ada jawaban yang diposting berfungsi dalam kasus saya, saya menemukan bahwa dalam kasus saya, saya telah memilih dan memperbarui pada tabel dalam prosedur saya yang tersimpan, tabel yang sama memiliki pemicu pembaruan yang dipicu dan memicu prosedur menjadi loop tak terbatas. Setelah bug ditemukan, kesalahan tersebut hilang.
sumber
Buat dua koneksi, gunakan keduanya secara terpisah
sumber