บางครั้งรหัส 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 : การ
รายงานข้อผิดพลาดในการพัฒนาและเซิร์ฟเวอร์ที่ใช้งานจริงต้องแตกต่างกัน บนเซิร์ฟเวอร์การพัฒนาจะสะดวกที่จะมีข้อผิดพลาดปรากฏบนหน้าจอ แต่ในข้อความแสดงข้อผิดพลาดของเซิร์ฟเวอร์จริงจะต้องถูกบันทึกแทนดังนั้นคุณจะพบข้อผิดพลาดในบันทึกข้อผิดพลาดในภายหลัง
ดังนั้นคุณต้องตั้งค่าตัวเลือกการกำหนดค่าที่เกี่ยวข้องเป็นค่าต่อไปนี้:
ใช้งานจริงได้อย่างไร?
เพียง แต่เอารหัสใด ๆ ที่ตรวจสอบข้อผิดพลาดด้วยตนเองทุกคน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
$mysqli
ตัวแปรได้ที่ไหน?