mysqli_fetch_assoc () คาดว่าจะมีข้อผิดพลาดพารามิเตอร์ / เรียกไปยังฟังก์ชันสมาชิก bind_param () จะรับข้อผิดพลาด mysql จริงและแก้ไขได้อย่างไร?

Mar 26 2014

ในสภาพแวดล้อมโลคัล / การพัฒนาของฉันคิวรี MySQLi ทำงานได้ดี อย่างไรก็ตามเมื่อฉันอัปโหลดในสภาพแวดล้อมการโฮสต์เว็บฉันได้รับข้อผิดพลาดนี้:

ข้อผิดพลาดร้ายแรง: เรียกใช้ฟังก์ชันสมาชิก bind_param () บนวัตถุที่ไม่ใช่ใน ...

นี่คือรหัส:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

ในการตรวจสอบคำถามของฉันฉันพยายามดำเนินการค้นหาผ่านแผงควบคุม phpMyAdmin และผลลัพธ์ก็โอเค

คำตอบ

131 YourCommonSense Mar 26 2014 at 20:32

บางครั้งรหัส MySQLi ของคุณสร้างข้อผิดพลาดเช่นmysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...หรือคล้ายกัน หรือแม้จะไม่มีข้อผิดพลาดใด ๆ แต่แบบสอบถามไม่ได้ทำงานเหมือนกันทั้งหมด หมายความว่าการสืบค้นของคุณล้มเหลวในการดำเนินการ

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

จะรับข้อความแสดงข้อผิดพลาดใน MySQLi ได้อย่างไร

ก่อนอื่นต้องมีบรรทัดนี้เสมอก่อนที่ MySQLi จะเชื่อมต่อในทุกสภาพแวดล้อมของคุณ:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

วิธีกำหนดค่า PHP ในสภาพแวดล้อมต่างๆ

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

ดังนั้นคุณต้องตั้งค่าตัวเลือกการกำหนดค่าที่เกี่ยวข้องเป็นค่าต่อไปนี้:

  • บนเซิร์ฟเวอร์การพัฒนา

    • error_reportingควรตั้งค่าเป็นE_ALLมูลค่า
    • log_errors ควรตั้งค่าเป็น 1 (สะดวกในการบันทึกบนพีซีสำหรับการพัฒนาด้วย)
    • display_errors ควรตั้งค่าเป็น 1
  • บนเซิร์ฟเวอร์ที่ใช้งานจริง

    • error_reportingควรตั้งค่าเป็นE_ALLมูลค่า
    • log_errors ควรตั้งค่าเป็น 1
    • display_errors ควรตั้งค่าเป็น 0

ใช้งานจริงได้อย่างไร?

เพียง แต่เอารหัสใด ๆ ที่ตรวจสอบข้อผิดพลาดด้วยตนเองทุกคนor die(), if ($result)และเช่น เพียงเขียนรหัสโต้ตอบฐานข้อมูลของคุณทันที:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

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

จะทำอย่างไรกับข้อความแสดงข้อผิดพลาดที่คุณได้รับ

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

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

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

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

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

รายการสิ่งที่คุณไม่ควรทำในเรื่องการรายงานข้อผิดพลาด

  • อย่าใช้ตัวดำเนินการปราบปรามข้อผิดพลาด ( @)! ทำให้โปรแกรมเมอร์ไม่สามารถอ่านข้อความแสดงข้อผิดพลาดและไม่สามารถแก้ไขข้อผิดพลาดได้
  • อย่าใช้die()หรือechoหรือฟังก์ชันอื่นใดเพื่อพิมพ์ข้อความแสดงข้อผิดพลาดบนหน้าจอโดยไม่มีเงื่อนไข PHP สามารถรายงานข้อผิดพลาดได้ด้วยตัวเองและทำได้อย่างถูกต้องขึ้นอยู่กับสภาพแวดล้อมดังนั้นเพียงแค่ปล่อยให้ PHP
  • อย่าเพิ่มเงื่อนไขเพื่อทดสอบผลการสืบค้นด้วยตนเอง (เช่นif($result)) เมื่อเปิดใช้งานข้อผิดพลาดเงื่อนไขดังกล่าวจะไร้ประโยชน์
  • อย่าใช้try..catchตัวดำเนินการเพื่อสะท้อนข้อความแสดงข้อผิดพลาด ควรใช้โอเปอเรเตอร์นี้เพื่อจัดการข้อผิดพลาดบางอย่างเช่นการย้อนกลับธุรกรรม แต่อย่าใช้เพียงเพื่อรายงานข้อผิดพลาด - ดังที่เราได้เรียนรู้ไว้ข้างต้น PHP สามารถทำได้แล้วเป็นวิธีที่ถูกต้อง

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