PHP 5 & MySQLi
PHP 5 & MySQLi
PHP 5 & MySQLi
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