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

Comment

Comment:

Tweet

mysql_result เป็นคำสั่งที่ทำงานแบบเรียกทีละ 1 Cell
ข้อดี: เลือกแถวที่จะดึงข้อมูลได้ เช่น เลือกเฉพาะแถวที่ 3
ข้อเสีย: ทำงานช้าถ้าเรียกทีละหลายฟิลด์ หรือใช้ร่วมกับ Query ที่ให้ผลลัพธ์เยอะๆ (เช่น เรียกข้อมูลทีละ 100 แถว)

นึกถึง fetch อีกตัวที่ลืมไปแล้ว

mysql_fetch_object
ตัวนี้ใช้งานต่างจากตัวอื่นนิดหน่อยดังนี้
$row = mysql_fetch_object($result);
echo $row->id;

คือใช้งานตามแบบของ OOP แทน Array
แต่เนื่องจาก PHP6 ยังไม่มา ตอนนี้ Object ยังคงทำงานช้ากว่า Array ครับ

ถ้าเทียบ Performance _fetch_row จะไวสุดเพราะมี index เป็นตัวเลข แต่เวลาใช้จริง _fetch_assoc จะนิยมกว่าเพราะ index จะมี key ตามชื่อฟิลด์ เช่น ['id'], ['username'], ฯลฯ

มันก็ง่ายกว่านั่งแกะ [0], [1], [2] ว่ามันเก็บอะไรน่ะนะ.. sad smile

#2 By aima-kun on 2009-07-28 13:48

แล้ว mysql_result นี่มันใช้ดีปะวะ
ปกติชอบตัวนี้มากกว่า