20.01.2015 Views

PHP 5 & MySQLi

PHP 5 & MySQLi

PHP 5 & MySQLi

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>PHP</strong> 5 & <strong>MySQLi</strong><br />

By CS#17 BUU (Z-ONE)


คํานํา<br />

<strong>PHP</strong> ได้รับการเผยแพร่เป็นครังแรกในปี 1994 โดย Rasmus Lerdorf โปรแกรมเมอร์ชาวอเมริกัน โดยได้คิดค้น<br />

สร้างเครื1องมือที1ใช้ในการพัฒนา เว็บส่วนตัวของเขา จนมาถึงปัจจุบันภาษา php เป็นภาษาที1ได้รับความนิยมและใช้งาน<br />

กันอย่างแพร่หลายในการพัฒนาเว็บเพจและเว็บแอพพลิเคชั1น และภาษา php ก็มีการพัฒนามาหลายเวอร์ชัน ซึ1ง php5<br />

ได้เพิ1ม Functions การทํางานในด้านต่าง ๆ เข้ามา เช่น Object Oriented Model , <strong>MySQLi</strong><br />

หนังสือเล่มนีจึงมีเนือหาเกี1ยวกับภาษา php ในระดับเบืองต้นและแบบ Object Oriented ด้วย รวมไปจนถึง<br />

ฟังก์ชั1นการเชื1อมต่อกับฐานข้อมูล แบบ <strong>MySQLi</strong> โดยคณะผู ้จัดทําได้ทําการรวบรวมเนือหามาจาก website ต่างๆ รวมทัง<br />

จากประการณ์ความรู ้ของคณะผู ้จัดทําเองด้วย เราจึงหวังว่าผู ้อ่านจะได้รับความรู ้จากหนังสือเล่มนีและสามารถนําความรู ้<br />

ไปใช้งานได้ไม่มากก็น้อย<br />

คณะผู ้จัดทํา


<strong>PHP</strong>5


Hello world<br />

เริ1มต้นกับตัวอย่างการเขียน <strong>PHP</strong> แบบง่าย ซึ1งพืนฐานการเขียนคือการเริ1มเขียน ตัวอย่าง<br />

Hello, world! ด้วย <strong>PHP</strong> มันเป็นอะไรที1ง่ายมาก แน่นอนว่าคุณจะต้องทําการติดตัง Apache และ <strong>PHP</strong> ก่อนที1จะทําการ<br />

เขียนตัวอย่างนีของ <strong>PHP</strong> หรืออย่างน้อยสามารถเข้าถึงเซิร์ฟเวอร์ที1มีความสามารถของ <strong>PHP</strong><br />

ตัวอย่างต่อไปนี<br />

<br />

output >>><br />


<strong>PHP</strong> tag<br />

ในบทก่อนหน้านี เราใช้วิธีที1พบมากที1สุดและถูกต้องที1สุดของการเริ1มต้น <strong>PHP</strong> block::<br />

<br />

หนึ1งในนีซึ1งเป็นชนิดเดียวกันใช้สําหรับแท็ก เช่น blocks of JavaScript code::<br />

[code here] <br />

สามารถเลือกใช้ได้ทังสองตัวเลือก อย่างไรก็ตาม ส่วนใหญ่แล้ว จะมาจากการติดตังของ <strong>PHP</strong> คือการ ตังค่า อนุญาต<br />

ให้เป็นเวอร์ชันที1สันลง<br />

< [code here] ><br />

หนึ1งในนีซึ1งเป็นชนิดเดียวกัน ที1ใช้สําหรับแท็ก เช่น blocks of JavaScript code::<br />

[code here] <br />

สามารถเลือกใช้ได้ทังสองตัวเลือก อย่างไรก็ตาม ส่วนใหญ่แล้ว จะมาจากการติดตังของ <strong>PHP</strong> คือการ ตังค่า อนุญาตให้<br />

เป็นเวอร์ชั1นที1สันลง<br />

< [code here] ><br />

บนบางเซิฟเวอร์ ASP เป็นลักษณะของ แท็กอีกแบบหนึ1งที1ได้รับการเปิดใช้งาน ตัวอย่างเช่น<br />

<br />

ตังแต่นีไป นี1จะไม่ได้รับการ supported บนเซิฟเวอร์ทังหมด คุณอาจจะต้องการที1ใช้แบบ full version แทน<br />

ต่อไปจะเป็นลักษณะของ output เวอร์ชันพิเศษ<br />

<br />

สุดท้ายเป็นเช่นเดียวกับการเขียน:<br />


In and out of <strong>PHP</strong><br />

เมื1อจะเขียน web pages โดยธรรมชาติแล้ว จะใช้ HTML ในการเขียนทังหมด ถ้าจะทําได้เร็วจะต้องรวม HTML tags<br />

กับ output ที1สร้างจาก <strong>PHP</strong> ซึ1งมันง่ายมาก<br />

<br />

We have HTML all over the place here!<br />

But some <strong>PHP</strong> as well, as you can see:<br />

A message from <strong>PHP</strong>: <br />

Output >><br />

เราสามารถสร้าง string ที1ประกอบไปด้วยสามส่วน เริ1มจาก bold tag, our variable , และ end bold tag จะใช้ จุดเป็น<br />

ตัวดําเนินการ : : ซึ1งจุดจะทําการเชื1อมสตริงใน <strong>PHP</strong> เข้าด้วยกัน<br />

อย่างไรก็ตาม ถ้าคุณเริ1มมีวิธีในการทําของ HTML ที1มาก แต่กับ วิธีการทําของ <strong>PHP</strong> ที1มีน้อย คุณอาจจะทําแบบนีแทน<br />

ได้ :<br />

<br />

We have HTML all over the place here!<br />

But some <strong>PHP</strong> as well, as you can see:<br />

A message from <strong>PHP</strong>: <br />

Output >>


<strong>PHP</strong> ค่อนข้างมีความยืดหยุ ่นมากในพืนที1นีดังตัวอย่างต่อไปนี<br />

<br />

Yes, the number is in fact 42!<br />

<br />

Output >><br />

จากตัวอย่างข้างบน จะเห็นว่า เราสามารถกระโดดออกเข้าไปในตรงกลางของเงื1อนไข ในบล็อคของโค้ดได้ ส่วน<br />

HTML และข้อความเอาท์พุตเฉพาะในกรณีที1 $ MyVar ตังค่าจริงไว้คือ 42


Variables<br />

<strong>PHP</strong> Variable() สําหรับการเขียนโปรแกรมสําหรับภาษาคอมพิวเตอร์ระดับสูง สิ1งที1จะขาดเสียมิได้คือ การ<br />

กําหนดและใช้ตัวแปร (variable) ตัวแปรในภาษา <strong>PHP</strong> จะเหมือนกับในภาษา Perl คือเริ1มต้นด้วยเครื1องหมาย dollar<br />

($) โดยเราไม่จําเป็นต้องกําหนดแบบของข้อมูล (data type) อย่างเจาะจงเหมือนในภาษาซี เพราะว่า ตัวแปลภาษา<br />

จะจําแนกเองโดยอัตโนมัติว่า ตัวแปรดังกล่าว ใช้ข้อมูลแบบใด ในช่วงเวลานันๆ เช่น ข้อความ จํานวนเต็ม จํานวนที1มี<br />

เลขจุดทศนิยม ตรรกะ เป็นต้น<br />

ตัวอย่าง<br />

<br />

ในตัวอย่างต่อไปนีเราจะใช้ echo function ( echo จริงๆสร้างภาษาและฟังก์ชันไม่ได้ แต่ที1ไม่สําคัญในตอนนี ) ซึ1งเรา<br />

จะได้ outputs ออกมา<br />

<br />

ในตัวอย่างนีเราจะใช้ text string แต่เราจะสามารถใช้ตัวเลขลงไปก็ได้ เช่น<br />

<br />

ในอีกทางหนึ1ง ทําไมไม่เพียงใช้สตริงข้อความที1มีจํานวน 42 มันได้หรือไม่ นั1นไม่ใช่ปัญหา ลองวางเครื1องหมายคําพูด<br />

รอบตัวเลขตามในตัวอย่างข้างต้น และคุณจะเห็นว่าคุณได้รับผลลัพธ์เช่นเดียวกันแน่นอน<br />

แต่ในความเป็นจริงมันจะเหมือนกันไหม ไม่ ไม่ใช่อย่างแน่นอน ในขณะที1 <strong>PHP</strong> ไม่อาจดูเหมือนการดูแลภายในของ<br />

การติดตามของชนิดข้อมูลที1คุณใส่ลงในตัวแปรคุณ


if statement<br />

ดังนี<br />

If statements<br />

ฟังฟังก์ชัน if เป็นฟังก์ชันที1สําคัญในเกือบทุกๆภาษาของการเขียนโปรแกรมในที1นี เราจะใช้ตัวอย่างฟังฟังก์ชัน if<br />

30) //ถ ้า number มีค่ามากกว่า 30<br />

if($number < 30) //ถ ้า number มีค่าน ้อยกว่า 30<br />

if($number >= 30) //ถ ้า number มีค่ามากกว่าหรือเท่ากับ 30<br />

if($number


ตัวอย่างที1 1<br />

More if statements<br />

เนื1องจาก if สามารถทําได้หลายทางในการใช้งานซึ1งเป็นสิ1งที1ควรจะเป็นต้องรู ้ดังตัวอย่างต่อไปนี<br />

0)<br />

//นําตัวเลข 10 ใส่เข ้าไปในตัวแปร number<br />

//ถ ้า number มีค่ามากกว่า 0 ให ้ทําบรรทัดต่อไป<br />

if($number


ตัวอย่างที1 4<br />

<br />

echo $output; // แสดงผลลัพธ์จากการที"เติมข ้อความลงไปทางหน ้าจอ


The switch statement<br />

ในฟังฟังก์ชัน switch จะมีความหลากหลายมากกว่าฟังฟังก์ชัน if เพราะมีการกําหนดค่าตัวเลือกเป็นตัวเลขเพื1อทํางานใน<br />

แต่ละเลขที1เราได้กําหนดไปดังตัวอย่างต่อไปนี<br />

ตัวอย่างที1 1<br />


case 5: // ถ ้าตัวเลขที"รับมามีค่าเป็ น 5 ให ้ทําบรรทัดต่อไป<br />

echo "Good choice!";<br />

break;<br />

}<br />

><br />

ตัวอย่างที1 2<br />

$color = "red";<br />

//กําหนดค่า red เข ้าไปในตัวแปร color<br />

switch($color) // นําค่าที"ได ้จาก color มาดูแต่ละ case ที"มีอยู่<br />

{<br />

case "red": // ถ ้าค่าที"ได ้เป็ น red แสดงข ้อความ Nice basic color!<br />

case "blue": // ถ ้าค่าที"ได ้เป็ น blue แสดงข ้อความ Nice basic color!<br />

case "green": // ถ ้าค่าที"ได ้เป็ น green แสดงข ้อความ Nice basic color!<br />

echo "Nice basic color!";<br />

break; // ทําการหยุดไม่ให ้มันไปทํา case อื"นๆ<br />

case "black":<br />

echo "Too dark!"; // ถ ้าค่าที"ได ้เป็ น black แสดงข ้อความ Too dark!<br />

Break; //ทําการหยุดไม่ให ้มันไปทํา case อื"นๆ<br />

case "white": // ถ ้าค่าที"ได ้เป็ น white แสดงข ้อความ Too bright!<br />

echo "Too bright!";<br />

}<br />

break; //ทําการหยุดไม่ให ้มันไปทํา case อื"นๆ


Loops<br />

ภาษาที1ใช้ในการเขียนโปรแกรมไม่ว่าจะเป็นภาษาไหน ความสามารถในการวนลูปทําซํานันถือว่าสําคัญมาก ภาษา <strong>PHP</strong><br />

เป็นภาษาหนึ1งที1มีความสามารถนีและมีอยู ่ 4 รูปแบบด้วยกัน<br />

The while loop<br />

ถือว่าเป็นวิธีที1ง่ายที1สุดจากทังหมด 4 แบบ มีการทํางานอย่างง่ายๆ คือจะวนลูปทําซําไปเรื1อยๆ ตราบเท่าที1เงื1อนใขยังเป็น<br />

จริงอยู ่<br />

ตัวอย่าง<br />

<br />

echo $i."";<br />

$i++;<br />

ผลจากการรันโปรแกรมนีคือ 0 1 2 3 4 คือค่า $i ไม่ได้อยู ่ในเงื1อนไขที1น้อยกว่า 5 อีกต่อไป โดยในแต่ละครังที1มีการทําซํา<br />

จะมีการบวก 1 ไปให้กับค่า $i และเงื1อนไขที1อยู ่ใน while loop ต้องสามารถคิดหาจากวิธี Boolean ได้ว่าจริงหรือเท็จ<br />

The do while loop<br />

ทํางานเหมือน while loop แต่มีสิ1งหนึ1งที1แตกต่างกันคือ while loop เงื1อนไขจะถูกเช็คก่อนที1จะเข้าลูป แต่ do while loop<br />

จะเช็คที1ส่วนท้ายของการทําซํา ซึ1งหมายความว่าการทํางานแบบ do-while loop อย่างน้อยที1สุดจะต้องมีการทํางานซํา 1<br />

ครัง แต่แบบ while loop นัน อาจจะมีบางส่วนของ code ที1ไม่เคยได้มีการเข้าใช้เลยถ้าเงื1อนไขนันไม่เคยเป็นจริง


php<br />

$i = 0;<br />

do<br />

{<br />

echo $i."";<br />

$i++;<br />

} while($i < 0);<br />

><br />

ด้วยวิธี while loop จะไม่มีการทํางานใดๆทังสิน เพราะ $i คือ 0 ที1ซึ1งจะไม่มีค่าไหนที1มีค่าน้อยกว่า 0 แต่ถ้าใช้วิธี do-while<br />

loop จะเกิดการทําซํา ซึ1ง <strong>PHP</strong> จะรู ้ว่าเงื1อนไขนีไม่ได้เป็นจิงและออกจากลูปไป<br />

The for loop<br />

มีความซับซ้อนมากกว่า while loop แต่ถ้าเราทําความเข้าใจกับการทํางานของ for loop มากขึน เราก็เห็นว่ามันดีกว่า<br />

ตัวอย่าง<br />

<br />

ตัวอย่างนีจะให้ผลลัพธ์เหมือนตัวอย่างก่อนหน้า แต่จะเห็นได้ว่ามีจํานวนของบรรทัดน้อยกว่า ตัวแปรที1เป็นตัวนับนันจะ<br />

เริ1มต้น ทดสอบและเพิ1มค่าในบรรทัดเดียวกัน<br />

โดยเราจะเริ1มจากการประกาศตัวแปรและกําหนดค่าให้ จากนันเขียนเงื1อนไขมาคํานวณ และเพิ1มค่า(หรือลดค่า) ตัวแปร<br />

แต่ละส่วนแยกจากกันโดย ;(semicolon) The for loop นันจะมีความกระชับและเหมาะสําหรับทุกๆ สถานการณ์ที1ต้องการ<br />

ที1จะมีตัวนับในการทําซํา


The foreach loop<br />

Foreach loop ใน <strong>PHP</strong> ทํางานด้วย array <strong>PHP</strong> จะ error เมื1อพยายามจะใช้ตัวแปรที1ไม่บรรจุ array The foreach loop มี<br />

ความแตกต่างกัน 2 แบบ<br />

ตัวอย่าง (แบบที1 1)<br />

<br />

คุณสมบัติที1ดีของ foreach loop คือ ถูกออกแบบให้สามารถทํางานได้กับ array เท่านันซึ1งส่งผลให้การทํางานของ<br />

ทัง process ง่ายขึน ในแต่ละการทําซํานัน $animal ถูกกําหนดให้เป็นที1สําหรับ array ปัจจุบัน ทําให้สามารถเข้าถึงได้ง่าย<br />

ขึน จากตัวอย่างที1ให้มา output จะเป็น list ของ animals<br />

จากตัวอย่างก่อนหน้าเราจะสามารถเข้าได้ถึงค่าของลูป ตัวอย่างต่อไปเราจะให้ <strong>PHP</strong> กําหนดค่าโดยอัตโนมัติโดยการที1จะ<br />

ไม่กําหนดไว้แต่ทีแรก ในกรณีที1ต้องการเข้าถึงค่าของ key ปัจจุบันแนะนําให้ใช้แบบที1 2<br />

ตัวอย่าง (แบบที1 2)<br />

"Dog", "Cat", "Snake",<br />

"Tiger");<br />

foreach($animals as $key => $value)<br />

><br />

echo "Animal number " . $key . " is a " . $value . "";


Including files<br />

หนึ1งในคุณสมบัติที1เป็นที1นิยมใน <strong>PHP</strong> ก็คือความสามารถในการ include file ซึ1งทําให้สามารถที1จะแบ่ง code ไว้<br />

ในหลายๆไฟล์ได้ และยังนํามาใช้ได้ในหลายๆ ที1ด้วย เช่น เขียนรวบรวมฟังก์ชันที1ใช้งานบ่อยๆไว้ที1ไฟล์อันหนึ1ง โดยเมื1อ<br />

ต้องการจะใช้ ก็สามารถ include file นันเข้ามาได้ ลองดูตัวอย่างได้จากข้างล่างนี<br />

ข ้างใต ้นี3 เป็ นการแสดงคําสั"งของการ include file!<br />

<br />

<br />

<br />

ทําการ include file เรียบร ้อยแล ้ว!<br />

จากตัวอย่าง มีการ include file ชื1อ includedfile.php ซึ1งเป็นไฟล์อีกไฟล์หนึ1งที1อยู ่ในไดเรกทอรี1เดียวกัน ซึ1งไฟล์<br />

includedfile.php ก็จะอาจจะมีเนือหาดังตัวอย่างข้างล่าง<br />

นี"คือ code ใน includedfile.php<br />

<br />

สังเกตว่าการ include file นันทําได้ง่ายมาก ซึ1งเป็นเพียงแค่การนําไฟล์อื1นๆมาเป็นส่วนหนึ1งของไฟล์ที1ต้องการเท่านัน


ต่อไปจะทําการยกตัวอย่างการใช้ include ในงานจริง โดยตัวอย่างนี เป็นการเลือก include files ตามค่าที1รับมาโดยการใช้<br />

switch case ในการเลือก include file<br />

<br />

<br />

<br />

<br />

<br />

My website<br />

<br />

This part of the website is static. Dynamic content below!<br />

<br />


else<br />

include("subpage_index.php");><br />

<br />

<br />

หรือ อาจจะใช้การ include files ในการนําเข้าส่วนบนและส่วนล่างของเพจ เพื1อให้มีลักษณะเหมือนกันทุกหน้าก็ได้เช่นกัน<br />

ดังตัวอย่างข้างล่าง<br />

<br />

The actual content of the page goes here!<br />

<br />

จะเห็นว่าการ include นัน สามารถใช้ได้หลากหลาย และช่วยในการประหยัดเวลาในการสร้างงานด้วย ขอให้ผู ้ใช้นําไปใช้<br />

งานได้อย่างเชี1ยวชาญ จะทําให้งานมีประสิทธิภาพขึนเยอะ


Function<br />

ในภาษา <strong>PHP</strong> หรือภาษาเขียนโปรแกรมอื1นๆนัน สามารถสร้างกลุ ่มของโค้ดที1เรียกว่า ฟังก์ชัน เก็บไว้ได้ เพื1อให้ส่วนอื1น<br />

ของโปรแกรมสามารถเรียกใช้ได้ ซึ1งช่วยให้ไม่จําเป็นต้องเขียนโค้ดนันซําแล้วซําอีก ในกรณีที1ต้องการเขียนโค้ดที1ทํางาน<br />

แบบเดียวกัน ดังนันเมื1อเราสร้างฟังก์ชันแล้ว ส่วนต่างๆของโปรแกรมนันจะสามารถเรียกฟังก์ชันนีมาทํางานเมื1อไหร่ก็ได้ที1<br />

ต้องการ<br />

ตัวอย่างการเขียนฟังก์ชันใน <strong>PHP</strong><br />

<br />

การเขียนฟังก์ชันเราจะเริ1มต้นด้วย keyword คือ “function” และตามด้วยชื1อฟังก์ชัน จากตัวอย่างชื1อฟังก์ชันคือ<br />

SayHello และจะต้องตามด้วยวงเล็บซึ1งเป็นที1กําหนดพารามิเตอร์หรือค่าที1ถูกส่งมาจากผู ้เรียกใช้ฟังก์ชัน ซึ1งตัวแปรที1<br />

กําหนดเป็นพารามิเตอร์ไม่จําเป็นต้องกําหนดชนิดข้อมูล เพราะตัวแปรในภาษา <strong>PHP</strong> จะเป็นข้อมูลชนิดใดก็ได้ และไม่<br />

จําเป็นต้องกําหนดพารามิเตอร์เสมอไปหากการทํางานนันไม่จําเป็นต้องรับค่าใดๆ และที1สําคัญ โค้ดของฟังก์ชันนันจะ<br />

ต้องอยู ่ภายใต้เครื1องหมายปีกกา<br />

ตัวอย่าง การเรียกใช้ฟังก์ชันในการแสดงข้อความทักทายชื1อคนหรือสิ1งของที1ส่งผ่านพารามิเตอร์ $to<br />


การประกาศฟังก์ชันนันจะเป็นแบบ global แต่ตัวแปรที1อยู ่ภายในฟังก์ชันจะไม่เป็น global และในขณะเดียวกัน<br />

ตัวแปรที1อยู ่ภายนอกฟังก์ชันก็จะไม่มีผลการทํางานภายในฟังก์ชันเช่นกัน ศึกษาจากตัวอย่างต่อไปนี<br />

<br />

จากตัวอย่าง ผลลัพธ์ที1 1 ตัวแปร $var นันจะไม่มีค่าอะไรเลย นอกจากจะประกาศตัวแปรไว้ในฟังก์ชัน และผลลัพธ์ที1<br />

2 จะได้เป็นค่า “test” ตามที1ประกาศไว้ในบรรทัดแรก แต่เรามีวิธีที1ทําให้ตัวแปรในฟังก์ชันสามารถเรียกใช้ตัวแปร<br />

ภายนอกฟังก์ชันได้โดยการ ใส่ global ก่อนชื1อตัวแปรภายในฟังก์ชัน ตามตัวอย่างต่อไปนี<br />


การกําหนดพารามิเตอร์สามารถมีได้หลายตัวและอาจกําหนดค่าดีฟอลต์ของมันได้ ศึกษาจากตัวอย่างต่อไปนี<br />

<br />

จะเห็นว่าการเรียกใช้ฟังก์ชันไม่จําเป็นต้องใช้พารามิเตอร์ทุกตัว ซึ1งในกรณี 1 ค่า $msg จะมีค่าอยู ่ในตัวมันเองนั1นคือ<br />

“Hello, coder!” ส่วนในกรณีที1 2 ค่า $msg จะมีค่าตามที1เราเรียก


Introduction<br />

<strong>PHP</strong> เป็นภาษาที1ไม่เคร่งครัด ไม่จําเป็นต้องบอกตัวแปรภาษา ตัวแปรบางประเภทเพียงแค่กําหนดค่าให้มัน<br />

<strong>PHP</strong> จะทราบว่าต้องเก็บเป็นประเภทใด เราไม่ต้องสนใจเกี1ยวกับประเภทตัวแปร แต่จะมีหลายสถานการณ์ที1ควบคุมชนิด<br />

ของตัวแปร ดังนัน <strong>PHP</strong> ไม่เปิดเผยการทํางานในการตรวจสอบและการจัดการกับประเภทตัวแปร ข้อมูลเกี1ยวกับประเภท<br />

ต่างๆใน <strong>PHP</strong><br />

<strong>PHP</strong> ประกอบด้วย ชนิดข้อมูลพืนฐาน 4 ชนิด :<br />

boolean - เหมือนจํานวนเต็ม แต่มีค่าที1เป็นไปได้ คือ 0 หรือ 1, เป็นเท็จ(false) หรือ จริง(true)<br />

integer - จํานวนเต็มที1ไม่เป็นทศนิยม<br />

float (บางครังเรียกว่า double) - เป็นตัวเลขที1เป็นทศนิยม<br />

string - สายอักขระที1รวมกันเป็นข้อความ<br />

นอกจากนียังมี 2 ชนิดข้อมูลที1มีความซับซ้อน :<br />

Array - เก็บอาเรย์ของรายการ เช่น หลาย string หลาย integer เก็บข้อมูลเป็นชุด เป็นแถว หรือกลุ ่มของข้อมูล<br />

Object - อ้างอิงถึง instance ของ class จะเกี1ยวข้องกับ Object Oriented programming<br />

นอกจากนียังมี 2 ชนิดพิเศษ:<br />

Resource - อ้างอิงถึงแหล่งที1มาจากภายนอก อาจจะเป็นแหล่งที1มาจาก file หรืออาจเชื1อมต่อกับฐานข้อมูล<br />

NULL - ค่าของ null คือ ไม่มีอะไร (ไม่เหมือน 0 (ศูนย์) เพราะศูนย์เป็นค่าจริง) ตัวแปรที1ยังไม่ได้กําหนดค่าหรือ<br />

ที1ไม่ได้ set ค่า จะเปรียบว่าเป็นค่า NULL


Working with numbers<br />

การทํางานของตัวแปลใน Php นันไม่ต้องประกาศชนิดตัวแปล เราสามารถดําเนินงานจํานวนจริงในงานของเราได้เลย<br />

ตัวอย่าง<br />

<br />

Output >><br />

Value num1 = 10<br />

Value num2 = 3<br />

Addition: 10 + 3 = 13<br />

Substraction: 10 - 3 = 7<br />

Multiplication: 10 x 3 = 30<br />

Division: 10 / 3 = 3.3333333333333<br />

Mod: 10 % 3 = 1<br />

อธิบายส่วนของโปรแกรม<br />

เป็นการบอกว่าให้ เว้น 1 บรรทัดที1ใช้ใน html<br />

' . ' หรือ dot เป็นการเชื1อมสายอักขระ<br />

ดังนันเราสามารถเขียนได้ว่า<br />

echo "Value num1 = $num1 ".""."Value num2 = $num2 "."".“ สายอักขระที1ต้องการต่อ”. …......;<br />

เราจะเห็นได้ว่า จะทําเราอ่านโค้ดได้ยาก เพื1อให้ง่ายต่อการอ่านโค้ดที1เราจริงต้องจัดรูปให้เหมาะสม เพื1อ<br />

ความเข้าใจในการอ่านโค้ดที1เราต้องการสื1อกับมนุษย์ด้วยกัน


Working with strings<br />

สตริงเป็นชุดของตัวอักษร ใน <strong>PHP</strong> คุณอาจพิจารณาให้เป็นอาร์เรย์ของตัวอักษรเพราะคุณอาจเข้าถึงตัวอักษรบางในสตริง<br />

ขึนอยู ่กับดัชนี zero-based ของมันเช่นเดียวกับอาร์เรย์ ในบทของการกวดวิชานี เราจะทํางานบิตกับสตริงในหลายวิธีที1จะ<br />

แสดงให้คุณเห็นความเป็นไปได้<br />

การกําหนดสตริง<br />

กําหนดสตริงใน <strong>PHP</strong> เป็นเรื1องง่าย เพียงตัดชินส่วนของข้อความที1มีคําพูดเดียวหรือสองอย่างใดอย่างหนึ1ง และคุณมีสตริง<br />

ดังตัวอย่างนี<br />

<br />

หรือคุณสามารถใช้สตริงโดยตรงสําหรับการส่งออกโดยไม่ต้องกําหนดเป็นตัวแปรแรก :<br />

<br />

ตามที1ระบุไว้ คุณสามารถใช้คําพูดเดียวได้เช่นกัน<br />

<br />

ที1จริงมีความแตกต่างระหว่างการใช้สตริงที1ยกมาเดี1ยวและประเภทคู ่เป็น สตริงที1ยกมาคู ่จะแยกโดย <strong>PHP</strong> สําหรับตัวแปร<br />

และลําดับหนีพิเศษ ช่วยให้คุณสามารถใช้ตัวแปรภายในของสตริงตัวเองมัน ลองใช้ตัวอย่างนี :<br />


คุณจะเห็นจากผลลัพธ์ บรรทัดแรกออกค่าของตัวแปรในขณะที1หนึ1งที1สองก็ออกมาราวกับว่ามันเป็นเพียงชินส่วนของ<br />

ข้อความอื1น คุณอาจต้องการใช้คุณลักษณะของสตริงที1ยกมาสองครังนีหรือคุณอาจจะใช้การเรียงต่อกันตามที1อธิบายใน<br />

ส่วนถัดไป หลังนําเสนอประสิทธิภาพที1ดีขึนและบางคนเชื1อว่ามันจะเป็นรหัส prettier<br />

\ ในสตริง<br />

ดังนันสิ1งที1คุณทําเมื1อคุณต้องการใช้อ้างเตียงภายในของสตริงที1ยกมาสองครัง คุณหนีมันใช้ตัวอักษรทับขวาเช่นนี<br />

<br />

แต่ เมื1อไหร่คุณต้องการใช้ \ ตัวอักษร ในกรณีของ string ใช้ \ เมื1อคุณต้องการที1จะตัดออก อย่างเช่น :<br />

<br />

สตริงเชื 'อมโยง<br />

วิธีการรวบกันของ 2 วิธีหรือ การเชื1อมต่อกันของ string หลายตัว ใน php สามารถใช้ตัวเชื1อมโยง ได้ เช่นนี<br />

<br />

หากคุณมีมากกว่า 2 string และ คุณสามารถรวมตัวแปลเป็นข้อความที1ยกมาได้เช่นนีพวกเราสามารถรวมชื1อและ<br />

นามสกุลของบุคคล และใส่ ในระหว่าง “ ” :<br />

<br />

ในบทถัดไป พวกจะเราสามารถทํางานได้มากกว่า string


More Strings<br />

<strong>PHP</strong> มีเซตของฟังก์ชันที1ใหญ่ สําหรับการทํางานกับ string ซึ1งเกินขอบเขตของบทเรียนในการบรรยายทังหมด แต่ในบทนี<br />

เราจะมีการดูที1บางส่วนของฟังก์ชันที1มีประโยชน์มากขึนที1เกี1ยวข้องกับสตริง<br />

ความยาวของสตริง<br />

ในบางกรณี มันจะเป็นประโยชน์มากหากทราบความยาวที1แน่นอนของสตริง นั1นคือจะประกอบด้วยจํานวน<br />

อักขระ รวมทังพืนที1คุณอาจจะใช้ฟังก์ชัน strlen สําหรับจุดประสงค์นีตามที1มีภาพประกอบในตัวอย่างนีฟังฟังก์ชันจะใช้<br />

เวลาเพียงหนึ1งพารามิเตอร์ และนั1นเป็นตัวแปรสตริงที1จะใช้วัด<br />

<br />

ตัวอักษรพิมพ์เล็กและตัวพิมพ์ใหญ่<br />

บางครังคุณอาจจําเป็นต้องแปลงสตริงของคุณไปทังสตริงตัวพิมพ์ใหญ่หรือสตริงตัวพิมพ์เล็ก ซึ1งทําได้ง่ายมาก<br />

<br />

ในฟังฟังก์ชันแรกจะคืนค่าตัว string ตัวอักษรพิมพ์เล็กทังหมด ในขณะที1ฟังก์ชันที1สองจะคืนค่าตัวอักษรพิมพ์ใหญ่ เราจะ<br />

ส่งผลออกมาได้ทันที


ค้นหาส่วนของ string<br />

ถ้าคุณต้องการหาตําแหน่งของส่วนของสตริง ภายในสตริงที1มีขนาดใหญ่ คุณอาจใช้ฟังก์ชัน strpos() นี <br />

<br />

ต้องระวังในบางกรณีเป็นพิเศษ หรือในคําที1ต่างๆกัน "world" และ "WORLD" ไม่เหมือนกัน หากคุณต้องการที1จะมองหา<br />

ส่วนหนึ1งของสตริงและกรณีที1ไม่ควรเกิดขึน ใช้กรณีพิเศษแทนฟังฟังก์ชัน เรียกว่า stripos(). เราจะใช้เพียงสอง<br />

พารามิเตอร์ช่วยให้คุณสามารถที1จะบอกได้ว่าเริ1มการค้นหา <strong>PHP</strong> ตรงไหน มันไม่ได้เกี1ยวข้องกับการยกตัวอย่างที1ว่านี<br />

เรียกส่วนหนึ 'งของ string<br />

ในตัวอย่างสุดท้าย เราจะหาส่วนหนึ1งของ string อย่างไรก็ตาม คุณต้องได้รับส่วนหนึ1งของสตริงที1เกิดขึนจริงและ<br />

ใช้งานอย่างอื1นได้ ฟังฟังก์ชัน substr() สามารถช่วยคุณทําในสิ1งนันได้ และในตัวอย่างถัดไป เราจะใช้มันพร้อมกับสอง<br />

การทํางานของฟังก์ชันที1เราได้กล่าวมาแล้ว<br />

<br />

ตัวอย่างอาจจะดูไม่มีประโยชน์มากในตอนนีและเราจะทํามันเป็นบิตที1ยากสําหรับตัวเราเอง โดยการวัดความยาวของ<br />

สตริงที1เรานับในครังที1สองและใช้เพียงตัวเลขจริงแต่จะแสดงวิธีที1คุณสามารถใช้ฟังก์ชันสตริงในการรวมกันเพื1อให้ได้ผลใน<br />

สิ1งที1อาจเป็นประโยชน์ในสถานการณ์ที1ค่อนข้างซับซ้อนมากขึน<br />

มีฟังก์ชันอื1นๆอีกมากมายที1เกี1ยวข้องกับสตริงนีแต่ถึงมีมากก็อาจมีประโยชน์เฉพาะบางกรณี คุณสามารถลองดู<br />

ได้ที1คู ่มือ <strong>PHP</strong> ถ้าคุณต้องการทราบข้อมูลเพิ1มเติม


Working with arrays<br />

การทํางานให้เป็นระบบโดยใช้อาเรย์<br />

รายการโครงสร้างของสิ1งต่างๆมีประโยชน์สําหรับการจัดทําโปรแกรม. คุณสามารถแยกกลุ ่มสิ1งของมากมายที1<br />

แตกต่างกัน เช่น ภาษาของโปรแกรมภาษาต่างๆมากมาย รายละเอียดความแตกต่าง อย่างไรก็ตาม ภาษา php คุณ<br />

สามารถจัดลําดับของมันได้ เป็นความโชคดีภาษามาพร้อมกันการจัดลําดับของความเกี1ยวข้องหน้าที1ต่างๆ ของฟังก์ชัน<br />

เพื1อที1จะอนุญาติให้คุณใช้มันให้ทุกชนิดของวิถีทาง<br />

เป็นความธรรมดาแบบง่ายๆมันก็เหมือนรายการทั1วๆไป ซึ1งการเข้าถึงข้อมูลจะต้องมีคุณสมบัติสองอย่าง ถ้าคุณ<br />

มี key คุณจะสามารถเข้าไปถึงค่าของชนิดนันได้โดยตรง มิฉะนันคุณจะต้องมองหามัน นันหมายถึงดูเหมือนว่าจะทําให้<br />

เกิดความยุ ่งยากในเบืองต้นเล็กน้อย แต่ครังหนึ1งคุณจะต้องติดอยู ่กับมัน คุณจะต้องจัดลําดับให้มันเป็นจริงและเป็นสิ1ง<br />

ง่ายๆที1จะต้องทํามัน<br />

คุณสามารถที1จะจัดระเบียบกับมันโดยใช้ array โดยเป็นการจัดลําดับ :<br />

<br />

ถ้าคุณมีความประสงค์และปรารถนาสิ1งของใหม่ๆที1จัดระเบียบตามพารามิเตอร์(ชนิดของสิ1งเหล่านัน) ก็เหมือนดังที1ด้าน<br />

ล่างได้กล่าวได้ :<br />

<br />

ในตัวอย่างนี เราสามารถเจาะจงค่าของมันได้เท่านัน ถ้าในกรณีที1key สามารถนับเป็นตัวเลขจํานวนค่าได้ หมายความว่า<br />

เริ1มต้นที1 0 ค่าอันแรกของมันจะให้ key มีค่า = 0 และต่อไปสิ1งที1จะทําให้ key มีค่า = 1 และทําต่อไปเรื1อยๆ ในการเข้าถึง<br />

ค่าเหล่านีคุณสามารถทํากับมันเป็นจํานวนได้ ดังนี:<br />


คุณสามารถเจาะจง key ให้ในอยู ่กลุ ่มของประเภทของวงเล็บ ในกรณีนีคุณสามารถที1จะเริ1มต้นที1ไหนก็ได้ ด้วย 0<br />

ถ้าเริ1มต้นที1 (key แรก) = 0 ได้ มันจะทําให้สําเร็จได้โดยง่าย โดยที1เราตังค่า key ไว้ก่อน :<br />

"Monkey", "Lion", "Turtle", "Horse");<br />

echo $animals[2];<br />

><br />

การเริ1มนับจํานวนแทนที1ด้วย 2 คุณก็สามารถที1จะให้จํานวนสิ1งของทังหมดด้วยตัวคุณเอง ราวๆกับว่า key นันเปรียบ<br />

เสมือนเป็นหนึ1งเดียว บางกรณีชื1อของ key อาจจะทําให้มีความรู ้สึกนึกคิดมากขึนก็ไม่ใช่ปัญหา :<br />

45, "Jane Doe" => 33, "Dog Doe" => 11);<br />

echo "The age of Jane Doe: " . $namesAndAges["Jane Doe"];<br />

><br />

เราก็สามารถ => ตังผู ้กระทําที1จะมอบหมายอายุของชื1อ หรือ ในคําอื1นๆ ค่าของ key ในบางกรณีคุณสามารถที1จะเพิ1มเติม<br />

ทีหลังได้ แทนที1จะกระทํากับ array ดังตัวอย่าง :<br />

<br />

ถ้าคุณมีกลุ ่ม set ของวงเล็บที1ว่างๆ สามารถสร้าง php แต่อย่างเห็นได้ชัด คุณสามารถให้เทคนิคจากด้านบนเมื1อเติม<br />

เข้าไปในการจัดลําดับของ array :


การจัดเรียงลําดับของ array ที 'มีขนาดมากมาย<br />

การจัดลําดับตามตัวอย่างด้านบนมีสิ1งหนึ1งที1มัน เป็นมิติเดียว มันประกอบไปด้วยค่าธรรมดา แต่อะไรที1คุณ<br />

ต้องการที1จัดลําดับจะต้องคงค่าระหว่างของ array ไว้ ทังนีทังนันก็ไม่มีปัญหา ในความจริงแล้ว php ยอมให้เราไม่จํากัด<br />

เรื1องมิติของการจัดลําดับของ array คุณสามารถที1จะจัดลําดับค่าระหว่างของการจัดลําดับได้ ดังตัวอย่างด้านล่าง<br />

$value)<br />

{<br />

}<br />

><br />

echo "" . $categoryName . ":";<br />

foreach($contacts[$categoryName] as $name)<br />

{<br />

}<br />

echo $name . "";<br />

echo "";<br />

ดังนันไปดูตัวอย่างที1มันซับซ้อนยุ ่งยากมากกว่านีเราเริ1มที1จะสร้างมันโดยติดต่อจากการจัดลําดับที1ว่างเปล่า เรา<br />

ต้องการที1จะเก็บชื1อของบุคคลที1เราต้องการติดต่อ การจัดลําดับแรกจะต้องดําเนินการในความแตกต่างของชื1อกลุ ่ม ผู ้ที1ซึ1ง<br />

อยู ่ในกลุ ่มนัน เราก็สามารถที1จะจัดให้ชื1อของกลุ ่มและบุคคลที1ติดต่ออยู ่อิสระ เป็นการกระทําใหม่ๆในการจัดคู ่ของบุคคลที1<br />

ติดต่อ ถ้าผลลัพธ์ที1ดีเราสามารถการวนลูป 2 ลูป โดยลูปแรก จะให้อ่านทํางานได้ตลอดของกลุ ่ม และ ลูปด้านในจะทํางาน<br />

ผ่านด้านบุคคล ในทํานองเดียวกันเมื1อคุณได้เห็นและได้ทดสอบในเอกสารนีแล้ว มันก็จะทําให้แบ่งในกลุ ่มได้


More arrays<br />

ในบทที1ผ่านมา เราได้กล่าวถึงวิธีการในการสร้าง array และการใส่คีย์และค่าลงไปใน array ในบทนี เราจะเรียนรู ้ถึง<br />

ฟังก์ชันบางฟังก์ชันที1จะทําให้การดําเนินการเกี1ยวกับ array ง่ายขึน<br />

Implode and explode<br />

เป็นฟังก์ชันช่วยให้เราสามารถแยกอาร์เรย์ออกจากสตริง ตัวอย่างการใช้ของทังสองฟังก์ชัน<br />

<br />

อันดับแรก เราจะกําหนดสตริงเป็นเซตของชื1อสัตว์ เราจะแยกมันออกจากกันด้วยเครื1องหมาย ” | ” เราใช้ฟังก์ชัน<br />

explode() สําหรับแยกสตริงที1มีอยู ่ให้เป็นอาร์เรย์ เมื1อพบเครื1องหมาย “ | ” ค่าต่อไปจะถูกเพิ1มเข้าเป็นค่าใหม่ไปยังอาร์เรย์<br />

เราใช้ฟังก์ชัน print_r() เพื1อทดสอบ output ของอาร์เรย์ที1ได้เพื1อดูว่ามันใช้งานได้จริง ต่อมาเราใช้ฟังก์ชัน implode() เพื1อ<br />

รวม element ที1เรากําหนดเข้าไปรวมกับอาร์เรย์ ในที1นี เราใช้ element “and ”<br />

เป็ นค่าในอาร์เรย์หรือไม่<br />

เราจะใช้ฟังก์ชัน in_array() สําหรับทดสอบว่าค่าที1เรามีอยู ่อยู ่ในอาร์เรย์หรือไม่ ดังตัวอย่างต่อไปนี<br />

<br />

echo "Snake is in the array!";<br />

echo "No snake in the array!";


ค่าที 'ไม่ซํ9า<br />

ในบางครังเราดึงข้อมูลมาจากภายนอก อย่างเช่น ในฐานข้อมูลหรือในไฟล์ อาจมีข้อมูลที1ซํ ากันเกิดขึน เราสามารถ<br />

ใช้ฟังก์ชัน array_unique() โดยเมื1อใช้ฟังก์ชันนี จะได้ค่าอาร์เรย์ที1ไม่ซํ ากันออกมา ดังตัวอย่าง<br />

<br />

การ random เลือกค่าจากอาร์เรย์<br />

เราใช้ฟังก์ชัน array_rand() เป็นฟังก์ชันที1ใช้สุ ่มเลือกค่าในอาร์เรย์ ออกมา โดยมีวิธีการใช้ดังนี<br />

array_rand(,) โดยที1 = ตัวแปร array ที1จัดเก็บค่า และ<br />

= จํานวนค่าที1จะสุ ่มเลือกมาต่อครัง ตัวอย่างการใช้<br />

<br />

โดยจากตัวอย่างข้างต้น เราสุ ่มค่าจากอาร์เรย์ $animal โดยกําหนดให้สุ ่มเลือกค่าทีละค่า


การเรียงลําดับอาร์เรย์<br />

เราใช้ฟังก์ชัน sort() เพื1อเรียงลําดับค่าในอาร์เรย์ และเมื1อใช้ฟังก์ชัน array_reverse() ค่าของอาร์เรย์ก็จะกลับมาเหมือน<br />

ก่อนเข้าฟังก์ชัน sort()<br />


Introduction to <strong>PHP</strong> classes<br />

ในขณะที1 classes และแนวคิดทังหมดของการเขียนโปรแกรมเชิงวัตถุ (OOP) เป็นพืนฐานของการเขียนโปรแกรม<br />

ภาษาที1ทันสมัย <strong>PHP</strong> เป็นการถูกสร้างขึนบนหลักการของการแทนที1การทํางาน การสนับสนุนขันพืนฐานสําหรับ classes<br />

นัน เป็นขันแรกในทังหมด 4 ขันของ <strong>PHP</strong> แต่แล้วก็มีการเขียนขึนอีกครังสําหรับขันที1 5 เพื1อการสนับสนุน OOP ที1สมบูรณ์<br />

มากยิ1งขึน วันนี<strong>PHP</strong> เป็นที1แน่นอนที1จะใช้เพื1อทํางานร่วมกับ classes ในขณะที1 <strong>PHP</strong> library ส่วนใหญ่ยังคงประกอบ<br />

ด้วยฟังฟังก์ชัน class ตอนนีถูกเพิ1มเข้ามาเพื1อวัตถุประสงค์ต่างๆ แต่อย่างไรก็ตามวัตถุประสงค์หลักคือการเรียนเพื1อการ<br />

เขียนและการใช้ classes ซึ1งเป็นสิ1งที1เราจะศึกษาในบทต่อไป<br />

Classes ถือได้ว่าเป็นที1เก็บรวบรวมชุดของกระบวนการ ตัวแปร และค่าคงที1 บ่อยครังที1มักจะสะท้อนสิ1งที1เป็น<br />

ความจริง เช่นเดียวกับ กลุ ่มของรถหรือกลุ ่มของผลไม้ คุณสามารถประกาศ class เพียงครังเดียวได้ แต่คุณสามารถยก<br />

ตัวอย่าง ได้หลายรูปแบบของมันที1สามารถบรรจุอยู ่ในหน่วยความจํา ตัวอย่างของ class มักจะเรียกว่าเป็นวัตถุ(Object)<br />

หากคุณยังคงสับสนอยู ่เล็กน้อยเกี ยวกับ คลาสคืออะไร และทําไมคุณจําเป็ นต้องใช้สิงนั &น<br />

ไม่ต้องกังวล ในบทต่อไปเราจะเขียน class เบื &องต้น และใช้มัน<br />

หวังว่าจะให้คุณมีแนวคิดที ดีขึ&นของแนวคิดทั &งหมด


Defining and using a class<br />

หลังจากการแนะนําเรื1อง Class ในบทก่อน เราก็พร้อมที1จะเขียนเรื1อง Class เพิ1มมากขึน ซึ1งถ้าเราจะเก็บข้อมูลเกี1ยวกับผู ้<br />

ใช้ทั1วไป ตัวอย่างเช่น เก็บข้อมูลของผู ้ใช้บนเว็บไซต์ของคุณ<br />

การนิยาม Class ใน <strong>PHP</strong> มีลักษณะสวยงามมาก เช่น การประกาศฟังก์ชัน แต่แทนที1จะใช้ฟังก์ชัน keyword เรา<br />

ก็จะใช้ class keyword เริ1มต้นการใช้ class ของผู ้ใช้<br />

<<br />

class User<br />

{<br />

}<br />

><br />

นี1เป็นตัวอย่างที1ง่ายและคุณสามารถที1จะจินตนาการได้เอง และจากภาพ class นียังไม่สามารถทําอะไรได้ แต่เราสามารถ<br />

ที1จะกําหนดค่าที1จะทําให้เป็น keyword ใหม่ได้ :<br />

$user = new User ();<br />

เนื1องจาก Class ไม่สามารถทําอะไรได้ จึงทําให้ $user ก็เลยใช้งานไม่ได้ เราจึงแก้ไขโดยการเพิ1มตัวแปรลงไปทังใน class<br />

และ method จะได้ดังภาพ :<br />

class User<br />

{<br />

public $name;<br />

public $age;<br />

public function Describe()<br />

{<br />

return $this->name . " is " . $this->age . " years old";<br />

}<br />

}


ตอนนี เรามีตัวแปร 2 ตัวแล้ว ตอนแรกเลยเราก็จะประกาศตัวแปรทังสอง ซึ1งเป็นของชื1อ ( $name ) และ อายุ ( $age ) ซึ1ง<br />

ชื1อตัวแปรมีคํานําหน้าโดยการเข้าถึง " public " โดยทั1วไปแล้วจะหมายถึงว่าตัวแปรที1สามารถเข้าถึงได้จากข้างนอก<br />

Class ซึ1งเราจะมีการเข้าถึงมากขึนจะอยู ่ในบทถัดไป<br />

ต่อไปเราจะกําหนดฟังก์ชัน Describe() คุณสามารถมองเห็นได้ว่ามันเป็นการประกาศฟังก์ชันปกติ แต่มันจะมีสองตัวที1<br />

เป็นตัวยกเว้น ก็คือการที1มี public อยู ่ข้างหน้ามัน เพื1อระบุการเข้าถึง ซึ1งภายฟังก์ชันเราสามารถใช้ ตัวแปร "$ this" ใน<br />

การเข้าถึงตัวแปรของคลาสตนเองได้ ซึ1ง $ this เป็นตัวแปรพิเศษใน <strong>PHP</strong> ซึ1งสามารถใช้ได้ภายในฟังก์ชัน<br />

Class และ object อื1นๆ ที1นํามาใช้งาน<br />

ตอนนี เราก็ใช้คลาสใหม่<br />

$user = new User();<br />

$user->name = "John Doe";<br />

$user->age = 42;<br />

echo $user->Describe();<br />

สิ1งแรกที1ควรจะสังเกตเห็น คือการใช้ตัวดําเนินการ “ - > ” เราจะใช้ใน method Describe() เช่นเดียวกันและ จากตัวอย่าง<br />

หมายถึงว่าเราต้องการที1จะเข้าถึงบางสิ1งบางอย่างจาก object ที1ใช้ก่อนตัวดําเนินการ $user - > name เป็นเช่นเดียวกับ<br />

พูดว่า “ ให้ name เป็นตัวแปรบน object $user ” หลังจากนันก็เช่นเดียวกับการกําหนดค่าให้กับตัวแปรปกติ ที1เราทํา<br />

สองครังสําหรับชื1อและอายุของ object user ในบรรทัดสุดท้ายที1เราเรียกใช้ method Describe() ของ object user ที1ผู ้ใช้<br />

จะส่งกลับสตริงของข้อมูล ซึ1งเราสามารถ echo ออกมา ได้ดังนี John Doe is 42 years old


Constructors and Destructors<br />

Constructors<br />

Constructor และ Destructor เป็นฟังก์ชันพิเศษ ซึ1งจะถูกเรียกใช้อัตโนมัติ เมื1อสร้างและทําลายอ็อบเจ็ค<br />

Constructor ถูกใช้มากที1สุด เพราะ constructor ช่วยให้คุณส่งพารามิเตอร์ไป เมื1อมีการสร้างอ็อบเจ็คใหม่ ซึ1งจากนันจะ<br />

สามารถใช้ตัวแปรเริ1มต้นในอ็อบเจ็ค นี1คือตัวอย่างของ class ที1ใช่ constructor แบบง่ายๆ<br />

class Animal<br />

{<br />

public $name = "No-name animal";<br />

public function __construct()<br />

{<br />

echo "I'm alive!";<br />

}<br />

}<br />

Constructor มีลักษณะแบบเดียวกับฟังก์ชันปกติ ยกเว้นความจริงที1ว่ามันเริ1มต้นด้วย underscores สองตัว "__"<br />

ใน <strong>PHP</strong> ฟังก์ชันที1ขึนด้วย underscores สองตัวก่อนชื1อ มักจะเป็นฟังก์ชันที1เรียกว่า so-called magic คือ ฟังก์ชันที1มีจุด<br />

ประสงค์เจาะจงและฟังก์ชันการทํางานพิเศษ เมื1อเปรียบเทียบกับฟังก์ชันปกติ ดังนัน ฟังก็ชันที1มีชื1อที1แน่นอน<br />

"__constructor" คือ ฟังก์ชัน constructor ของ class และจะถูกเรียกใช้อัตโนมัติเมื1อสร้างอ็อบเจ็ค


ลองทํา : $animal= new Animal();<br />

มีเพียงบรรทัดของ Code ที1อ็อบเจ็คจะถูกสร้างขึน แล้ว Constructor จะเรียกใช้สายของ Code ในการดําเนินการ<br />

ซึ1งจะทําให้เราได้ "I'm alive!" เป็น output ออกมา อย่างไรก็ตาม ที1กล่าวมาก่อนหน้า ประโยชน์ใหญ่ของ constructor คือ<br />

ความสามารถในการส่งผ่านพารามิเตอร์ที1สามารถใช้ในการเริ1มต้นตัวแปรสมาชิก ลองทํา :<br />

name = $name;<br />

}<br />

}<br />

$animal = new Animal("Bob the Dog");<br />

echo $animal->name;<br />

><br />

การประกาศ Constructor กับ พารามิเตอร์ เป็นเหมือนการประกาศฟังก์ชันปกติ และการส่งผ่านพารามิเตอร์ (s)<br />

เป็นเหมือนการเรียกฟังฟังก์ชันปกติ แต่คําหลัก คือ "new" ที1แนะนําก่อนหน้านี Constructor สามารถมีพารามิเตอร์มาก<br />

เท่าที1คุณต้องการ


Destructors<br />

destructor จะถูกเรียกเมื1อต้องการทําลายอ็อบเจ็ค ในโปรแกรมบางภาษา คุณต้องกําจัดอ็อบเจ็คที1คุณสร้างด้วย<br />

ตัวเอง แต่ใน <strong>PHP</strong> มันจะจัดการโดย Garbage Collector ซึ1งจะช่วยในการทําลายอ็อบเจ็คอัตโนมัติ เมื1อไม่จําเป็นดัง<br />

ตัวอย่างต่อไปนีซึ1งเป็นการขยายตัวอย่างก่อนหน้านี:<br />

name = $name;<br />

}<br />

}<br />

public function __destruct()<br />

{<br />

}<br />

echo "I'm dead now :(";<br />

$animal = new Animal("Bob");<br />

echo "Name of the animal: " . $animal->name;<br />

><br />

ที1คุณเห็น destructor ก็เหมือน constructor เฉพาะชื1อที1แตกต่างกัน ถ้าคุณลองใช้ตัวอย่างนีคุณจะเห็นข้อความ<br />

constructor แรก แล้วชื1อของสัตว์ที1เราส่งออกด้วยตนเองในบรรทัดสุดท้าย และหลังจากที1สคริปต์สินสุดอ็อบเจ็คถูก<br />

ทําลาย destructor ถูกเรียกข้อความเกี1ยวกับสัตว์ก็จะไม่แสดงผลออกมา


Visibility<br />

การมองแบบ oop ส่วนใหญ่ จะช่วยให้คุณสามารถควบคุมระดับการเข้าถึงข้อของสมาชิก<br />

ในแต่ละ คลาส ได้ ตัวอย่างเช่น เพื1อที1จะป้ องกันตัวแปรบางอย่างที1จะได้รับการแก้ไขจากนอก คลาส โดยปกติการ<br />

มองเห็นจะเริ1มต้นจากการเป็น public แสดงว่าสมาชิกทุกระดับสามารถเข้าถึงได้<br />

ซึงหมายความว่า กระประกาศการมองเห็น เป็นตัวเลือกในการที1จะกําหนดผู ้เข้าถึง ข้อมูลนันๆ<br />

การประกาศการมองเห็นจะมี 3 แบบด้วยกัน<br />

Private members จะเป็ นการเข้าถึงโดยตัวเองเท่านั9น<br />

Protected members จะเป็ นการเข้าถึงภายใน คลาส และ คลาสลูก ของตนเองเท่านั9น<br />

Public members ทุกคนสามารถเข้าถึงข้อมูลได้


Inheritance<br />

Inheritance เป็นคุณสมบัติหนึ1งของคลาส ซึ1งมีการสืบทอดสมาชิก ให้คลาสอื1นๆสามารถใช้สมาชิกร่วมกันได้ ลอง<br />

จินตนาการว่าคุณมีตัวอย่างของสัตว์ประเภทต่างๆ เช่น แมว สุนัข หรืออื1นๆ สัตว์ต่างๆเหล่านีมีส่วนประกอบบางส่วนที1<br />

ทํางานเหมือนกัน ในทางกลับกันอาจจะมีส่วนที1เฉพาะเจาะจงเช่นเดียวกัน เช่น มีการสร้าง class Animal และสร้างคลาส<br />

ย่อยที1เฉพาะเจาะจง แต่จะมีบางส่วนประกอบที1เป็นส่วนประกอบพืนฐานของสัตว์ทุกๆชนิด<br />

class Animal<br />

{<br />

public $name;<br />

public function Greet()<br />

{<br />

>name;<br />

return "Hello, I'm some sort of animal and my name is " . $this-<br />

}<br />

}<br />

ตัวอย่างง่ายๆอีกหนึ1ง class<br />

{<br />

}<br />

class Dog extends Animal<br />

class จะมีการประกาศ regular class หลังจากที1ขยาย keyword บอกกับ <strong>PHP</strong> ว่าสุนัข inherit มาจาก class Animal<br />

สุนัขก็จะมีฟังก์ชันการทํางานเช่นเดียวกับ class Animal ตรวจสอบได้โดยด้วย code ต่อไปนี<br />

$dog = new Dog();<br />

echo $dog->Greet();<br />

จะเห็นได้ว่ายังคงมีทัง ชื1อและฟังก์ชัน Greet() แต่ยังไม่มีการระบุชื1อ ดังนันต่อไปจะเป็นการระบุชื1อของสุนัขด้วยฟังก์ชัน


class Dog extends Animal<br />

{<br />

}<br />

public function Greet()<br />

{<br />

}<br />

return "Hello, I'm a dog and my name is " . $this->name;<br />

ให้สังเกตว่าเราประกาศฟังฟังก์ชัน Greet() อีกครัง แต่ตัวแปร class ไม่ได้ถูกประกาศชื1อ เพราะเราได้มีการกําหนดไว้แล้ว<br />

ที1 class Animal<br />

$animal = new Animal();<br />

echo $animal->Greet();<br />

$animal = new Dog();<br />

$animal->name = "Bob";<br />

echo $animal->Greet();<br />

เราได้มีการประกาศชื1อของสุนัข ซึ1งจะทําให้การ ฟังฟังก์ชัน Greet() ซึ1งเป็นฟังก์ชันที1ใช้ทักทายสัตว์เลียง มีความเฉพาะ<br />

เจาะจงมากขึน


Abstract classes<br />

Abstract class เป็นคลาสที1ถูกออกแบบมาให้ใช้งาน Class Hierarchies โดยจะสร้าง Abstract Method คือ<br />

Method ที1ไม่มีการ Implement ไว้ภายใน (ไม่ระบุรายละเอียดของการทํางาน) อย่างน้อย 1 Method (แต่จะมี Method<br />

ที1ไม่ใช่ Abstract Method รวมอยู ่ด้วยก็ได้ แล้วให้ Subclass เป็นผู ้กําหนดรายละเอียดของการทํางาน สิ1งที1สําคัญคือ ไม่<br />

สามารถสร้าง Object จากคลาสชนิดนีได้ และ Subclass จะต้องสร้าง Method ของตนเองทับ (Override Method)<br />

Abstact Method ที1สืบทอดมาจาก Superclass<br />

การสร้าง Abstract classes จะใช้คีย์เวอร์ด “abstract ” นําหน้าชื1อ Class ส่วน Abstact Method จะใช้<br />

คีย์เวิร์ด “abstact” นําหน้าคีย์เวิร์ด Visibility ของ Method ดังนี<br />

abstracy class class_name {<br />

}<br />

// Attribute (จะมีหรือไม่มีกได้)<br />

abstact scope function function_name( [parameterq,...] );<br />

//จะมีกี1 Method ก็ได้<br />

// Method ที1ไม่ใช่ Abstact Method (จะมีหรือไม่มีก็ได้)<br />

ตัวอย่าง<br />

abstract class Animal<br />

{<br />

public $name;<br />

public $age;<br />

public function Describe()<br />

{<br />

return $this->name . ", " . $this->age . " years old";<br />

}


abstract public function Greet();<br />

}<br />

class Dog extends Animal<br />

{<br />

public function Greet()<br />

{<br />

return "Woof!";<br />

}<br />

public function Describe()<br />

{<br />

return parent::Describe() . ", and I'm a dog!";<br />

}<br />

}<br />

$animal = new Dog();<br />

$animal->name = "Bob";<br />

$animal->age = 7;<br />

echo $animal->Describe();<br />

echo $animal->Greet();


Static Classes<br />

ในเรื1องนีจะกล่าวถึง static method และ static variable static class ไม่จําเป็นต้องสร้าง instance ขึนมา<br />

สําหรับเรียกใช้งาน การเรียกใช้งาน จะใช้ชื1อ class ตามด้วย :: (double colon operator) จากนันจึงตามด้วยชื1อของ<br />

method หรือ variable และอีกอย่างถึงจะสร้าง instance ขึนมาก็ไม่ทําให้ variable หรือ method เปลี1ยนไปจากเดิมเลย<br />

ตัวอย่าง<br />

class User<br />

{<br />

public static $name;<br />

private static $age;<br />

public static $minimumPasswordLength = 6;<br />

public static function Describe()<br />

{<br />

return self::$name . " is " . self::$age . " years old";<br />

}<br />

public static function ValidatePassword($password)<br />

{<br />

if(strlen($password) >= self::$minimumPasswordLength)<br />

return true;<br />

else<br />

return false;<br />

}<br />

}<br />

public static function setInfo($name, $age){<br />

self::$name = $name;<br />

self::$age = $age;<br />

}<br />

จากโค้ดด้านบนนี9สามารถอธิบายได้ดังนี9<br />

การจะสร้าง static classes จะต้องใส่ keyword นําหน้าชื1อ method หรือ variable ภายใน class เสมอ<br />

ส่วนจะกําหนด visibility(private, public,protect) อย่างไรก็สุดแต่ท่านจะกําหนด<br />

ถ้าหากว่าเป็น method ภายในจะกําหนดหรือเรียกใช้ สิ1งต่างๆภายใน class สามารถใช้<br />

self:: = xxx;<br />

self::(parameter);<br />

การเรียกใช้สามารถเรียกใช้ดังโค้ดต่อไปนี <br />

$password = "123456";<br />

$className = "User";


การเรียกใช้ static method โดยสามารถกําหนดเป็นตัวแปรได้<br />

// หรือสามารถเรียกตรงๆได้เลยคือ User::ValidatePassword($password);<br />

if($className::ValidatePassword($password))<br />

echo "Password is valid! ";<br />

else<br />

echo "Password is NOT valid!";<br />

// กําหนดข้อมูลทังสองตัวจากภายใน<br />

$className::setInfo("tonhom", "17");<br />

// กําหนดข้อมูลของตัวแปรที1เป็น public<br />

$className::$name = "tonhom";<br />

echo $className::Describe();<br />

// สร้าง object(instance) ของ User และแสดงข้อมูล<br />

$u = new User;<br />

echo "". $u::Describe(); // ข้อมูลจะยังเหมือนเดิมก่อนหน้า<br />

// กําหนดเพียงแค่ชื1อ และใช้ชื1อ object ในการอ้างอิงนัน<br />

$u::$name = "test1";<br />

echo "". $u::Describe();<br />

// การใช้ className ในการอ้างอิงถึง static class จริงๆ ก็ยังสามารถทําได้ และค่าของ name ได้เปลี1ยนไปจาก<br />

การกําหนดด้วย instane ของ User ไปแล้ว ($u)<br />

echo "". $className::Describe();<br />

ผลลัพธ์จากการเรียกใช้ตามโค้ดด้านบนจะเป็ นดังนี9<br />

Password is valid!<br />

tonhom is 17 years old<br />

tonhom is 17 years old<br />

test1 is 17 years old<br />

test1 is 17 years old


่<br />

Class constants<br />

ค่าคงที1 เป็นเหมือนกับชื1อที1แสดงถึงตัวแปรที1ไม่สามารถเปลี1ยนแปลงได้ เมื1อประกาศค่าคงที1กําหนดค่าให้กับมันค่าจะไม่<br />

เปลี1ยนแปลง โดยปกติตัวแปรที1ดีควรง่ายต่อการใช้ โดยในบางกรณีค่าคงที1ดีกว่าเช่นการส่งสัญญาณให้โปรแกรมเมอร์<br />

อื1นๆ (หรือเตือนตัวคุณเองในกรณีที1คุณลืม) ค่าที1ระบุไม่ควรจะมีการเปลี1ยนแปลงในช่วงขณะที1กําลังรันอยู<br />

Class constants เป็นเพียงค่าคงที1ทั1วไปยกเว้นว่ามีการประกาศ class จึงเข้าถึงได้ผ่านทาง class โดยเฉพาะ เช่นเดียว<br />

กับ double-colon(::) ใช้กับ class กับ static member เพื1อเข้าสู ่ Class constants นี1เป็นตัวอย่างพืนฐานคือ<br />

<br />

ตามที1เห็นก็เหมือนตัวแปรที1ประกาศทั1วไปยกเว้นมีการปรับปรุงการเข้าถึง publically ค่าคงที1อยู ่เสมอทําให้ไม่สามารถเข้า<br />

ถึงได้ตามที1ต้องการ ทันทีที1เรากําหนดค่าให้ค่าคงที1ทังหมดก็จะผ่านการทํางานของสคริปต์ เมื1อต้องการใช้ค่าคงที1เราก็<br />

เขียนชื1อของคลาสตามด้วยตัวดําเนินการ double-colon(::) แล้วชื1อของค่าคงที1


The "final" keyword<br />

ในบทที1ผ่านมา เราได้เห็นถึงวิธีสืบทอด class จาก class อื1น นอกจากนี เรายังมองว่าคุณสามารถแทนที1การทํางานใน<br />

class ที1สืบทอดมาเพื1อแทนลักษณะการทํางานเดิมได้ อย่างไรก็ตามในบางกรณีคุณอาจต้องการไม่ให้ class ถูกสืบทอด<br />

หรือการแทนฟังฟังก์ชัน ซึ1งสามารถทําได้โดย final keyword ซึ1งทําให้ <strong>PHP</strong> เชื1อมโยนข้อผิดพลาด ถ้ามีคนพยายามที1จะ<br />

ขยาย class final ของคุณหรือแทน final function ของคุณ<br />

fiinal class จะมีลักษณะดังนี:<br />

final class Animal<br />

{<br />

}<br />

public $name;<br />

class ที1มี final function จะมีลักษณะดังนี:<br />

class Animal<br />

{<br />

final public function Greet()<br />

{<br />

return "The final word!";<br />

}<br />

}<br />

ทังสองลักษณะสามารถรวมกันได้ แต่ก็สามารถใช้อย่างอิสระตามที1เห็นในตัวอย่างข้างต้น


<strong>MySQLi</strong>


Overview<br />

แนะนําออพชั1นต่างๆ ที1มีให้ใช้ในการพัฒนาแอพลิเคชั1น <strong>PHP</strong> ที1มีการเชื1อมต่อกับฐานข้อมูล MySQL<br />

API คืออะไร <br />

API หรือชื1อเต็มคือ Application Programming Interface เป็นการกําหนด คลาส เมธอด ฟังก์ชัน และตัวแปรต่างๆที1<br />

แอพลิเคชั1นเรียกใช้งานเพื1อให้ได้ผลลัพธ์ตามที1ต้องการ<br />

APIs สามารถเป็น procedural หรือ object-oriented หากเป็น procedural API สามารถทําการเรียกฟังก์ชันเพื1อหา<br />

ผลลัพธ์ หากเป็น object-orient API ทําการสร้างออบเจ็คของคลาสจากนันเรียกใช้งานเมธอดต่างๆ API แบบ objectorient<br />

เป็นที1ต้องการมากกว่าเนื1องจากมีความทันสมัยและนําไปสู ่การจัดการโค๊ดที1ดี<br />

เมื1อทําการเขียนแอพลิเคชั1น <strong>PHP</strong> ที1ต้องการเชื1อมต่อกับฐานข้อมูล MySQL มี API ต่างๆ ให้เลือกใช้งาน เอกสารนีจะ<br />

แนะนําว่ามีอะไรบ้างและเลือกใช้อย่างไรจึงจะได้ผลลัพธ์ที1ตรงกับความต้องการของแอพลิเคชั1นมากที1สุด<br />

Connector คืออะไร <br />

ในเอกสาร MySQL คําว่า connector หมายถึง ส่วนของซอฟต์แวร์ที1ยอมให้แอพลิเคชั1นทําการเชื1อมต่อฐานข้อมูล MySQL<br />

โดย MySQL ได้ทําการจัดเตรียมตัว connector สําหรับภาษาต่างๆ รวมถึง <strong>PHP</strong> ด้วย<br />

หาก <strong>PHP</strong> แอพลิเคชั1นต้องการติดต่อกับฐานข้อมูล จะต้องเขียนโค๊ด <strong>PHP</strong> เพื1อดําเนินการเชื1อมต่อกับฐานข้อมูล โดย<br />

ทําการคิวรี1ฐานข้อมูลและฟังก์ชันฐานข้อมูลที1เกี1ยวข้องกัน connector มีความต้องการว่าให้มีการตระเตรียม API ที1 <strong>PHP</strong><br />

แอพลิเคชันจะใช้ และยังจัดการการเชื1อมต่อระหว่างแอพลิเคชั1นและฐานข้อมูล เป็นไปได้ว่า connector มีการใช้ไลบรารี<br />

ตัวกลางตัวอื1นด้วย<br />

Driver คืออะไร <br />

Driver เป็นส่วนของซอฟต์แวร์ที1ถูกออกแบบมาเพื1อใช้ในการติดต่อชนิดฐานข้อมูลที1กําหนดมาให้ ตัว driver อาจจะถูก<br />

เรียกว่า ไลบรารี อีกด้วย เช่น MySQL Client Library หรือ MySQL Native Driver ไลบรารีเหล่านีอิมพลีเมนต์โปรโตคอล<br />

ระดับล่างใช้ในการติดต่อสื1อสารกับ MySQL


Extension คืออะไร <br />

ในเอกสาร <strong>PHP</strong> คุณจะพบกับคําศัพท์อีกคําคือ extension โค๊ดของ <strong>PHP</strong> ประกอบไปด้วยแกนหลักโดยมี extension เป็น<br />

ตัวเลือกเสริมให้กับแกนหลัก extension ของ <strong>PHP</strong> ที1เกี1ยวข้องกับ <strong>PHP</strong> ได้แก่ mysqli extension และ mysql extension<br />

โดย extension เหล่านีถูกอิมพลีเมนต์โดยการใช้ <strong>PHP</strong> extension framework<br />

โดยปกติแล้ว extension จะมี API ให้โปรแกรมเมอร์ <strong>PHP</strong> ใช้งาน อย่างไรก็ตามบาง extension ซึ1งใช้งาน <strong>PHP</strong> extension<br />

framework ไม่เปิดเผย API แก่โปรแกรมเมอร์ <strong>PHP</strong> เช่น PDO MySQL driver extension<br />

มี <strong>PHP</strong> API หลักๆอะไรบ้างสําหรับการใช้ MySQL<br />

• <strong>PHP</strong>'s MySQL Extension<br />

• <strong>PHP</strong>'s mysqli Extension<br />

• <strong>PHP</strong> Data Objects (PDO)<br />

mysqli extension ของ <strong>PHP</strong> คืออะไร<br />

mysqli extension หรือบางครังเรียกว่า MySQL improved extension ถูกพัฒนาเพื1อที1จะใช้คุณสมบัติพิเศษใหม่ๆ ที1มีใน<br />

MySQL version 4.1.3 และใหม่กว่า mysqli extension ถูกผนวกเข้ามาไว้ใน <strong>PHP</strong> ตังแต่เวอร์ชั1น 5<br />

mysqli extension มีข้อดีต่างๆ ที1ปรับปรุงให้ดีกว่า mysql extension ดังนี<br />

• Object-oriented interface<br />

• สนับสนุน Prepared Statements<br />

• สนับสนุน Multiple Statements<br />

• สนับสนุน Transactions<br />

• ปรับปรุงขีดความสามารถต่างๆ ในการทําดีบั‰ก<br />

• สนับสนุนเซิร์ฟเวอร์แบบฝัง


PDO คืออะไร <br />

<strong>PHP</strong> Data Objects หรือ PDO เป็นชันนามธรรมของฐานข้อมูลสําหรับแอพลิเคชั1น <strong>PHP</strong> โดยPDO จัดเตรียม API สําหรับ<br />

แอพลิเคชั1น <strong>PHP</strong> โดยไม่คํานึงถึงฐานข้อมูลที1ต้องการเชื1อมต่อ ในทางทฤษฎีแล้ว สามารถทําการสับเปลี1ยนฐานข้อมูลที1ใช้<br />

อยู ่ เช่น จาก Firebird ไปเป็น MySQL โดยทําการเปลี1ยนแปลงโค๊ด <strong>PHP</strong> เพียงเล็กน้อย<br />

ชันนามธรรมฐานข้อมูลยังรวมถึง JDBC สําหรับ Java และ DBI สําหรับ Perl<br />

ในขณะที1 PDO มีข้อดีต่างๆมากมาย เช่น สะอาด, ง่าย, มี API ที1พกพาได้ ข้อเสียหลักของมันก็คือว่า ไม่ยอมให้คุณใช้<br />

คุณสมบัติพิเศษทังหมดที1มีอยู ่ใน MySQL เวอร์ชันล่าสุด ตัวอย่างเช่น PDO ไม่ยอมให้คุณใช้ Multiple Statements<br />

PDO MYSQL driver คืออะไร <br />

PDO MYSQL driver ไม่ใช้ API ในมุมมองของ <strong>PHP</strong> โปรแกรมเมอร์ แต่ PDO MYSQL driver อยู ่ในชันระดับล่าง PDO<br />

และทําการจัดเตรียมฟังก์ชันต่างๆ ของ MySQL โปรแกรมเมอร์ยังคงเรียน PDO API แต่ PDO ใช้ PDO MYSQL driver<br />

ในการเชื1อมต่อกับ MySQL server<br />

PDO MYSQL driver เป็ นหนึ1งในหลายๆ driver ที1มีอยู ่ ยังมี PDO driver ตัวอื1นๆที1มีไว้ สํา หรับ Firebird และ<br />

PostgreSQL<br />

MySQL Native Driver ของ <strong>PHP</strong> คืออะไร <br />

เพื1อที1จะทําการเชื1อมต่อกับฐานข้อมูล MySQL ทัง mysql extension, mysqli extension และ PDO MYSQL driver ต่างก็<br />

ใช้ไลบรารีระดับล่างในการอิมพลีเมนต์โปรโตคอลที1ต้องการ ในอดีตไลบรารีที1มีให้ใช้คือ libmysql<br />

อย่างไรก็ตาม อินเทอร์เฟซที1มีใน libmysql ไม่เหมาะกับการเชื1อมต่อด้วยแอพลิเคชั1น <strong>PHP</strong> เพราะ libmysql โดยดังเดิม<br />

แล้วถูกออกแบบมาสําหรับแอพลิเคชั1นของ C ด้วยเหตุผลนีMySQL Native Driver, mysqlnd จึงถูกออกแบบมาให้ใช้กับ<br />

แอพลิเคชั1น <strong>PHP</strong><br />

ทัง mysql extension, mysqli extension และ PDO MySQL driver สามารถตังค่าให้ใช้ได้ทัง libmysql หรือ mysqlnd


เปรียบเทียบคุณสมบัติหน้าที 'ของวิธีการทั9งสามวิธีในการเชื 'อมต่อ MySQL ด้วย <strong>PHP</strong><br />

<strong>PHP</strong>'s mysqli<br />

Extension<br />

PDO (Using PDO MySQL<br />

Driver and MySQL Native<br />

Driver)<br />

<strong>PHP</strong>'s MySQL Extension<br />

<strong>PHP</strong> version introduced 5.0 5.0 Prior to 3.0<br />

Included with <strong>PHP</strong> 5.x yes yes Yes<br />

MySQL development status<br />

Active Active development as of<br />

development <strong>PHP</strong> 5.3<br />

Maintenance only<br />

Recommended by MySQL for Yes - preferred<br />

new projects<br />

option<br />

Yes<br />

No<br />

API supports Charsets Yes Yes No<br />

API supports server-side<br />

Prepared Statements<br />

Yes Yes No<br />

API supports client-side Prepared<br />

No<br />

Statements<br />

Yes No<br />

API supports Stored Procedures Yes Yes No<br />

API supports Multiple Statements Yes Most No<br />

Supports all MySQL 4.1+<br />

functionality<br />

Yes Most No


Dual procedural and object-oriented interface<br />

กระบวนการ dual และ interface แบบ object-oriented<br />

<strong>MySQLi</strong> เพิ1มความสามารถในการใช้ interface แบบ dual ซึ1งรองรับวิธีการ และ การเขียนโปรแกรมแบบ<br />

object-oriented<br />

ผู ้ใช้งานที1เปลี1ยนจากส่วนขยายของ MySQL แบบเ อาจจะชอบ interface แบบ procedural interface แบบ<br />

procedural ง่ายต่อการใช้ส่วนขยาย MySQL แบบเก่า ในหลายกรณี ชื1อของฟังก์ชั1นจะแตกต่างกันโดยเฉพาะ prefix<br />

ฟังฟังก์ชัน MySQL บาง ฟังฟังก์ชันใช้ในการจัดการการเชื1อมต่อกับ argument แรกของพวกเขา ในขณะที1 ฟังก์ชั1นที1ตรง<br />

กันในอินเทอร์เฟสของ MySQL แบบเก่าจะใช้เป็นอาร์กิวเมนต์ล่าสุดที1ไม่จําเป็น<br />

Example #1 Easy migration from the old mysql extension<br />

<br />

output:<br />

Please, do not use the mysql extension for new developments.<br />

Interface แบบ object-oriented<br />

นอกเหนือจาก procedural interface แบบเก่า ผู ้ใช้สามารถเลือกใช้ object-oriented interface เอกสาร<br />

ประกอบ ถูกทําขึนเป็นคู ่มือการใช้ object-oriented interface object-oriented interface แสดงฟังก์ชันที1จัดกลุ ่มโดยจุด<br />

ประสงค์ของแต่ละฟังก์ชัน ทําให้ง่ายในการเริ1มต้น ในส่วนการอ้างอิงอาจจะให้ตัวอย่างสําหรับทังสองไวยกรณ์<br />

ประสิทธิภาพไม่มีความแตกต่างกันระหว่างสองอินเทอร์เฟสนีผู ้ใช้สามารถเลือกตามความพอใจ<br />

Example #2 Object-oriented and procedural interface<br />


echo $row['_msg'];<br />

$mysqli = new mysqli("example.com", "user", "password", "database");<br />

if ($mysqli->connect_errno) {<br />

echo "Failed to connect to MySQL: " . $mysqli->connect_error;<br />

}<br />

$res = $mysqli->query("SELECT 'choices to please everybody.' AS _msg FROM<br />

DUAL");<br />

$row = $res->fetch_assoc();<br />

echo $row['_msg'];<br />

><br />

output:<br />

A world full of choices to please everybody.<br />

object oriented interface ถูกใช้สําหรับ quickstart เพราะส่วนอ้างอิงมีการจัดเอาไว้<br />

รูปแบบผสม<br />

มันเป็นไปได้ที1จะสลับไปมาระหว่างรูปแบบในเวลาใดก็ได้ ผสมรูปแบบทังไม่แนะนําสําหรับ code clarity และ<br />

การเข้ารหัสรูปแบบเหตุผล<br />

Example #3 Bad coding style<br />

connect_errno) {<br />

echo "Failed to connect to MySQL: " . $mysqli->connect_error;<br />

}<br />

$res = mysqli_query($mysqli, "SELECT 'Possible but bad style.' AS _msg FROM<br />

DUAL");<br />

if (!$res) {<br />

echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;<br />

}<br />

if ($row = $res->fetch_assoc()) {<br />

echo $row['_msg'];<br />

}<br />

><br />

output:<br />

Possible but bad style.


Connections<br />

MySQL server สนับสนุนการส่งข้อมูลระหว่างชันที1แตกต่างกันสําหรับการเชื1อมต่อ การเชื1อมต่อจะใช้ TCP/IP ยูนิกส์จะ<br />

ใช้ Sockets หรือ วินโดส์จะใช้ Pipes<br />

localhost เป็นโฮสต์ที1มีความพิเศษซึ1งจะใช้กับ Unix domain sockets และจะไม่สามารถเปิดใช้งานแบบ<br />

TCP/IP ได้โดยจะต้องใช้ localhost ที1มีชื1อโฮสต์ 127.0.0.1 แทน<br />

Example #1 Special meaning of localhost<br />

โดย user ให้ใส่ ชื1อที1ใช้ในการติดต่อฐานข้อมูล<br />

password คือ รหัสในการคิดต่อฐานข้อมูล<br />

database คือ ชื1อของฐานข้อมูลที1ต้องการใช้งาน<br />

port 3306 คือ หมายเลข port ของ MySql<br />

ถ้าติดต่อฐานข้อมูลได้ จะแสดงดังนี9<br />

output:<br />

Localhost via UNIX socket<br />

127.0.0.1 via TCP/IP<br />

ซึ1งก็คือ localhost มีการติดต่อแบบ Unix socket และ 127.0.0.1 มีการติดต่อแบบ TCP/IP


ค่าเริมต้นของพารามิเตอร์ในการเชือมต่อ<br />

ทังนีขึนอยู ่กับการเชื1อมต่อการใช้งานต่างๆ พารามิเตอร์สามารถละเว้นได้ แล้วจะมีการกําหนดเป็นค่าพืนฐานของ<br />

php<br />

Example #2 Setting defaults<br />

Built-in connection library defaults<br />

ถ้า host ไม่มีการกําหนดค่าหรือเป็นค่าว่าง client library จะมีการกําหนดค่าเริ1มต้นของการเชื1อมต่อของ Unix<br />

socket เป็น localhost ถ้า socket ไม่มีการกําหนดค่าหรือเป็นค่าว่างและ Unix socket ต้องการค่านันๆการเชื1อมต่อเริ1ม<br />

ต้นของ socket จะอยู ่ที1 /tmp/mysql.sock บนวินโดส์ จะอยู ่ที1 \\.\pipe\MySQL และค่าเริ1มต้นของ port จะถูกกําหนดที1<br />

พอร์ต 3306 ซึ1งเป็นพอร์ตของ MySql


Executing statements<br />

การรันคําสั 'ง<br />

คําสั1งสามารถดําเนินการด้วย ฟังก์ชัน mysqli_query (), mysqli_real_query () และ mysqli_multi_query แต่<br />

ฟังก์ชัน() mysqli_query () มักจะถูกใช้เป็นส่วนใหญ่ และรวมตัวการดําเนินการคําสั1งกับบัฟเฟอร์เรียกชุดผลลัพธ์ของมัน<br />

ถ้ามีเพียงหนึ1งคําสั1งควรเรียกใช้ mysqli_query() มันเหมือนกับการเรียกใช้ mysqli_real_query() ตามด้วย<br />

mysqli_store_result ()<br />

mysqli_multi_query () เป็ นฟังก์ชันที 'ใช้กับหลายคําสั 'ง<br />

Example #1 Bad coding style<br />

บัฟเฟอร์ชุดผลลัพธ์<br />

หลังจากที1ผลการเรียกคําสั1งที1สามารถเรียกดูได้ที1หนึ1งครังที1มีบัฟเฟอร์โดย Client หรือโดยการอ่านทีละแถว ชุดผลลัพธ์<br />

บัฟเฟอร์ด้าน Client จะช่วยให้เซิร์ฟเวอร์ไปยังแหล่งข้อมูลที1เกี1ยวข้องกับผลของคําสั1งโดยเร็วที1สุด ดังนัน จะแนะนําให้ใช้<br />

ชุดผลลัพธ์บัฟเฟอร์ mysqli_query () รวมทังการเรียกคําสั1งและกําหนดผลบัฟเฟอร์<br />

โปรแกรม <strong>PHP</strong> สามารถนําทางได้อย่างอิสระผ่านผลบัฟเฟอร์นําร่องซึ1งเป็นไปอย่างรวดเร็วเพราะชุดผลลัพธ์ที1จะมีขึนใน<br />

หน่วยความจําไคลเอนต์ โปรดจําไว้ว่ามันมักจะง่ายต่อการปรับขนาดโดยไคลเอนต์มากกว่าการปรับขนาดโดยเซิร์ฟเวอร์


Example #2 Navigation through buffered results (การนําทางผ่านผลลัพธ์ของบัฟเฟอร์)<br />

output<br />

Reverse order...<br />

id = 3<br />

id = 2<br />

id = 1<br />

Result set order...<br />

id = 1<br />

id = 2<br />

id = 3<br />

ชุดผลลัพธ์ Unbuffered<br />

หากหน่วยความจําไคลเอนต์เป็นแหล่งข้อมูลที1มีระยะสันและเป็นอิสระกับทรัพยากรเซิร์ฟเวอร์ชุดผลลัพธ์<br />

Unbuffered สามารถนํามาใช้ได้<br />

การเลื 'อนผ่านชุดผลลัพธ์ Unbuffered เป็ นไปไม่ได้ก่อนที 'แถวทั9งหมดจะได้รับการอ่าน


Example #3 Navigation through buffered results (การนําทางผ่านผลลัพธ์ของบัฟเฟอร์)<br />

real_query("SELECT id FROM test ORDER BY id ASC");<br />

$res = $mysqli->use_result();<br />

echo "Result set order...\n";<br />

while ($row = $res->fetch_assoc()) {<br />

echo " id = " . $row['id'] . "\n";<br />

}<br />

><br />

ชุดผลลัพธ์ชนิดค่าของข้อมูล<br />

ฟังก์ชัน mysqli_query (), mysqli_real_query () และ mysqli_multi_query () จะใช้ในการดําเนินการ<br />

คําสั1งที1 non-prepared ที1ระดับ MySQL Client Server Protocol คําสั1ง COM_QUERY และโปรโตคอลข้อความที1ใช้<br />

สําหรับเรียกคําสั1ง ด้วยโปรโตคอลข้อความ MySQL เซิร์ฟเวอร์ แปลงข้อมูลทังหมดของชุดผลลัพธ์เป็นสตริงก่อนที1จะส่ง<br />

การแปลงนีไปกระทําโดยไม่คํานึงถึงผลชุดชนิดคอลัมน์ข้อมูล SQL MySQL ห้องสมุดลูกค้าได้รับค่าในคอลัมน์ทังหมดเป็น<br />

สตริง<br />

MySQL ไลบรารีไคลเอ็นต์ได้รับค่าในคอลัมน์ทังหมดเป็นสตริงเพื1อแปลงกลับไปเป็นคอลัมน์ชนิดพืนเมืองของ<br />

พวกเขาโดยแทนค่าทังหมดที1มีให้เป็นสตริง <strong>PHP</strong><br />

Example #4 Text protocol returns strings by default (ส่งกลับสตริงโดยค่าเริ1มต้น)<br />

output<br />

id = 1 (string)<br />

label = a (string)


มันเป็นไปได้ในการแปลงจํานวนเต็มและคอลัมน์ลอยกลับไปยังหมายเลข <strong>PHP</strong> โดยการตังค่าตัวเลือกการเชื1อมต่อ<br />

MYSQLI_OPT_INT_AND_FLOAT_NATIVE ถ้าใช้ไลบรารี mysqlnd<br />

หากตังค่าไลบรารี mysqlnd จะตรวจสอบผลของชุดข้อมูลประเภท Meta คอลัมน์และแปลงคอลัมน์ตัวเลข SQL ให้เป็น<br />

ตัวเลข <strong>PHP</strong> ด้วยวิธีนีตัวอย่างเช่น SQL คอลัมน์ INT จะกลับมาเป็นจํานวนเต็ม<br />

Example #5 Native data types with mysqlnd and connection option<br />

(ชนิดข้อมูล Native ที 'มี mysqlnd และตัวเลือกการเชื 'อมต่อ)<br />

output<br />

id = 1 (integer)<br />

label = a (string)


Prepared Statements<br />

ฐานข้อมูล MySQL สนับสนุน การเตรียมคําสั1ง หรือคําสั1งพารามิเตอร์ที1ใช้ในการรันคําสั1งเดิมซําๆ โดยมี<br />

ประสิทธิภาพสูง<br />

กระบวนการทํางานขั9นพื9นฐาน<br />

การเตรียมคําสั1งประกอบด้วยการปฏิบัติ 2 ขันตอนด้วยกัน ก็คือการเตรียมความพร้อมและการดําเนินการ โดย<br />

การเตรียมความพร้อม แม่แบบของคําสั1งจะถูกไปยังเซิร์ฟเวอร์ฐานข้อมูล เซิร์ฟเวอร์ทําการตรวจสอบรูปแบบและทําการ<br />

เริ1มต้นทรัพยากรภายในเซิร์ฟเวอร์สําหรับการใช้งานในภายหลัง<br />

Example #1 First stage: prepare (การเตรียมความพร้อม)<br />

การเตรียมจะตามด้วยการดําเนินการในช่วงดําเนินการ client ผูกค่าพารามิเตอร์และส่งตัวมันเองไปยัง server server จะ<br />

สร้างคําสั1งจากแม่แบบคําสั1งและค่าจํากัดเพื1อดําเนินการได้โดยใช้สร้างไว้ก่อนหน้าทรัพยากรภายใน<br />

Example #2 Second stage: bind and execute (การผูกค่าและการดําเนินการ)<br />

การดําเนินการซําคําสั1งที1ถูกเตรียมสามารถดําเนินการซําๆ เมื1อมีการดําเนินการทุกค่าปัจจุบันของตัวแปรจํากัดจะถูก<br />

ประเมินและส่งไปยัง server คําสั1งที1ไม่ได้การแจงอีกครัง แม่แบบคําสั1งไม่ถูกโอนไปยัง server


Example #3 INSERT prepared once, executed multiple times (การดําเนินการหลายครั9ง)<br />

ทุกคําสั1งที1ถูกเตรียมครองทรัพยากร server คําสั1งควรจะถูกปิดอย่างชัดเจนในทันทีหลังจากที1ใช้ ถ้าไม่ได้ทําให้ชัดเจนคํา<br />

สั1งจะถูกปิดเมื1อคําสั1งเป็นอิสระโดย <strong>PHP</strong> การใช้คําสั1งที1ถูกเตรียมไว้จะไม่ใช่วิธีวิธีที1มีประสิทธิภาพมากที1สุดของการรันคํา<br />

สั1ง การเตรียมคําสั1ง ดําเนินการเพียงครังเดียวทําให้ client-server เพิ1มเติมตลอดการเดินทางกว่าคําสั1งที1ไม่ได้ถูกเตรียม นี1<br />

คือเหตุผลที1เลือกไม่ถูกใช้เป็นคําสั1งเตรียมไว้ข้างต้น<br />

ยังพิจารณาการใช้ MySQL การเพิ1ม ไวยากรณ์ SQL สําหรับการแทรก ตัวอย่างเช่นการเพิ1มหลายๆครัง จําเป็นต้อง<br />

วนไปกลับน้อยระหว่าง client กับ server มากกว่าการเตรียมคําสั1ง


output<br />

array(4) {<br />

[0]=><br />

array(1) {<br />

[0]=><br />

string(1) "1"<br />

}<br />

[1]=><br />

array(1) {<br />

[0]=><br />

string(1) "2"<br />

}<br />

[2]=><br />

array(1) {<br />

[0]=><br />

string(1) "3"<br />

}<br />

[3]=><br />

array(1) {<br />

[0]=><br />

string(1) "4"<br />

}<br />

}<br />

Example #4 Less round trips using multi-INSERT SQL (การเพิ 'มลงใน SQL)<br />

MySQL Server Client กําหนดที1แตกต่างกันโปรโตคอลการถ่ายโอนข้อมูลสําหรับการเตรียมคําสั1งและคําสั1งที1ไม่ได้เตรียม<br />

คําสั1งที1ถูกเตรียมกําลังใช้โปรโตคอลแบบไบนารีที1เรียกว่าเซิร์ฟเวอร์ MySQL ส่งข้อมูลชุดผล "as is" ในรูปแบบไบนารี ผล<br />

การค้นหาจะไม่ต่อเนื1องกันเป็นสตริง การแปลงค่าเป็นที1เหมาะสม <strong>PHP</strong> ชนิดข้อมูล ตัวอย่างเช่นผลลัพธ์ที1ได้จากคอลัมน์<br />

INT SQL จะมีการจัดเป็นตัวแปร <strong>PHP</strong> จํานวนเต็ม<br />

Example #5 Native datatypes (ประเภทข้อมูลของภาษา)<br />

ลักษณะการทํางานนีแตกต่างจากคําสั1งที1ไม่ได้ถูกเตรียมไว้ โดยค่าเริ1มต้นของคําสั1งที1ไม่ได้ถูกเตรียมไว้จะส่งกลับค่า<br />

ผลลัพธ์ทังหมดที1เป็นสตริง ค่าเริ1มต้นนีสามารถเปลี1ยนแปลงได้โดยใช้ตัวเลือกการเชื1อมต่อ หากตัวเลือกการเชื1อมต่อที1ใช้<br />

จะไม่มีความแตกต่างกัน


Example #6 Output variable binding (ตัวแปร Output ที 'มีความสัมพันธ์กัน)<br />

ผลลัพธ์ของคําสั1งไม่ได้ถูกเรียกและถูกโอนจาก server ไปยัง client สําหรับบัฟเฟอร์ฝั1ง client หาก client ไม่สามารถเรียก<br />

ผลลัพธ์ทังหมดหรือ client ที1ปิดคําสั1งก่อนที1จะมีการเรียกข้อมูลทังหมดข้อมูลจะต้องมีการเรียกโดยปริยายโดย mysqli<br />

output<br />

id = 1 (integer), label = a (string)


Example #7 Using mysqli_result to fetch results (การใช้ mysqli_result เพื 'อเรียกผลลัพธ์)<br />

การใช้อินเตอร์เฟซ mysqli_result เสนอประโยชน์เพิ1มจากผลลัพธ์ที1มีความยืดหยุ ่นฝั1ง client นําทาง<br />

output<br />

array(1) {<br />

[0]=><br />

array(2) {<br />

[0]=><br />

int(1)<br />

[1]=><br />

string(1) "a"<br />

}<br />

}


Example #8 Buffered result set for flexible read out (ผลลัพธ์บัฟเฟอร์)<br />

คําแนะนําจะต้องให้กับเซิร์ฟเวอร์สําหรับประเภทของตัวแปรที1ถูกผูกไว้เพื1อสร้างการแปลงที1เหมาะสม ดูฟังฟังก์ชัน<br />

mysqli_stmt_bind_param () สําหรับข้อมูลเพิ1มเติม


Stored Procedures<br />

โปรแกรม MySQL database รองรับ stored procedures. stored procedure คือกลุ ่มคําสั1ง SQL ที1เก็บไว้ใน database<br />

engine สามารถเรียกใช้งานภายหลังโดยโปรแกรมต่างๆ triger หรือแม้แต่ stored procedure อื1นๆ หรือเรียกใช้งานตัว<br />

เองได้ (recursive stored procedure)<br />

parameter<br />

Stored procedures สามารถมี IN, INOUT and OUT พารามิเตอร์ ขึนอยู ่กับเวอร์ชั1นของ MySQL หน้าจอการ<br />

แสดงผลของ mysqli ไม่มีอะไรพิเศษสําหรับความต่างของพารามิเตอร์<br />

IN parameter<br />

การป้ อนค่าด้วยคําสั1ง CALL ต้องแน่ใจว่ามีค่าที1ถูกต้อง<br />

Example #1 Calling a stored procedure<br />

output<br />

array(1) {<br />

["id"]=><br />

string(1) "1"<br />

}


INOUT/OUT parameter<br />

ค่าของพารามิเตอร์ INOUT/OUT ที1มีการเข้าถึงด้วยชุดตัวแปลหลายตัวแปร<br />

Example #2 Using session variables<br />

output<br />

Hi!<br />

นักพัฒนาแอพลิเคชันและเฟรมเวิร์คอาจจะสามารถที1จะให้ความสะดวกของ API โดยใช้การผสมระหว่างชุดตัวแปรและ<br />

การตรวจสอบ databased catalog<br />

Handling result sets<br />

Stored procedures สามารถกลับไปเป็นชุดของผลสรุป. ชุดของผลสรุปที1ถูกแปลงมาจาก stored procedure ไม่สามารถ<br />

เรียกใช้ mysqli_query() ฟังฟังก์ชัน mysqli_query() เป็นการผสมผสานการเรียกใช้คําสั1งและคําสั1งผลสรุปแรกไปยังชุด<br />

ผลสรุปของบัพเฟอร์ (ถ้ามี) อย่างไรก็ตาม มีสิ1งที1เพิ1มเติมคือชุดผลสรุปของ stored procedure ซ่อนตัวจากยูสเซอร์ ซึ1ง<br />

สาเหตุที1 mysqli_query() ผิดพลาดจากชุดสรุปที1ยูสเซอร์คาดหวังไว้<br />

ชุดของผลสรุปถูกเรียกจาก stored procedure<br />

โดยใช้ mysqli_real_query() หรือ mysqli_multi_query(). ทังสองฟังฟังก์ชันนีอนุญาตการเรียกเลขใดๆจากการคืนค่า<br />

จากชุดผลสรุป เช่นเดียวกับ CALL การล้มเหลวในการเรียกชุดผลสรุปทังหมดที1คืนค่ามาจากสาเหตุ stored procedure<br />

นัน error.


Example #3 Fetching results from stored procedures<br />

output<br />

---<br />

array(3) {<br />

[0]=><br />

array(1) {<br />

[0]=><br />

string(1) "1"<br />

}<br />

[1]=><br />

array(1) {<br />

[0]=><br />

string(1) "2"<br />

}<br />

[2]=><br />

array(1) {<br />

[0]=><br />

string(1) "3"<br />

}<br />

}<br />

---<br />

array(3) {<br />

[0]=><br />

array(1) {<br />

[0]=><br />

string(1) "2"<br />

}<br />

[1]=><br />

array(1) {


}<br />

[0]=><br />

string(1) "3"<br />

}<br />

[2]=><br />

array(1) {<br />

[0]=><br />

string(1) "4"<br />

}<br />

การเตรียมการเรียกใช้คําสั 'ง<br />

ไม่มีอะไรพิเศษในการเตรียมการเรียกใช้รูปแบบคําสั1งเพื1อเรียกผลสรุปจาก stored procedure เดียวกัน จะเตรียมการคํา<br />

สั1งหรือไม่ได้เตรียมการนันมีค่าเท่ากัน<br />

เตือน : MYSQL บางเวอร์ชันไม่รองรับการเตรียมการสําหรับคําสั1ง CALL SQL<br />

Example #4 Stored Procedures and Prepared Statements<br />

Of course, use of the bind API for fetching is supported as well.


Example #5 Stored Procedures and Prepared Statements using bind API


Multiple Statements<br />

ทางเลือกของ MySQL ช่วยให้มี multiple statements ในหนึ1ง statement string การส่ง multiple statements<br />

ในแต่ละครังจะลดการเดินทางของ client-server แต่จะต้องมีการจัดการเป็นพิเศษ<br />

Multiple statements หรือ multi queries จะต้องถูกดําเนินการโดย mysqli_multi_query() แต่ละส่วนของ<br />

statements ของ statement string จะถูกแบ่งโดยเครื1องหมาย semicolon หลังจากนัน ชุดผลลัพธ์ทังหมดที1ถูกส่งกลับ<br />

โดย statements ที1กําลังทํางานอยู ่จะถูกเรียก<br />

เซิร์ฟเวอร์ MySQL จะช่วยให้มี statements ที1จะส่งชุดผลลัพธ์กลับ และ statements ที1ไม่ส่งชุดผลลัพธ์กลับ ใน<br />

หนึ1ง multiple statement.<br />

Example #1 Multiple Statements<br />

connect_errno) {<br />

echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;<br />

}<br />

if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {<br />

echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;<br />

}<br />

$sql = "SELECT COUNT(*) AS _num FROM test; ";<br />

$sql.= "INSERT INTO test(id) VALUES (1); ";<br />

$sql.= "SELECT COUNT(*) AS _num FROM test; ";<br />

if (!$mysqli->multi_query($sql)) {<br />

echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;<br />

}<br />

do {<br />

if ($res = $mysqli->store_result()) {<br />

var_dump($res->fetch_all(MYSQLI_ASSOC));<br />

$res->free();<br />

}<br />

} while ($mysqli->more_results() && $mysqli->next_result());<br />

>


output<br />

array(1) {<br />

[0]=><br />

array(1) {<br />

["_num"]=><br />

string(1) "0"<br />

}<br />

}<br />

array(1) {<br />

[0]=><br />

array(1) {<br />

["_num"]=><br />

string(1) "1"<br />

}<br />

}<br />

การพิจารณาความปลอดภัย<br />

API ฟังก์ชัน mysqli_query() และ mysqli_real_query() ไม่สามารถ set connection flag necessary สําหรับ<br />

การใช้ multi queries ใน เซิร์ฟเวอร์ การเรียกส่วนเสริม API ถูกใช้สําหรับ multiple statements ในการลด likeliness ของ<br />

อุบัติเหตุจากากรโจมตี SQL injection การโจมตีจะพยายามที1จะเพิ1ม statements เช่น DROP DATABASE mysql or ;<br />

SELECT SLEEP(999) ถ้าการโจมตีประสบความสําเร็จในการเพิ1ม SQL ไปยัง statement string แต่<br />

mysqli_multi_query จะไม่ถูกเรียกใช้ เซิร์ฟเวอร์จะไม่มีการทํางานครังที1สอง และ SQL statement ที1เป็นอันตราย<br />

Example #2 SQL Injection<br />

query("SELECT 1; DROP TABLE mysql.user");<br />

if (!$res) {<br />

echo "Error executing query: (" . $mysqli->errno . ") " . $mysqli->error;<br />

}<br />

><br />

output<br />

Error executing query: (1064) You have an error in your SQL syntax;<br />

check the manual that corresponds to your MySQL server version for the right syntax<br />

to use near 'DROP TABLE mysql.user' at line 1


API support for transactions<br />

MySQL server สนับสนุนการทํา Transactions ที1ขึนอยู ่กับเครื1องมือที1ใช้ในการจัดเก็บ ตังแต่ MySQL5.5 เครื1อง<br />

มือที1ใช้เก็บเริ1มต้นคือ InnoDB ซึ1ง InnoDB ที1มีACID จะสนับสนุนการทํา Transactions<br />

Transactions ที1สามารถควบคุมการใช้งานเรียกว่า SQL หรือ API เราจะแนะนํา ให้ใช้ API สําหรับการเปิดและ<br />

ปิดใช้งานในโหมดอัตโนมัติและใช้สําหรับนํา Transactions กลับมาใช้ใหม่<br />

Example #1 Setting auto commit mode with SQL and through the API<br />

(การตั9งค่าในโหมดอัตโนมัติสําหรับ SQL และผ่าน API)<br />

connect_errno) {<br />

echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;<br />

}<br />

/* Recommended: using API to control transactional settings */<br />

$mysqli->autocommit(false);<br />

/*Won't be monitored and recognized by the replication and the load balancing plugin */<br />

if (!$mysqli->query('SET AUTOCOMMIT = 0')) {<br />

echo "Query failed: (" . $mysqli->errno .") " . $mysqli->error;<br />

}<br />

><br />

คุณลักษณะเพิ1มเติมของแพกเก็จ เช่น การจําลองแบบและปลั‰กอินในการโหลดให้สมดุล สามารถตรวจสอบ API ได้ง่าย<br />

เป็นโปรเสริมในการจําลองที1สมดุล ถ้ามีการควบคุมที1เรียกว่า API เราจะไม่สามารถควบคุมการทํางานให้สมดุลได้ ถ้าคํา<br />

สั1ง SQL ถูกใช้สําหรับการตังค่าอัตโนมัติในขณะทํางานอยู ่หรือการย้อนกลับมาทํา Transaction ใหม่<br />

Example #2 Commit and rollback<br />

autocommit(false);<br />

$mysqli->query("INSERT INTO test(id) VALUES (1)");<br />

$mysqli->rollback();<br />

$mysqli->query("INSERT INTO test(id) VALUES (2)");<br />

$mysqli->commit();<br />

><br />

โปรดทราบว่า MySQL Sever ไม่สามารถย้อนกลับไปได้ทังหมด การกระทําบางอย่างจะทําให้เกิดการบันทึกโดยปริยาย


Metadata<br />

Metadata คือ คําอธิบายข้อมูล หรือข้อมูลที1บอกรายละเอียดของข้อมูล (data about data) เพื1อให้เราทราบว่า<br />

ข้อมูลที1เราได้รับนันมันคืออะไร<br />

นอกจากทําให้เราเข้าใจแล้ว metadata ก็เป็นสิ1งที1ช่วยทําให้เครื1องคอมพิวเตอร์สามารถเข้าใจถึงข้อมูลที1มันได้รับ<br />

ด้วยเช่นกัน<br />

metadata ไม่ได้ถูกคิดค้นมาเพื1อใช้งานกับเว็บเพจ เพราะแรกเริ1มเดิมทีนัน metadata ได้ถูกใช้ในกลุ ่มพัฒนาฐาน<br />

ข้อมูลที1อ้างอิงถึงสารสนเทศในห้องสมุดเพื1อให้ บรรณารักษ์ได้ใช้ในการจัดการระบบห้องสมุด ซึ1งถ้าหากจะว่าไปแล้วเราก็<br />

อาจเปรียบเทียบได้ว่า เว็บเพจต่างๆ นันเปรียบเสมือนห้องสมุดโลกขนาดใหญ่ ด้วยเหตุผลนี เองจึงได้มีแนวความคิดใน<br />

การนํา metadata มาประยุกต์ใช้กับเว็บเพจต่างๆ<br />

Example #1 Accessing result set meta data<br />

output<br />

array(2) {<br />

[0]=><br />

object(stdClass)#3 (13) {<br />

["name"]=><br />

string(4) "_one"<br />

["orgname"]=><br />

string(0) ""<br />

["table"]=><br />

string(0) ""<br />

["orgtable"]=><br />

string(0) ""<br />

["def"]=><br />

string(0) ""<br />

["db"]=><br />

string(0) ""<br />

["catalog"]=><br />

string(3) "def"<br />

["max_length"]=><br />

int(1)<br />

["length"]=><br />

int(1)<br />

["charsetnr"]=><br />

int(63)<br />

["flags"]=><br />

int(32897)


}<br />

["type"]=><br />

int(8)<br />

["decimals"]=><br />

int(0)<br />

}<br />

[1]=><br />

object(stdClass)#4 (13) {<br />

["name"]=><br />

string(4) "_two"<br />

["orgname"]=><br />

string(0) ""<br />

["table"]=><br />

string(0) ""<br />

["orgtable"]=><br />

string(0) ""<br />

["def"]=><br />

string(0) ""<br />

["db"]=><br />

string(0) ""<br />

["catalog"]=><br />

string(3) "def"<br />

["max_length"]=><br />

int(5)<br />

["length"]=><br />

int(5)<br />

["charsetnr"]=><br />

int(8)<br />

["flags"]=><br />

int(1)<br />

["type"]=><br />

int(253)<br />

["decimals"]=><br />

int(31)<br />

}<br />

Prepared statements<br />

Example #2 Prepared statements metadata


บรรณานุกรม<br />

http://www.php5-tutorial.com/<br />

http://www.php.net/manual/en/mysqli.quickstart.php

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!