ตามหัวข้อ Entry เลยครับ
วันนี้เราจะมาดูกันว่า query กับ prepare มันต่างกันอย่างไร
ข้อควรอ่าน
ในที่นี้ผมจะทำงานใน localhost นะครับเพราะมีปัญหากับ File Manager ของ Server
config ใน php.ini ผมไม่ได้เพิ่มอะไรเลยนอกจากเพิ่ม extention ของ pdo
(รายละเอียดอ่านได้ใน เรื่องที่เกี่ยวข้องครับ)
และในที่นี้ ผมจะไม่พูดเจาะลึกนะครับ
เกริ่นนำ นิดหน่อย
คนที่ไม่เคยจับ pdo อาจจะงง query กับ prepare มันใช้ทำอะไร...
คือมันใช้ดึงข้อมูลจากฐานข้อมูลออกมาใช้งาน นั่นเอง ok?
ก่อนอื่นผมขอพูดถึงผลลัพธ์ของ ทั้ง query และ prepare ก่อนนะครับ
- ผลลัพธ์หรือ result นั้น มีค่าที่เหมือนกันครับ ถ้าให้ค่า fetch() ที่เหมือนกัน
** fetch() เฉยๆ จะให้ค่าเป็น PDO::FETCH_BOTH นะครับ
- ค่าที่ได้ออกมาจะเป็น array
- ในกรณี ที่ใช้ fetch() เฉยๆค่าที่ได้จะมี key index ของ array ติดมาด้วย (สงสัยเป็นเพราะ FETCH_BOTH น่ะล่ะ)
query
เออ....สำหรับ query นั้นเอาสั้นๆง่ายๆคือใช้ครั้งเดียวแล้วทิ้งครับ(ไม่ใช่ถุงยางนะเฟ้ย....)
คือ หลังจากที่ query statement เสร็จ ก็จบเลย (ในphp manual ก็เหมือนจะว่างั้น)
** Comment **
ตรง query นี้ถ้าเราลองใน localhost นั้นมันสามารถ ใช้งานจากตัว connect ($dbh) ได้หลายรอบ
แต่พอดีเครื่อง sv. ที่ผมฝึกงานอยู่คงจะมีบัค คือถ้าจะ query statement ใหม่ก็ต้อง new pdo ใหม่อีกรอบ
ตัวอย่าง query
$sql="SELECT mem_id,mem_name,mem_surname FROM `member` ORDER BY `member`.`mem_id` ASC";
$result=$dbh->query($sql);
while($row=$result->fetch()){
echo $row[mem_id]." ".$row[mem_name]." ".$row[mem_surname]."<br>";
}
ผลการเรียกใช้งาน

ถ้าจะ query ใหม่อีกรอบก็เรียกใช้งาน new pdo อีกครั้ง
$dbh2 = new PDO($database_connect, $username, $password);
$result2=$dbh2->query($sql);
แค่นี้ล่ะครับ...ไม่ได้มีอะไรมาก....ง่ายเหมือนปลอกกล้วยเข้าปาก
prepare
ตัวของ prepare ก็ไม่ได้มีอะไรมากครับ
คือ prepare จะทำงานเมื่อเรา execute ครับ และสามารถใช้ได้หลายครั้ง
ตัวอย่าง prepare
include("config.php");
$sql="SELECT mem_id,mem_name,mem_surname FROM `member` ORDER BY `member`.`mem_id` ASC";
$result=$dbh->prepare($sql);
$row=$result->fetch();
if($row==""){
echo"<pre>Not Value Exit</pre>";
}
$result->execute();
while($row2=$result->fetch()){
echo $row2['mem_id']." ".$row2['mem_name']." ".$row2['mem_surname']."<br>";
}
ผลการเรียกใช้งาน

ช่วงที่ไฮไลท์สีเขียวเอาไว้แสดงให้ดูว่าตราบใดที่เรายังไม่ได้ทำการ execute นั้น
value ที่ได้จาก statement ก็จะยังไม่มี ซึ่งเราถ้าเราทำ print_r เราก็จะได้ sql ของ statement นั้นๆออกมา
ตรงจุดนี้ ผมลอง fetch() ไปเลยโดยไม่ได้ผ่าน execute() มาก่อน
ก็จะได้ผลลัพท์เป็น Not Value Exit ออกมา
เหตุผลที่ต้องเปรียบเทียบ
PDO->query นั้นเหมาะกับการเรียก query เพียงครั้งเดียว
แต่ถ้าเราไม่ได้ดึงข้อมูลทั้งหมดที่เราต้องการออกมาเพียงครั้งเดียว
การเรียก PDO->query ครั้งต่อไปอาจไม่สำเร็จ ดังนั้นถ้าเรา้ต้อ query
หลายๆครั้งการใช้ prepare และ execute น่าจะดีที่สุด
ซึ่งตัว prepare มีข้อดีที่เหนือกว่า query คือ
- ป้องกันการใช้ SQL Injection
- เมื่อมีการใช้งาน query บ่อยครั้ง prepare และ execute จะทำงานได้เร็วกว่า
การใช้ตัวเลือกในการดึงข้อมูล
ในกรณีที่เราเขียนเป็นเชิงวัตถุ สามารถใช้เมธอด fetchObject() เข้ามาช่วยได้ดังนี้
$result->execute();
while($row2=$result->fetchObject()){
echo $row2->mem_id." ".$row2->mem_name." ".$row2->mem_surname."<br>";
}
เรื่องที่เกี่ยวข้อง
starting with pdo
เอกสารประกอบ
PHP Docs <<< จำเป็นจริงๆนะ....
แนะนำว่าให้โหลดเป็น .chm ครับ
ข้อมูลอ้างอิง
รวมเด็ดเคล็ดลับ 101 Tips & Tricks PHP
เรียบเรียงโดย
ทวิร พานิชสมบัติ

เล่มนี้ ซูฮก ให้เลยครับ เด็ดจริงๆ มือใหม่ php ต้องอ่านครับ (แล้วจะติดใจ)
วันนี้ขอจบการนำเสนอเพียงเท่านี้ครับ
วันหน้าเราจะไปเจอกับ ปัญหาของการคิวรี่(PDO) รวมถึง การเพิ่มลบ แก้ไขด้วยครับ
สุข.....สวัสดี.....ชาวไทย(ไชโยโห่หิ๊ววววว lol~~~~~)