บ่อยครั้งที่มันเกิดขึ้นคำถามนี้ทำให้สับสนเหมือนเป็นนรก ผู้คนมาที่นี่โดยมีงานสองอย่างที่ต่างกันในใจ:
- พวกเขาจำเป็นต้องรู้จำนวนแถวในตาราง
- พวกเขาจำเป็นต้องรู้ว่าแบบสอบถามส่งคืนแถวใด ๆ หรือไม่
นั่นเป็นงานที่แตกต่างกันสองอย่างที่ไม่มีอะไรเหมือนกันและไม่สามารถแก้ไขได้ด้วยฟังก์ชั่นเดียวกัน กระแทกแดกดันสำหรับพวกเขาทั้งPDOStatement::rowCount()
ฟังก์ชั่นที่แท้จริงจะต้องมีการใช้
มาดูกันว่าทำไม
การนับแถวในตาราง
ก่อนที่จะใช้ PDO mysql_num_rows()
ฉันเพียงแค่ใช้เพียง
หมายความว่าคุณอยู่แล้วทำมันผิด การใช้mysql_num_rows()
หรือrowCount()
นับจำนวนแถวในตารางเป็นภัยพิบัติจริงในแง่ของการใช้ทรัพยากรเซิร์ฟเวอร์ ฐานข้อมูลต้องอ่านแถวทั้งหมดจากดิสก์ใช้หน่วยความจำบนเซิร์ฟเวอร์ฐานข้อมูลจากนั้นส่งข้อมูลทั้งหมดไปที่ PHP ใช้หน่วยความจำของกระบวนการ PHP เช่นกันทำให้เซิร์ฟเวอร์ของคุณไม่มีภาระแน่นอน
นอกจากนี้การเลือกแถวเพื่อนับพวกเขาก็ไม่สมเหตุสมผล count(*)
แบบสอบถามจะต้องมีการเรียกใช้แทน ฐานข้อมูลจะนับระเบียนออกจากดัชนีโดยไม่ต้องอ่านแถวที่เกิดขึ้นจริงและหลังจากนั้นเพียงหนึ่งแถวกลับ
เพื่อจุดประสงค์นี้รหัสที่แนะนำในคำตอบที่ยอมรับนั้นยุติธรรม
การนับจำนวนแถวที่ส่งคืน
กรณีที่ใช้งานครั้งที่สองนั้นไม่ได้เกิดความหายนะอย่างไร้จุดหมาย: ในกรณีที่คุณจำเป็นต้องรู้ว่าคิวรีของคุณส่งคืนข้อมูลใด ๆ หรือไม่คุณมีข้อมูลอยู่เสมอ!
พูดถ้าคุณเลือกแถวเดียว เอาล่ะคุณสามารถใช้แถวที่ถูกดึงมาเป็นธง:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
fetchAll()
ในกรณีที่คุณจำเป็นต้องได้รับแถวมากแล้วคุณสามารถใช้
fetchAll()
เป็นสิ่งที่ฉันไม่ต้องการเพราะบางครั้งฉันอาจต้องรับมือกับชุดข้อมูลขนาดใหญ่
ใช่แน่นอนสำหรับกรณีที่ใช้ครั้งแรกมันจะแย่เป็นสองเท่า แต่ที่เราเรียนรู้แล้วเพียงไม่เลือกแถวเท่านั้นที่จะนับพวกเขาหรือด้วยมิได้rowCount()
fetchAll()
fetchAll()
แต่ในกรณีที่คุณจะใช้งานจริงแถวที่เลือกมีอะไรผิดปกติในการใช้ จำไว้ว่าในเว็บแอปพลิเคชันคุณไม่ควรเลือกแถวจำนวนมาก แถวเดียวที่จะนำมาใช้จริงบนหน้าเว็บควรจะเลือกเพราะฉะนั้นคุณได้มีการใช้งานLIMIT
, WHERE
หรือประโยคที่คล้ายกันใน SQL ของคุณ และสำหรับข้อมูลในปริมาณที่พอเหมาะก็สามารถใช้งานfetchAll()
ได้ และอีกครั้งเพียงใช้ผลลัพธ์ของฟังก์ชันนี้ในเงื่อนไข:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
และแน่นอนว่ามันจะเป็นความบ้าคลั่งอย่างแน่นอนที่จะเรียกใช้คิวรีพิเศษเพื่อบอกว่าคิวรีอื่นของคุณส่งคืนแถวใด ๆ ตามที่แนะนำไว้ในสองคำตอบยอดนิยมหรือไม่
การนับจำนวนแถวในชุดผลลัพธ์ขนาดใหญ่
ในกรณีที่เกิดขึ้นได้ยากเมื่อคุณจำเป็นต้องเลือกจำนวนแถวที่แท้จริง (ในแอปพลิเคชันคอนโซลเช่น) คุณจะต้องใช้แบบสอบถามที่ไม่มีข้อผิดพลาดเพื่อลดจำนวนหน่วยความจำที่ใช้ แต่นี่เป็นกรณีจริงเมื่อrowCount()
ไม่สามารถใช้งานได้ดังนั้นจึงไม่มีประโยชน์สำหรับฟังก์ชั่นนี้เช่นกัน
ดังนั้นนั่นเป็นกรณีการใช้งานเฉพาะเมื่อคุณอาจจำเป็นต้องเรียกใช้แบบสอบถามเพิ่มเติมในกรณีที่คุณจำเป็นต้องทราบการประมาณการอย่างใกล้ชิดสำหรับจำนวนแถวที่เลือก