เปลี่ยนจาก mysql มาเป็น mysqli กันเถอะ
หน้าแรก PHP MySQL เกร็ดความรู้ เปลี่ยนจาก mysql มาเป็น mysqli กันเถอะ
mysqli ย่อมาจาก mysql improved หรือชุดคำสั่งสำหรับติดต่อ mysql server ที่พัฒนามากขึ้น โดยมีจุดที่ดีกว่า mysql ตรงที่
Object-oriented interface
เมื่อสั่งคำสั่งติดต่อกับ mysql หรือทำการ query ข้อมูล จะไม่ออกมาเป็นตัวแปรค่าผสม (mixed value) แล้วนะครับ จะได้เป็น object มาแทน และตัว object นี้จะสามารถใช้ method ในตัวมันได้เลย จึงทำให้การเขียนติดต่อกับ mysql หลายๆ server พร้อมกันง่ายขึ้น
Support non-blocking, asynchronous queries with mysqlnd
สนับสนุนการทำ query แบบ async เหมาะกับคำสั่ง INSERT , UPDATE หรือ DELETE โดยไม่จำเป็นต้องรอให้คำสั่งนั้นเสร็จก่อน สามารถทำคำสั่ง php ถัดไปได้เลย
Support for Prepared Statements
ว่ากันง่ายๆคือการเตรียมคำสั่ง query เอาไว้ที่ mysql server จากนั้นก็ทำการส่งแค่ค่าตัวแปรบางตัวไป call query บน server เหมาะกับการใช้คำสั่งซ้ำบ่อยๆ
Support for Multiple Statements
สนับสนุนการทำคำสั่งพร้อมๆกันหลายๆคำสั่ง
Support for Transactions
สนับสนุนการทำ Transactions
Enhanced debugging capabilities
ช่วยในการ debug code query ของ mysql มากขึ้น
Embedded server support
สนับสนุน Embedded server (มันคืออะไร อยากรู้เหมือนกันแฮะ)
http://th1.php.net/manual/en/mysqli.overview.php คัดลอกบางส่วนจากที่นี่
อีกทั้งฝั่ง php ประกาศแล้วว่า mysql จะถูก deprecated ใน version 5.5 และจะ removed ใน version ถัดไปด้วย
รวมถึงประสิทธิภาพโดยรวมของการใช้ mysqli แทน mysql จะดีขึ้นกว่าเดิม
ext/mysql - การเขียน code style เก่า
การเชื่อมต่อเครื่องฐานข้อมูล
$link = mysql_connect("host","username","password");
$link = mysql_pconnect("host","username","password");
ค่า $link จะเป็น mysql resource เพื่อใช้ในการอ้างอิงการเชื่อมต่อกับ mysql server ตามที่ connect ไป
บรรทัดล่างจะเป็นการเชื่อมต่อแบบ persistant
เลือกฐานข้อมูล
mysql_select_db("database name",$link);
เป็นการเลือกใช้ฐานข้อมูลบน $link ที่ connect เอาไว้
ส่งคำสั่งไปยัง mysql server
$result = mysql_query("query",$link);
เมื่อส่งคำสั่ง sql ไปยัง server แล้วได้รับตอบกลับมาถูกต้องจะได้ค่ามาเก็บไว้ใน $result
แกะข้อมูลออกมาเป็น Array (1 แถว)
$data = mysql_fetch_array($result);
จะทำการรับค่าแถวแรกของ $result ที่ได้รับมาใส่ไว้ใน $data
key ของ array จะเป็น column index และ ชื่อ column (ถ้าไม่ได้ระบุ Flag บน parameter ที่ 2 ของคำสั่ง mysql_fetch_array)
แกะข้อมูลครบทุกแถว
while ($row = mysql_fetch_array($result)){
}
จะทำการ loop statement ไปเรื่อยๆจนกว่าจะครบทุกแถว
หมายเลข ID ที่ทำการ insert เข้าไป
$row = mysql_query("INSERT STATEMENT",$link);
$insert_id = mysql_insert_id($link);
ถ้าหาก table นั้นได้ทำ auto_increment ไว้ ก็จะได้ $insert_id ออกมาเป็นหมายเลขแถวที่ข้อมูลได้แทรกเข้าไปใน table
จำนวนแถวที่มีการเปลี่ยนแปลง
$row = mysql_query("UPDATE/DELETE STATEMENT",$link);
$affected_rows = mysql_affected_rows($link);
ในการเปลี่ยนแปลงข้อมูล จะได้จำนวนแถวที่มีการแก้ไข/ลบ สำเร็จ
จำนวนแถวที่ select ออกมาได้
$result = mysql_query("SELECT STATEMENT",$link);
$num_rows = mysql_num_rows($result);
นับจำนวนแถวที่ select ออกมาได้ใน $result
ใส่ Escaped String สำหรับ Special character
$esc_string = mysql_escape_string($string);
เป็นการป้องกันไม่ให้เกิดการ sql injection ขึ้นด้วยอักขระ ' หรือ " ภายใน $string
ext/mysqli - เปลี่ยน code จากเดิมนิดเดียว
จะเขียนเทียบกับคำสั่งต่อคำสั่งด้านบนเลยนะครับ ซึ่งคำสั่งหลายตัวจะอยู่ใน Object ด้วย
Code |
// เชื่อมต่อฐานข้อมูล (connect) $link = mysql_connect("host","username","password"); // mysql $db = new mysqli("host","username","password"); // mysqli // เลือกฐานข้อมูล (schema) mysql_select_db("database name",$link); // mysql $db->select_db("database name"); // mysqli // ส่งคำสั่ง (query) $result = mysql_query("STATEMENT",$link); // mysql $result = $db->query("STATEMENT"); // mysqli // แกะข้อมูล 1 แถว (fetch array) $data = mysql_fetch_array($result); // mysql $data = $result->fetch_array(); // mysqli // แกะข้อมูลครบทุกแถว (fetch all array) while ($row = mysql_fetch_array($result)){ } // mysql while ($row = $result->fetch_array()){ } // mysqli // หมายเลข id ที่แทรกข้อมูล (insert id) $insert_id = mysql_insert_id($link); // mysql $insert_id = $db->insert_id; // mysqli เก็บเป็นตัวแปร ไม่ได้สั่งผ่าน method // จำนวนแถวที่มีการเปลี่ยนแปลง (affected rows) $affected_rows = mysql_affected_rows($link); // mysql $affected_rows = $db->affected_rows; // mysqli เก็บเป็นตัวแปร ไม่ได้สั่งผ่าน method // จำนวนแถวที่ query มาได้ (number of rows) $num_rows = mysql_num_rows($result); // mysql $num_rows = $result->num_rows; // mysqli เก็บเป็นตัวแปร ไม่ได้สั่งผ่าน method // Real escaped string $esc_string = mysql_escape_string($string); // mysql $esc_string = $db->escape_string($string); // mysqli |
คำสั่ง mysql_query ถ้าหากเป็นการ SELECT ข้อมูลจะได้ object class mysqli_result ออกมาซึ่งจะสามารถเอาไป fetch หรือ num_rows ต่อได้ ส่วนการเชื่อมต่อกับฐานข้อมูล จะใช้การ new object เป็นตัว initial ขึ้นมาเลย
อ่านเพิ่มเติมได้ที่
http://th1.php.net/manual/en/book.mysqli.php
แนะนำให้อ่านส่วนของ mysqli และ mysqli_result ไว้นะครับ
ขึ้นไปด้านบน