คำสั่งไม่ตรงกัน คุณไม่สามารถเรียกใช้คำสั่งนี้ได้ในขณะนี้


97

ฉันกำลังพยายามรันโค้ด PHP ของฉันซึ่งเรียกการสืบค้น MySQL สองรายการผ่าน mysqli และได้รับข้อผิดพลาด "Commands out of sync; you can't run this command now"

นี่คือรหัสที่ฉันใช้

<?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;
        }
    }
}

ฉันได้ลองอ่านเนื้อหานี้แล้ว แต่ไม่แน่ใจว่าควรทำอย่างไร ฉันได้อ่านเกี่ยวกับผลการจัดเก็บและผลลัพธ์ฟรี แต่สิ่งเหล่านี้ไม่ได้สร้างความแตกต่างเมื่อใช้งาน ฉันไม่แน่ใจว่าข้อผิดพลาดนี้เกิดจากจุดใดและต้องการทราบสาเหตุที่แท้จริงและจะแก้ไขได้อย่างไร

ไปตามงบแก้ปัญหาของผมก่อนถ้าห่วงสำหรับ countQuery ไม่ได้แม้จะถูกป้อนเนื่องจากข้อผิดพลาดในไวยากรณ์ SQL '% ? %'ของฉันที่อยู่ใกล้กับที่อยู่ใกล้กับ อย่างไรก็ตามถ้าฉันแค่เลือก*แทนที่จะพยายาม จำกัด ตามประโยค LIKE ฉันยังคงได้รับคำสั่งจากข้อผิดพลาดในการซิงค์

คำตอบ:


115

คุณไม่สามารถมีคำค้นหาพร้อมกันสองรายการได้เนื่องจาก mysqli ใช้การสืบค้นที่ไม่มีบัฟเฟอร์โดยค่าเริ่มต้น (สำหรับคำสั่งที่เตรียมไว้มันตรงกันข้ามกับวานิลลาmysql_query) คุณสามารถดึงอันแรกลงในอาร์เรย์และวนซ้ำหรือบอก mysqli ให้บัฟเฟอร์แบบสอบถาม (โดยใช้$stmt->store_result())

ดูรายละเอียดได้ที่นี่


3
ฉันยอมรับ mysqli ได้รับความเสียหายจากสมองเล็กน้อย มันไม่ทำในสิ่งที่ถูกต้องกับไดรเวอร์ PDO MySQL แม้ว่า

17
คุณสามารถมีคำค้นหาพร้อมกันสองรายการ - คุณต้องเรียกใช้$stmt->store_result();ฉันคิดว่าคำตอบของคุณควรทำให้ชัดเจนยิ่งขึ้น
เงา

3
ฉันใช้เวลานานในการค้นหาข้อมูลนี้ - ไม่มีที่ไหนที่จะแสดงได้อย่างง่ายดาย ขอบคุณ. ฉันแค่แยกคำถามของฉัน$select_stmt->close();เพื่อแยกคำถาม ออก (ไม่ใช่พร้อมกัน แต่เป็นขั้นตอน
n34_panda

@flussence คุณระบุว่า "mysqli ใช้ข้อความค้นหาที่ไม่มีการบัฟเฟอร์โดยค่าเริ่มต้น" แล้วเราจะตั้งค่าให้เป็นอย่างอื่นได้อย่างไร?
Pacerier

1
ฉันรู้ว่ามันดูแปลก ๆ แต่ฉันพบข้อผิดพลาดนี้ในขณะที่ดำเนินการค้นหาโดย mysqli_query ละเมิดคีย์ต่างประเทศ ... ดังนั้นหากสิ่งนี้เกิดขึ้นกับใครก็ตามให้ตรวจสอบอีกครั้งว่าข้อความค้นหา INSERT ของคุณไม่ได้ละเมิดคีย์ต่างประเทศใด ๆ
lucaferrario

35

ฉันแก้ไขปัญหานี้ในแอปพลิเคชัน C ของฉัน - นี่คือวิธีที่ฉันทำ:

  1. อ้างจากฟอรัม mysql:

    ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณ ยุติการค้นหาของคุณมีตัวคั่นอัฒภาคภายในโปรแกรม ในขณะที่จำเป็นต้องยุติการสืบค้นด้วยตัวคั่นอัฒภาคเมื่อเรียกใช้จากบรรทัดคำสั่งหรือในเบราว์เซอร์แบบสอบถามให้ลบตัวคั่นออกจากแบบสอบถามภายในแอปพลิเคชันของคุณ

  2. หลังจากเรียกใช้แบบสอบถามของฉันและจัดการกับผลลัพธ์ [C API: mysql_store_result()] ฉันจะวนซ้ำผลลัพธ์ที่อาจรอดำเนินการเพิ่มเติมใด ๆ ที่เกิดขึ้นผ่านการดำเนินการคำสั่ง SQL หลายคำสั่งเช่นคำสั่ง select สองคำสั่งขึ้นไป (กลับไปข้างหลังโดยไม่ต้องจัดการกับผลลัพธ์)

    ความจริงก็คือขั้นตอนของฉันไม่ส่งคืนผลลัพธ์หลายรายการ แต่ฐานข้อมูลไม่ทราบจนกว่าฉันจะดำเนินการ: [C API: mysql_next_result() ] ฉันทำสิ่งนี้แบบวนซ้ำ (เพื่อการวัดที่ดี) จนกว่าผลตอบแทนจะไม่เป็นศูนย์ นั่นคือเมื่อตัวจัดการการเชื่อมต่อปัจจุบันรู้ว่าสามารถดำเนินการสืบค้นอื่นได้ (ฉันแคชตัวจัดการของฉันเพื่อลดค่าใช้จ่ายในการเชื่อมต่อ)

    นี่คือลูปที่ฉันใช้:

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

ฉันไม่รู้จัก PHP แต่ฉันแน่ใจว่ามันมีอะไรที่คล้ายกัน


13
นี่คือสำหรับฉัน ใน PHP ฉันเพิ่งเพิ่ม: while (mysqli_next_result ($ con));
Josh

ขอบคุณสำหรับคำตอบที่ช่วยแก้ปัญหาของฉัน ฉันลบตัวคั่นและใช้งานได้ ฉันไม่ได้ว่าง (ดึงข้อมูล) หรือเก็บผลลัพธ์ของฉัน แต่ให้ปิดเคอร์เซอร์และสร้างใหม่เมื่อฉันเสร็จสิ้นหนึ่งคำสั่งของแบบสอบถาม
Chen Xie

@ Josh วิธีการทำในmysqlส่วนขยายเดิม?
Pacerier

1
การลบอัฒภาคในตอนท้ายของแบบสอบถามแก้ไขปัญหา "Commands out of sync; you can't run this command now" เมื่อใช้ Python MySQLdb
Genome

17

วันนี้ฉันมีปัญหาเดียวกัน แต่เมื่อทำงานกับกระบวนงานที่เก็บไว้เท่านั้น สิ่งนี้ทำให้คำค้นหาทำงานเหมือนแบบสอบถามหลายรายการดังนั้นคุณต้อง "ใช้" ผลลัพธ์อื่น ๆ ที่มีอยู่ก่อนที่จะสร้างข้อความค้นหาอื่น

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}

นี่เป็นจุดสำคัญ: กระบวนงานที่เก็บไว้จะส่งคืนชุดผลลัพธ์เหนือและเหนือผลลัพธ์ใด ๆ ที่ตั้งรหัสใน SP อาจสร้างขึ้น คุณต้องจัดการหรือรับข้อผิดพลาดนี้: stackoverflow.com/a/2315229/4495850
Richard

11

ฉันเรียกใช้ฟังก์ชันนี้ทุกครั้งก่อนที่จะใช้ $ mysqli-> query ทำงานร่วมกับโพรซีเดอร์ที่เก็บไว้เช่นกัน

function clearStoredResults(){
    global $mysqli;

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

}

6

เมื่อคุณใช้

stmt->execute();

คุณอาจปิดมันเพื่อใช้แบบสอบถามอื่น

stmt->close();

ปัญหานี้ตามล่าฉันมาหลายชั่วโมง หวังว่ามันจะแก้ไขปัญหาของคุณได้


2
การปิดงบไม่จำเป็น ตามที่ @stalinbeltran ได้ตอบไว้ข้างต้นเราจำเป็นต้อง "บริโภค" ผลลัพธ์ของคำสั่งก่อนที่จะเตรียมคำสั่งอื่น ดังนั้น$stmt1->execute(); $stmt2=$conn->prepare(...)จะให้ข้อผิดพลาดนี้ แต่$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)ก็ใช้ได้ดี
Jay Dadhania

พี่ช่วยฉันด้วยขอบคุณ f ทุกคนที่พูดสิ่งนี้และสิ่งนั้นฉันใช้ mysqli_prepare สองครั้งก่อนที่จะปิดอันแรก มันได้ผล.
Abhinash Majhi

3

ฉันใช้ CodeIgniter หนึ่งเซิร์ฟเวอร์ตกลง ... อันนี้อาจเก่ากว่า ...

$this->db->reconnect();

ซ่อมมัน.


7
วิธีนี้ช่วยแก้ปัญหาได้อย่างไร
Jeremy J Starcher

4
@ Norman นี่ไม่ได้ "แก้ไข" ปัญหา เป็นเพียงการหลีกเลี่ยงโดยการทิ้งการเชื่อมต่อทั้งหมดและเชื่อมต่อใหม่อีกครั้ง สิ่งนี้ไม่สมเหตุสมผลเลยจากมุมมองด้านประสิทธิภาพ
Pacerier

1

ปัญหาคือไลบรารี C ไคลเอนต์ MySQL ซึ่ง MySQL API ส่วนใหญ่สร้างขึ้น ปัญหาคือไลบรารี C ไม่รองรับการดำเนินการสืบค้นพร้อมกันดังนั้น API ทั้งหมดที่สร้างขึ้นจากนั้นจึงไม่รองรับเช่นกัน แม้ว่าคุณจะใช้การสืบค้นที่ไม่มีบัฟเฟอร์ก็ตาม นี่เป็นสาเหตุหนึ่งที่เขียน MySQL API แบบอะซิงโครนัส จะติดต่อสื่อสารโดยตรงกับเซิร์ฟเวอร์ MySQL โดยใช้ TCP และลวดโปรโตคอลไม่สนับสนุนคำสั่งพร้อมกัน

วิธีแก้ปัญหาของคุณคือการแก้ไขอัลกอริทึมเพื่อให้คุณไม่จำเป็นต้องดำเนินการทั้งสองอย่างพร้อมกันหรือเปลี่ยนเป็นการใช้คิวรีบัฟเฟอร์ซึ่งอาจเป็นหนึ่งในเหตุผลดั้งเดิมที่มีอยู่ในไลบรารี C (อีกประการหนึ่งคือการ ให้เคอร์เซอร์ชนิดหนึ่ง)


1
ฉันไม่จำเป็นต้องดำเนินการทั้งสองอย่างพร้อมกันฉันมีความสุขที่ countQuery จะเสร็จสมบูรณ์ก่อนการสืบค้นที่สองของฉัน แต่ฉันไม่แน่ใจว่าจะหยุด countQuery ไม่ให้อยู่ใน proggress ได้อย่างไร

คุณไม่ได้ดึงข้อมูลใด ๆ จาก countQuery นั่นคือสาเหตุที่ยังคง 'อยู่ระหว่างดำเนินการ' ดึงข้อมูลแถวทั้งหมดหรือเปลี่ยนเป็น SELECT COUNT (ARTICLE_NO) และรับแถวนั้น จากนั้นข้อความค้นหาที่สองของคุณจะทำงาน
staticsan

เมื่อคุณพูดว่า "MySQL API แบบอะซิงโครนัส" คุณหมายถึง API ใด นอกจากนี้ฉันยังไม่ได้ข้อสรุปของคุณ "ปัญหา" นี้สามารถแก้ไขได้โดยไม่จำเป็นต้องให้ API เป็นแบบอะซิงโครนัส
Pacerier

1
พูดตามตรง @Pacerier ฉันไม่แน่ใจอีกต่อไปแล้วว่าฉันหมายถึงอะไรเช่นกัน! มีหลายสิ่งเกิดขึ้นในหกปีในการเชื่อมต่อ MySQL ดังนั้นสิ่งที่ฉันคิดว่าฉันอ้างถึงอาจถูกเปลี่ยนชื่อและ / หรือรวมอยู่ในไดรเวอร์ใหม่อื่น ๆ
สถิติ

1

ในการแก้ปัญหานี้คุณต้องจัดเก็บข้อมูลผลลัพธ์ก่อนใช้งาน

$numRecords->execute();

$numRecords->store_result();

นั่นคือทั้งหมด


1

อีกสาเหตุ: store_result () ไม่สามารถเรียกสองครั้ง

ตัวอย่างเช่นในรหัสต่อไปนี้ Error 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);

(อาจไม่เกี่ยวข้องกับโค้ดตัวอย่างดั้งเดิม แต่อาจเกี่ยวข้องกับผู้ที่กำลังค้นหาคำตอบสำหรับข้อผิดพลาดนี้)


1

นี่คือปัญหาของฉัน !!!

พระรามผูกพันเป็น "พลัง" ดังนั้นผมจึงมีตัวแปรที่ชุดพารามิเตอร์ของข้อมูลเพื่อใช้bind_param ดังนั้นตัวแปรนั้นผิด แต่แทนที่จะโยน error เช่น "ข้อมูล param ผิด" มันขึ้นว่า "out of sync bla bla bla" ก็เลยงง ...


0

ฉันคิดว่าปัญหาคือคุณกำลังทำการเชื่อมต่อใหม่ในฟังก์ชันจากนั้นไม่ได้ปิดมันในตอนท้าย ทำไมคุณไม่ลองส่งผ่านการเชื่อมต่อที่มีอยู่แล้วกลับมาใช้ใหม่ล่ะ?

ความเป็นไปได้อีกประการหนึ่งคือคุณกำลังกลับมาจากการดึงข้อมูลในขณะที่กำลังดึงข้อมูล คุณไม่เคยทำการดึงข้อมูลภายนอกนั้นให้เสร็จสิ้น


1
ถ้าฉันทำ $ con global (ซึ่งเป็นการปฏิบัติที่ไม่ดี แต่ควรทำงานตามที่คุณอธิบาย) ฉันยังคงมีข้อผิดพลาดเดิม

1
ฉันไม่คิดว่าการเชื่อมต่อทั่วโลกเป็นการปฏิบัติที่ไม่ดี
Mathieu J.

0

ตรวจสอบว่าคุณพิมพ์พารามิเตอร์ทั้งหมดถูกต้องหรือไม่ จะแสดงข้อผิดพลาดเดียวกันหากจำนวนพารามิเตอร์ที่กำหนดและส่งผ่านไปยังฟังก์ชันแตกต่างกัน


0

สิ่งนี้ไม่เกี่ยวข้องกับคำถามเดิม แต่ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันและเธรดนี้เป็นข้อความแรกใน Google และฉันต้องใช้เวลาสักพักในการค้นหาว่าปัญหาคืออะไรดังนั้นจึงอาจมีประโยชน์สำหรับผู้อื่น:

ฉันไม่ได้ใช้ mysqli แต่ยังคงใช้ mysql_connect ฉันมีแบบสอบถามง่ายๆ แต่หนึ่งแบบสอบถามทำให้แบบสอบถามอื่น ๆ ทั้งหมดล้มเหลวภายในการเชื่อมต่อเดียวกัน

ฉันใช้ mysql 5.7 และ php 5.6 ฉันมีตารางที่มี data-Type "JSON" เห็นได้ชัดว่าเวอร์ชัน php ของฉันไม่รู้จักค่าส่งคืนจาก mysql (php ไม่ทราบว่าจะทำอย่างไรกับรูปแบบ JSON เนื่องจากโมดูล mysql ในตัวเก่าเกินไป (อย่างน้อยฉันก็คิดว่า))

ตอนนี้ฉันเปลี่ยน JSON-Field-Type เป็น Text (สำหรับตอนนี้ฉันไม่ต้องการฟังก์ชัน mysql JSON ดั้งเดิม) และทุกอย่างทำงานได้ดี


0

หากคุณใช้ชุดผลลัพธ์ที่เป็นบัฟเฟอร์หรือไม่ได้บัฟเฟอร์ในการดึงข้อมูลก่อนอื่นคุณต้องล้างข้อมูลที่ดึงออกมาจากหน่วยความจำเมื่อคุณดึงข้อมูลทั้งหมดแล้ว เนื่องจากคุณไม่สามารถดำเนินการตามขั้นตอน MYSQL อื่นบนการเชื่อมต่อเดียวกันได้จนกว่าคุณจะล้างหน่วยความจำที่ดึงมา เพิ่มฟังก์ชั่นด้านล่างนี้ทางขวาสุดของสคริปต์เพื่อแก้ปัญหา

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

อ้างอิงจากเอกสาร PHP


1
หากคุณไม่ต้องการบันทึกบางอย่างคุณไม่ควรเลือกไว้ตั้งแต่แรก แทนที่จะเพียงแค่ปล่อยให้พวกเขาออกไปอย่าเลือกเลย และหากไม่เป็นเช่นนั้นและคุณดึงบันทึกทั้งหมดที่เลือกไว้ก็จะไม่มีข้อผิดพลาดดังกล่าวเลยเช่นกันไม่จำเป็นต้องโทรปิด () หรือฟรี () สำหรับขั้นตอนการจัดเก็บมีวิธีการที่ป่าเถื่อนน้อยกว่าดังที่อธิบายไว้ในคำตอบข้างต้น
สามัญสำนึกของคุณ

0

ฉันพบข้อผิดพลาดนี้โดยใช้ Doctrine DBAL QueryBuilder

ฉันสร้างแบบสอบถามด้วย QueryBuilder ที่ใช้การเลือกย่อยของคอลัมน์ซึ่งสร้างด้วย QueryBuilder ด้วย การเลือกย่อยถูกสร้างขึ้นผ่าน$queryBuilder->getSQL()และไม่ได้ดำเนินการเท่านั้น เกิดข้อผิดพลาดในการสร้างการเลือกย่อยที่สอง โดยการเรียกใช้การเลือกย่อยแต่ละรายการโดยชั่วคราว$queryBuilder->execute()ก่อนใช้$queryBuilder->getSQL()งานทุกอย่างจะทำงานได้ ราวกับว่าการเชื่อมต่อ$queryBuilder->connectionยังคงอยู่ในสถานะที่ไม่ถูกต้องสำหรับการสร้าง SQL ใหม่ก่อนที่จะเรียกใช้ SQL ที่เตรียมไว้ในปัจจุบันแม้จะมีอินสแตนซ์ QueryBuilder ใหม่ในการเลือกย่อยแต่ละรายการ

วิธีแก้ปัญหาของฉันคือเขียน subselects โดยไม่มี QueryBuilder


0

ฉันใช้ ODBC และการแก้ไขนี้ใช้ได้กับฉัน: ODBC -> แท็บ System DSN -> ดับเบิลคลิกเพื่อกำหนดค่าแหล่งข้อมูลของฉัน -> รายละเอียด -> แท็บเคอร์เซอร์ -> ยกเลิกการเลือก [อย่าแคชผลลัพธ์ของเคอร์เซอร์ไปข้างหน้าเท่านั้น] - > คลิกตกลง


0

ฉันมักจะพบข้อผิดพลาดนี้และเป็นเสมอเมื่อฉันเรียกใช้กระบวนงานที่เก็บไว้ซึ่งฉันได้รับการดีบักใน phpmyadmin หรือ SQL Workbench (ฉันทำงานใน php ที่เชื่อมต่อกับ mysqli)

ข้อผิดพลาดเป็นผลมาจากการที่การดีบักเกี่ยวข้องกับการแทรกคำสั่ง SELECT ที่จุดยุทธศาสตร์ในโค้ดเพื่อบอกสถานะของตัวแปร ฯลฯ การรันโพรซีเดอร์ที่เก็บไว้ซึ่งสร้างผลลัพธ์หลายชุดในสภาพแวดล้อมไคลเอ็นต์เหล่านี้ทำได้ดี แต่จะสร้าง คำสั่งไม่ซิงค์ "เกิดข้อผิดพลาดเมื่อเรียกจาก php การแก้ปัญหาคือเสมอที่จะแสดงความคิดเห็นออกหรือลบที่เลือกการแก้จุดบกพร่องเพื่อให้ขั้นตอนมีเพียงชุดหนึ่งผล


0

สำหรับการอ้างอิงฉันมีปัญหานี้ในการผสมทั้งสองอย่างmulti_queryและqueryในรหัสเดียวกัน:

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

ซึ่งสำหรับสิ่งที่ฉันอ่านมีผลลัพธ์ที่ไม่ได้รับการตอบสนองดังนั้นจึงทำให้เกิดข้อผิดพลาดดังกล่าว

ฉันแก้ไขด้วยการวนซ้ำที่ใช้ผลลัพธ์ทั้งหมดของmulti_query:

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

ในกรณีของฉันคำถามทั้งหมดในmulti_queryตำแหน่งที่แทรกดังนั้นฉันจึงไม่สนใจผลลัพธ์ด้วยตัวเอง


-1

ปัญหาของฉันคือฉันใช้คำสั่งเตรียมคำสั่งก่อนจากนั้นฉันใช้แบบสอบถาม mysqli ในหน้าเดียวกันและได้รับข้อผิดพลาด "Commands out of sync; you can't run this command now" ข้อผิดพลาดเกิดขึ้นเมื่อฉันใช้รหัสที่มีคำสั่งเตรียม

สิ่งที่ฉันทำคือปิดคำถาม และมันได้ผล

mysqli_stmt_close ($ stmt);

รหัสของฉัน

get_category.php (ที่นี่โดยใช้คำสั่งเตรียม)

    <?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 (ที่นี่ 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>

บางสิ่งที่เพิ่งหยุดคิดฉันยังเพิ่มตัวแปรการเชื่อมต่อผ่าน global $ connection ดังนั้นฉันคิดว่าโดยพื้นฐานแล้วระบบสืบค้นชุดใหม่ทั้งหมดกำลังเริ่มต้นหลังจากสิ้นสุดคำสั่งเตรียมด้วย mysqli_stmt_close ($ stmt) และฉันกำลังเพิ่มไฟล์เหล่านี้และสิ่งอื่น ๆ ผ่านทาง include


get_category.php (ที่นี่ใช้จัดทำงบ) pastebin.com/BiWysdYz admin_get_category_body.php (ที่นี่ mysqli) pastebin.com/Pwm30icm หมายเหตุ: ไม่สามารถโพสต์โค้ดทั้งหมดเนื่องจากข้อ จำกัด
มะหาดอาลี

บางสิ่งที่เพิ่งหยุดคิดฉันยังเพิ่มตัวแปรการเชื่อมต่ออีกครั้งผ่าน global $ connection; ดังนั้นฉันคิดว่าโดยพื้นฐานแล้วระบบสืบค้นชุดใหม่ทั้งหมดกำลังเริ่มต้นหลังจากสิ้นสุดคำสั่งเตรียมด้วย mysqli_stmt_close ($ stmt) และฉันกำลังเพิ่มไฟล์เหล่านี้และสิ่งอื่น ๆ ผ่านทาง include
Mahad Ali

-1

นี่เป็นคำถามเก่า แต่ไม่มีคำตอบที่โพสต์ไว้ในกรณีของฉันฉันพบว่าในกรณีของฉันฉันได้เลือกและอัปเดตบนตารางในขั้นตอนที่เก็บไว้ตารางเดียวกันมีทริกเกอร์การอัปเดตซึ่งกำลังถูกเรียกใช้และเรียกใช้ ขั้นตอนในการวนซ้ำที่ไม่มีที่สิ้นสุด เมื่อพบข้อบกพร่องข้อผิดพลาดก็หายไป


-2

สร้างการเชื่อมต่อสองรายการใช้ทั้งสองอย่างแยกกัน

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.