Query & Prepare SQL with PDO

posted on 11 May 2009 09:54 by robocon  in Programing

ตามหัวข้อ Entry เลยครับ

วันนี้เราจะมาดูกันว่า query กับ prepare มันต่างกันอย่างไร

ข้อควรอ่าน

ในที่นี้ผมจะทำงานใน localhost นะครับเพราะมีปัญหากับ File Manager ของ Server

config ใน php.ini ผมไม่ได้เพิ่มอะไรเลยนอกจากเพิ่ม extention ของ pdo

(รายละเอียดอ่านได้ใน เรื่องที่เกี่ยวข้องครับ)

และในที่นี้ ผมจะไม่พูดเจาะลึกนะครับ

 

เกริ่นนำ นิดหน่อย

คนที่ไม่เคยจับ pdo อาจจะงง query กับ prepare มันใช้ทำอะไร...

คือมันใช้ดึงข้อมูลจากฐานข้อมูลออกมาใช้งาน นั่นเอง ok?

ก่อนอื่นผมขอพูดถึงผลลัพธ์ของ ทั้ง query และ prepare ก่อนนะครับ

  1. ผลลัพธ์หรือ result นั้น มีค่าที่เหมือนกันครับ ถ้าให้ค่า fetch() ที่เหมือนกัน
    ** fetch() เฉยๆ จะให้ค่าเป็น PDO::FETCH_BOTH นะครับ
  2. ค่าที่ได้ออกมาจะเป็น array
  3. ในกรณี ที่ใช้ 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]."&nbsp;".$row[mem_name]."&nbsp;".$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']."&nbsp;".$row2['mem_name']."&nbsp;".$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 คือ

  1. ป้องกันการใช้ SQL Injection
  2. เมื่อมีการใช้งาน query บ่อยครั้ง prepare และ execute จะทำงานได้เร็วกว่า

 

การใช้ตัวเลือกในการดึงข้อมูล

ในกรณีที่เราเขียนเป็นเชิงวัตถุ สามารถใช้เมธอด fetchObject() เข้ามาช่วยได้ดังนี้

$result->execute();
while($row2=$result->fetchObject()){
echo $row2->mem_id."&nbsp;".$row2->mem_name."&nbsp;".$row2->mem_surname."<br>";
}

 

เรื่องที่เกี่ยวข้อง

starting with pdo

 

เอกสารประกอบ

PHP Docs <<< จำเป็นจริงๆนะ....
แนะนำว่าให้โหลดเป็น .chm ครับ

 

ข้อมูลอ้างอิง
รวมเด็ดเคล็ดลับ 101 Tips & Tricks PHP
เรียบเรียงโดย ทวิร พานิชสมบัติ

tips & tricks php book

เล่มนี้ ซูฮก ให้เลยครับ เด็ดจริงๆ มือใหม่ php ต้องอ่านครับ (แล้วจะติดใจ)

 

วันนี้ขอจบการนำเสนอเพียงเท่านี้ครับ
วันหน้าเราจะไปเจอกับ ปัญหาของการคิวรี่(PDO) รวมถึง การเพิ่มลบ แก้ไขด้วยครับ

 

สุข.....สวัสดี.....ชาวไทย(ไชโยโห่หิ๊ววววว lol~~~~~)

Comment

smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry ???????????????   ??????????????????
smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry ???????????????

Tweet

เหอ เหอ เหอ ไม่สามารถเลยค่ะ

#1 By จอมบงการ on 2009-05-11 22:02

ทำไว้ ให้รู้open-mounthed smile open-mounthed smile

#2 By perfectlove on 2009-05-14 09:17

@ perfectlove
คุณครับ....
ผมก็ทำงานกับคุณกันสองคนน่ะล่ะ
(แอบมา คอมเม้น เรอะพ่อคู๊นนนน)

เอาน่าๆจดไว้กันลืม...
อีกอย่าง
เพื่อเป็นหลักฐานว่าเราเคยเขียนมาแล้ว ฮ่าๆconfused smile

#3 By robocon on 2009-05-14 09:31

บรรยากาศเอ็นทรี่นี้ สงสัยจะตึงเครียดไปหน่อยsad smile

ดูแล้ว มาคุๆ ยังไงไม่รู้sad smile

ไม่มีคนมาคอมเม้นเลย เอาวะ...เม้นเองก็ได้...
ฮ่าๆๆๆๆๆconfused smile
(บ้าไปแล้วไอ่นี่... )

#4 By robocon on 2009-05-14 12:57

ฮาา ฮาา มันอยู่ทีใจ ไม่ใช่วัย

น่าจะเชื่อเรื่องอะไรอะน่ะ นายต้องมีเหตุผลด้วยน่ะ
และเรื่องความเชื่อ สำหรับเราอะ มันอยู่ที่ตัวของเราไม่ได้อยู่ที่ใคร

เราจะเชื่อใจใครสักคน สมมุติ นายจะเชื่อใจแฟนนาย
นายก็คงต้องรู้ัจักเขาก่อนใช้มะ

นายจะเชื่อใจใคร หรือเชื่ออะไร ต้องรู้ัจักก่อน จริงเป่า big smile

#5 By perfectlove on 2009-05-20 08:47

ผมยังสงสัยอยู่ว่า ระหว่าง ADODB กับ PDO อันไหนมีข้อดีข้อเสียยังไง
แต่ที่รู้ๆมาเห็นเขาว่า PDO เร็วกว่า ADODB 225% จริงหรือเท็จยังไงก็ไม่รู้นะ

แต่เล่มที่พี่พีว่านี่ดีจริงๆ ช่วยคอนเฟิร์มอีกแรง เพราะลองอ่านแปบๆก็ซื้อมาเลย
ค่อยข้างกล้าที่นำเสนอในเบื้องลึก ส่วนมากเนื้อหาเชิงลึกไม่ค่อยจะหลุดผ่าน บก.
หนังสือบ้านเราเลยมีแต่หนังสือพื้นฐานเสียส่วนมาก ก็ไม่รู้ว่าขายดีหรือเปล่า ทำ
ออกมาแข่งกันอยู่นั่นแหละ เหอๆ

#6 By Kenessar on 2010-05-28 19:17

This post has helped me think things thorguh

#7 By fhZlEkOl3dcU (103.7.57.18|94.23.238.222) on 2013-06-23 17:00