PHP+MySQL (2)
posted on 20 Jul 2009 23:29 by aimaจากเอนทรีเก่านี้ ผ่านมาเกือบ 4 ปีแน่ะ
กลับมาอ่านดูก็มีข้อแนะนำเพิ่มเติมต่อจากตัวเองในตอนนั้นนิดหน่อย
1. mysql_connect() ไม่จำเป็นต้องมีตัวแปรมารับก็ได้ เวลาเรียกใช้ไม่จำเป็นต้องอ้างอิง resource link เอง
แต่ให้ php ถือการ connect ล่าสุดเป็นตัวอ้างอิง
2. คำสั่ง mysql_query() / mysql_db_query() หากคำสั่ง SQL ที่เรียกใช้งานผิด
มันไม่คืนมาเป็น false ให้ อยากรู้ต้องไปเช็คจาก mysql_error() เอง
(หรือหาได้จาก mysql_num_rows() หาจำนวนแถวของผลลัพธ์ ถ้ามีอะไรผิดพลาดมักจะได้ค่าเป็น 0)
3. คำสั่ง mysql_fetch_xxx (xxx = array, assoc, row) จะก่อ Warning บ่อยมากด้วยคำสั่ง SQL ที่ผิดพลาด
ปิดได้ด้วยการใส่ @ นำหน้าคำสั่ง ทำให้ Error ไม่แสดงแต่จะ return false แทน (ใช้เช็คได้เช่นกัน)
4. mysql_fetch_xxx ทั้งสามชนิดมีวิธีใช้ของมัน
array = จะได้ Array เรียงฟิลด์ออกมา พ่วงด้วย Array ที่มี Key เป็นชื่อฟิลด์ที่ได้จากการ Query
assoc = ออกมาเฉพาะ Key ที่เป็นชื่อฟิลด์ เช่น ['id'], ['name'], ['email']
row = เรียงฟิลด์ [0],[1],[2],... และไม่มีชื่อฟิลด์ปน
ตัวอย่างการใช้งาน ถ้าผม Query รายชื่อสมาชิกในฐานข้อมูลสมาชิกตัวอย่างซักอัน
คำสั่ง SQL: SELECT id, username, email FROM member WHERE id=10
ผลลัพธ์จากการ fetch:
array -> Array( 0 => [ค่า id], 1 => [ค่า username], 2 => [ค่า email], 'id' => [ค่า id], 'username' => [ค่า username], 'email' => [ค่า email] )
assoc -> Array( 'id' => [ค่า id], 'username' => [ค่า username], 'email' => [ค่า email] )
row -> Array( 0 => [ค่า id], 1 => [ค่า username], 2 => [ค่า email] )
จะเห็นว่า assoc กับ row นั้นออกมาพอดีใช้งาน ซึ่งมีผลเรื่องความเร็วในหลายๆ กรณี
โดย row เหมาะสำหรับเอามาใช้กับ loop ส่วน assoc เหมาะกับการอ้างอิงค่าตามชื่อฟิลด์ของผลลัพธ์
ที่มักจะตรงกับชื่อใน DB นั้น
ตามหลักสูตรมักจะให้ใช้ array ที่เวลาใช้งานจริงๆ ไม่ค่อยเหมาะครับ
5. บน PHP เวอร์ชั่น 5 จะไม่เรียก mysql_close() ก็ได้ ตัว Compiler จะปิดให้อัตโนมัติ (ยกเว้นใช้งาน mysql_pconnect() ซึ่งเท่ากับขอเชื่อมต่อค้างไว้ เมื่อไม่ใช้ก็ต้องสั่งปิดเอง)
6. คำสั่งคู่กับ mysql_num_rows() คือคำสั่ง mysql_affected_rows() ซึ่งมีจุดต่างอยู่ 2 จุด
- num_rows จะนับที่คำสั่ง SQL SELECT แต่ affected_rows จะสนใจ SQL INSERT / UPDATE / DELETE แทน
- num_rows ต้องมีพารามิเตอร์เป็น result source แต่ affected_rows ใช้ resource link จาก mysql_connect() และไม่บังคับว่าต้องใส่
ถือเป็นการเพิ่มเติมข้อมูลซักหน่อยก่อนนอนก็แล้วกัน
เนื่องจากเคสต่างๆ เหล่านี้ผมได้แนะนำให้เพื่อนๆ น้องๆ ไปหลายครั้งแล้ว :P
ปกติชอบตัวนี้มากกว่า
#1 By ไทน่า หมาป่าตัวเขียว on 2009-07-21 02:11