Rumah >pembangunan bahagian belakang >tutorial php >Mengapa Saya Mendapat Ralat 'Arahan Tidak Segerak' dalam PHP dengan Pertanyaan MySQL?

Mengapa Saya Mendapat Ralat 'Arahan Tidak Segerak' dalam PHP dengan Pertanyaan MySQL?

Susan Sarandon
Susan Sarandonasal
2024-12-19 21:28:16182semak imbas

Why Do I Get a

Ralat "Commands Out of Sync" dalam Kod PHP dengan Pertanyaan MySQL

Apabila melaksanakan skrip PHP yang melibatkan berbilang pertanyaan MySQL menggunakan mysqli, ralat boleh berlaku: "Arahan tidak segerak; anda tidak boleh menjalankan arahan ini sekarang." Isu ini timbul apabila pertanyaan berikutnya dicuba sebelum mengambil dan memproses keputusan daripada pertanyaan sebelumnya atau mengosongkan cache pelayan MySQL bagi arahan pertanyaan.

Kod yang disediakan dalam soalan melaksanakan dua pertanyaan: satu untuk mengira rekod dan satu lagi untuk mendapatkan semula baris berdasarkan rentetan carian. Walau bagaimanapun, sebelum keputusan pertanyaan pertama diambil, pertanyaan kedua dilaksanakan. Ini mencetuskan ralat "tidak segerak".

Punca Ralat

  • Pertanyaan Tidak Buffer: MySQLI menggunakan pertanyaan tidak buffer secara lalai untuk penyataan yang disediakan, bermakna hasil distrim mengikut bahagian yang tersedia. Jika pertanyaan seterusnya dicuba sebelum menimbal hasil pertanyaan pertama, arahan boleh menjadi tidak segerak dan membawa kepada ralat.
  • Pelaksanaan Pertanyaan Tidak Lengkap: Apabila berbilang pertanyaan dicuba tanpa mengendalikan dengan betul keputusan, arahan yang tidak lengkap boleh terkumpul dalam cache pelayan. Ini boleh mengganggu pertanyaan seterusnya dan menyebabkan ralat.

Penyelesaian Kemungkinan

  • Hasil Penampan: Untuk mengelakkan ralat ini, gunakan $stmt->store_result() untuk menimbal hasil pertanyaan sebelum melaksanakan yang seterusnya satu. Ambil hasil penimbal menggunakan $stmt->fetch() dan kemudian kosongkan cache pelayan dengan $stmt->free_result().
  • Ambil Hasil Pertanyaan Pertama: Sebagai alternatif, ambil semua hasil daripada pertanyaan pertama ke dalam tatasusunan. Ini menggunakan keputusan dan membenarkan pertanyaan seterusnya dilaksanakan tanpa gangguan daripada hasil yang tidak diambil.
  • Gunakan Transaksi: Jika berbilang pertanyaan berkaitan dan mesti dilaksanakan secara berurutan, pertimbangkan untuk menggunakan transaksi untuk mengendalikan proses sebagai atom tunggal unit.

Contoh

Berikut ialah contoh penimbal hasil pertanyaan pertama menggunakan $stmt->store_result():

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
$con->query("SET NAMES 'utf8'");
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $numRecords->store_result(); // Buffer the results
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
}

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Arahan Tidak Segerak' dalam PHP dengan Pertanyaan MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn