session เข้ามาช่วยในการจดจำผู้ใช้
Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts
December 6, 2012
PHP: ระบบสมาชิก - log in, log out
labels:
PHP
by
mementototem
คราวก่อน เขียนถึงระบบสมาชิกส่วนแรกซึ่งก็คือ การสมัครสมาชิก คราวนี้มาดูการ log in กับ log out กันบ้าง เริ่มต้นจากสร้างแบบฟอร์มสำหรับ log in กันก่อน แบบฟอร์มก็แบบเดียวกับที่พบได้ตามเว็บไซต์ทั่วไป ส่วน .php ที่ใช้ในการ log in จะเริ่มต้นด้วยการตรวจสอบเบื้องต้นก่อนว่า ผู้ใช้ลืมกรอกข้อมูล หรือเปล่า
ถ้าทุกอย่างไม่มีปัญหาอะไร ก็มาตรวจสอบบัญชีผู้ใช้ในฐานข้อมูล โดยใช้การเชื่อมต่อผ่าน PDO เหมือนเดิม ซึ่งตอนที่ตรวจสอบรหัสผ่านนั้น ในตอนสมัครสมาชิก เราใช้การ hash และ salt ในการเก็บข้อมูลของรหัสผ่าน ในขั้นตอน log in เราก็จะต้องแปลงรหัสผ่านให้กลายเป็น hash ที่ถูกต้องด้วย
ตอนนี้เราสามารถ log in เข้ามาได้แล้ว แต่ผู้ใช้ต้อง log in ใหม่ทุกครั้งเวลาเปลี่ยนหน้า อันนี้ต้องใช้
December 2, 2012
PHP: ระบบสมาชิก - สมัครสมาชิก
labels:
PHP
by
mementototem
งานการทำงานด้านเว็บด้วยภาษาฝั่งเซิฟเวอร์ มักจะมีความเกี่ยวข้องกับระบบฐานข้อมูลอยู่เสมอ ๆ หนึ่งในนั้นคือ ระบบสมาชิก เว็บหลายเว็บในปัจจุบัน มีการเชื่อมต่อระบบสมาชิกเข้ากับ social network ต่าง ๆ เพื่อความสะดวกให้กับผู้ใช้ แต่ผู้ใช้บางคนอาจจะไม่ต้องการผูกบัญชีของ social network เข้ากับบางเว็บ ด้วยเหตุผลต่าง ๆ นานา ระบบสมาชิกจึงยังจำเป็นอยู่
ตอนแรกขอพูดถึงการสมัครสมาชิกก่อน แล้วตอนต่อไปจะว่ากันเรื่องการ log in และ log out เพราะถ้ายังไม่สมัครสมาชิกก่อน ก็ log in ไม่ได้...
ในระบบสมาชิก สิ่งที่จำเป็นจริง ๆ มีอยู่ 2 อันคือ ชื่อผู้ใช้ และ รหัสผ่าน แต่ควรจะมี อีเมล เพื่อใช้ในการติดต่อกับสมาชิกไว้ด้วย
จะขอข้ามไม่พูดถึงเรื่องการสร้างฐานข้อมูล และตาราง แต่จะบอกแค่ชื่อ และโครงสร้างของตาราง นอกจากนั้น ใช้ความรู้เรื่อง PHP และ PDO เขียนสคริปท์ PHP กันเอาเอง หรือไม่ก็ใช้เครื่องมือจัดการฐานข้อมูลอย่าง phpMyAdmin (MySQL), phpPgAdmin (PostgreSQL) หรือตัวอื่น ๆ ตามแต่ละชนิดฐานข้อมูลกันตามสะดวก
เมื่อฐานข้อมูลพร้อมแล้ว ก็สร้างแบบฟอร์มสำหรับสมัครสมาชิกขึ้นมาก่อน เมื่อมีคนมาสมัครสมาชิก ข้อมูลจะถูกส่งมายัง regis.php ก็ต้องตรวจสอบค่าให้ถูกต้องเรียบร้อยก่อนว่าผู้ใช้กรอกข้อมูลครบถ้วนสมบูรณ์ดี หากผิดพลาดก็แจ้งเตือนกลับไป เมื่อตรวจสอบข้อมูลเรียบร้อยแล้ว หากไม่มีอะไรผิดพลาดก็เชื่อมต่อกับฐานข้อมูล และตรวจสอบว่ามีใครใช้ชื่อนี้ไปก่อนหรือยัง เพราะชื่อบัญชีห้ามซ้ำกัน
ตอนแรกขอพูดถึงการสมัครสมาชิกก่อน แล้วตอนต่อไปจะว่ากันเรื่องการ log in และ log out เพราะถ้ายังไม่สมัครสมาชิกก่อน ก็ log in ไม่ได้...
ในระบบสมาชิก สิ่งที่จำเป็นจริง ๆ มีอยู่ 2 อันคือ ชื่อผู้ใช้ และ รหัสผ่าน แต่ควรจะมี อีเมล เพื่อใช้ในการติดต่อกับสมาชิกไว้ด้วย
จะขอข้ามไม่พูดถึงเรื่องการสร้างฐานข้อมูล และตาราง แต่จะบอกแค่ชื่อ และโครงสร้างของตาราง นอกจากนั้น ใช้ความรู้เรื่อง PHP และ PDO เขียนสคริปท์ PHP กันเอาเอง หรือไม่ก็ใช้เครื่องมือจัดการฐานข้อมูลอย่าง phpMyAdmin (MySQL), phpPgAdmin (PostgreSQL) หรือตัวอื่น ๆ ตามแต่ละชนิดฐานข้อมูลกันตามสะดวก
เมื่อฐานข้อมูลพร้อมแล้ว ก็สร้างแบบฟอร์มสำหรับสมัครสมาชิกขึ้นมาก่อน เมื่อมีคนมาสมัครสมาชิก ข้อมูลจะถูกส่งมายัง regis.php ก็ต้องตรวจสอบค่าให้ถูกต้องเรียบร้อยก่อนว่าผู้ใช้กรอกข้อมูลครบถ้วนสมบูรณ์ดี หากผิดพลาดก็แจ้งเตือนกลับไป เมื่อตรวจสอบข้อมูลเรียบร้อยแล้ว หากไม่มีอะไรผิดพลาดก็เชื่อมต่อกับฐานข้อมูล และตรวจสอบว่ามีใครใช้ชื่อนี้ไปก่อนหรือยัง เพราะชื่อบัญชีห้ามซ้ำกัน
November 22, 2012
PHP: PDO กับฐานข้อมูล
ในการใช้ PHP ทำงานร่วมกับฐานข้อมูล จำเป็นต้องรู้ภาษา SQL เสียก่อน และต้องรู้ด้วยว่า ฐานข้อมูลที่ต้องทำงานด้วยนั้นเป็นระบบไหน เพราะ PHP มีคำสั่งเฉพาะสำหรับฐานข้อมูลแต่ละระบบแยกกันอยู่
แต่เมื่อมีเทคโนโลยีมากขึ้นระบบฐานข้อมูลมีความหลากหลายมากขึ้น ความคล่องตัวในการย้ายฐานข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่งก็ยุ่งยากขึ้น ทาง PHP จึงสร้าง extension ชื่อ PDO (PHP Data Objects) ขึ้นมาเพื่อเป็นตัวกลางในการจัดการฐานข้อมูล โดยโปรแกรมเมอร์แทบไม่ต้องสนใจว่า ระบบฐานข้อมูลที่จะทำงานร่วมกันเป็นแบบไหน
การเชื่อมต่อกับระบบฐานข้อมูลผ่าน PDO ก็ให้สร้างออปเจ็กของคลาสขึ้นมา ตัวอย่างข้างต้นใช้ MySQL แต่ถ้าต้องการเปลี่ยนเป็นอย่างอื่นก็แก้ไขบรรทัดที่ 12 ให้เป็นระบบฐานข้อมูลนั้น ๆ หากไม่มีการใช้คำสั่ง SQL ที่จำเพาะต่อระบบฐานข้อมูลนั้น ๆ ก็จะไม่ต้องแก้ไขโค้ดในส่วนอื่น ๆ อีก ส่วนการปิดการเชื่อมต่อนั้น ตามหลักแล้ว PHP จะปิดการเชื่อมต่อให้โดยอัตโนมัติเมื่อจบสคริปท์ แต่หากต้องการสั่งเองก็ใช้ เมื่อเชื่อมต่อกับฐานข้อมูลได้แล้ว ก็สามารถใช้คำสั่ง SQL จัดการกับฐานข้อมูลได้ 2 วิธี คือ
แต่เมื่อมีเทคโนโลยีมากขึ้นระบบฐานข้อมูลมีความหลากหลายมากขึ้น ความคล่องตัวในการย้ายฐานข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่งก็ยุ่งยากขึ้น ทาง PHP จึงสร้าง extension ชื่อ PDO (PHP Data Objects) ขึ้นมาเพื่อเป็นตัวกลางในการจัดการฐานข้อมูล โดยโปรแกรมเมอร์แทบไม่ต้องสนใจว่า ระบบฐานข้อมูลที่จะทำงานร่วมกันเป็นแบบไหน
การเชื่อมต่อกับระบบฐานข้อมูลผ่าน PDO ก็ให้สร้างออปเจ็กของคลาสขึ้นมา ตัวอย่างข้างต้นใช้ MySQL แต่ถ้าต้องการเปลี่ยนเป็นอย่างอื่นก็แก้ไขบรรทัดที่ 12 ให้เป็นระบบฐานข้อมูลนั้น ๆ หากไม่มีการใช้คำสั่ง SQL ที่จำเพาะต่อระบบฐานข้อมูลนั้น ๆ ก็จะไม่ต้องแก้ไขโค้ดในส่วนอื่น ๆ อีก ส่วนการปิดการเชื่อมต่อนั้น ตามหลักแล้ว PHP จะปิดการเชื่อมต่อให้โดยอัตโนมัติเมื่อจบสคริปท์ แต่หากต้องการสั่งเองก็ใช้ เมื่อเชื่อมต่อกับฐานข้อมูลได้แล้ว ก็สามารถใช้คำสั่ง SQL จัดการกับฐานข้อมูลได้ 2 วิธี คือ
- สั่งโดยตรงผ่านฟังชั่น
exec()และquery() - ใช้ฟังชั่น
prepare()และexcute()
July 25, 2012
PHP: Send mail
labels:
PHP
by
mementototem
การใช้ PHP ส่งเมลนั้นทำได้ง่ายมาก อาจจะเป็นภาษาที่ส่งเมลได้ง่ายที่สุดในบรรดาภาษาคอมพิวเตอร์ที่มีอยู่ในโลก ฟังชั่นที่ใช้ส่งเมลคือ
แต่ถ้าต้องการระบุอีเมลที่ใช้ส่ง รวมทั้งการใช้เนื้อหาในอีเมลเป็น HTML จะต้องใส่
mail()
mail ( $to, $subject, $message [, $headers[ , $additional_param] ] )
พารามิเตอร์ที่จำเป็นมีอยู่ 3 ตัว และพารามิเตอร์เสริม 2 ตัว คือ
$toที่อยู่อีเมลผู้รับ$subjectหัวข้อของอีเมล$messageเป็นเนื้อหาของอีเมล$headersเป็นพารามิเตอร์เสริม เอาไว้กำหนดหัวเมลเพิ่มเติม$additional_paramเป็นพารามิเตอร์เสริม สำหรับส่งค่าให้กับโปรแกรมส่งเมล (ไม่ค่อยได้ใช้)
\r\n (เหมือนการขึ้นบรรทัดใหม่ในโปรแกรมของฝั่ง Windows) แทนที่จะใช้ \n อย่างเดียว ไม่ว่าจะส่งจาก OS ที่เป็น Windows หรือ Linux
แค่นี้ก็จบแต่ถ้าต้องการระบุอีเมลที่ใช้ส่ง รวมทั้งการใช้เนื้อหาในอีเมลเป็น HTML จะต้องใส่
$headers ลงไปด้วย
ข้อจำกัดของอีเมลที่ควรรู้ไว้คือ
- แนบ JavaScript ลงไปไม่ได้ (ที่จริงก็แนบได้ แต่โปรแกรมอ่านเมลทั้งหลายปิดการทำงานของ JavaScript ทิ้งเพื่อความปลอดภัย)
- หากใช้ CSS จะต้องแทรกลงไปในเนื้อหาอีเมล ไม่สามารถแนบเป็นไฟล์ภายนอกไปได้
- หากต้องการแทรกรูปภาพจะต้องใช้พาธเต็ม แต่หากไม่จำเป็นก็ไม่ควรจะใส่ลงไป
July 4, 2012
PHP: Session และสิ่งที่แตกต่างจาก Cookie
labels:
PHP
by
mementototem
ในการเขียนโปรแกรมทั่ว ๆ ไป เราสามารถเก็บข้อมูลของผู้ใช้ เช่น ชื่อ ข้อมูลของแต่ละขั้นตอนที่ผู้ใช้ได้ทำลงไปในตัวแปรแบบปกติได้ แต่สำหรับการเขียนโปรแกรมสำหรับเว็บนั้นทำแบบนั้นไม่ได้ เพราะ URL ไม่สามารถบ่งบอกตัวผู้ใช้ และไม่สามารถเก็บข้อมูลตัวแปรได้ (ยกเว้นจะใช้ GET ซึ่งไม่ปลอดภัยสักเท่าไหร่ เพราะถ้ามีใครรู้ URL ก็สามารถปลอมตัวเป็นคน ๆ นั้นได้ มันคงไม่สนุก ถ้าเขาปลอมเป็นเรา แล้วโอนเงินในธนาคารออกไปจนหมด) PHP จึงสร้างตัวแปรพิเศษขึ้นมาคือ
จะใช้ session ต้องประกาศก่อน และต้องทำก่อนที่จะส่งข้อมูลใด ๆ ออกมา ไม่ใช่นั้นจะเจอข้อความ headers already sent เวลาเรียกใช้ก็เรียกใช้เหมือนอาเรย์ปกติ ผ่านทางตัวแปร
session
session ต่างจากตัวแปรปกติตรงที่ เมื่อจบการประมวลผล ค่าของมันจะไม่ถูกทำลายเหมือนตัวแปรปกติ แต่จะถูกทำลายเมื่อผู้ใช้ออกจากเว็บแทน
จะใช้ session ต้องประกาศก่อน และต้องทำก่อนที่จะส่งข้อมูลใด ๆ ออกมา ไม่ใช่นั้นจะเจอข้อความ headers already sent เวลาเรียกใช้ก็เรียกใช้เหมือนอาเรย์ปกติ ผ่านทางตัวแปร
$_SESSION ซึ่งเป็นตัวแปรชนิด superglobal
หากต้องการลบค่านั้นออกจาก session สามารถสั่ง unset ทีละตัวหรือทำลาย session นั้นทิ้งไปเลยก็ได้ แต่ถึงจะไม่ทำลาย ถ้าผู้ใช้ออกจากเว็บข้อมูลใน session ก็ถูกทำลายอยู่ดี
โดยทั่วไปแล้ว session จะคล้าย ๆ กับ cookie คือเก็บข้อมูลของผู้ใช้ไว้เหมือน ๆ กัน ต่างกันตรงที่ว่า
- cookie จะส่งข้อมูลนั้นกลับเป็นไฟล์ไปยังเบราว์เซอร์ และเก็บไว้ที่ฝั่งผู้ใช้ด้วย แต่ session ส่ง UID ของ session ไปอย่างเดียว ข้อมูลยังอยู่ฝั่งเซิฟเวอร์
- cookie เก็บข้อมูลไว้เป็นไฟล์ข้อความธรรมดา สามารถเปิดขึ้นมาแก้ไขได้ หากรู้วิธี
- cookie จะยังคงอยู่แม้ว่าจะออกจากเว็บไปแล้ว (เพราะเก็บอยู่บนเครื่องผู้ใช้) เมื่อกลับเข้ามาใหม่ ก็สามารถเรียกใช้ข้อมูลเหล่านั้นได้อยู่
- หากต้องการเก็บข้อมูลใน session เอาไว้ ต้องเขียนลงไฟล์ หรือฐานข้อมูลเอาเอง
June 4, 2012
PHP: ว่าด้วยเรื่อง Cookie
labels:
PHP
by
mementototem
Cookie
คุกกี้ใช้ในการอ้างถึงอัตลักษณ์ (identity) ของผู้ใช้ อาจจะเป็น username การตั้งค่าการแสดงผล หรือข้อมูลอื่น ๆ ที่ไม่จำเป็นต้องใช้ระบบสมาชิกคุกกี้จะเป็นไฟล์ข้อความขนาดเล็กที่เก็บอยู่ฝั่ง client และถูกส่งไปยังเซิฟเวอร์ทุกครั้งที่มีการร้องขอ (request) หน้าเว็บ และ PHP สามารถ สร้าง เรียกใช้ เปลี่ยนค่า และลบทิ้งตัวแปรในคุกกี้ได้
การสร้างคุกกี้ใน PHP จะต้องสร้างก่อนที่จะส่ง output ใด ๆ ออกไป ไม่เช่นนั้นอาจเจอปัญหา headers already sent ได้
setcookie(string $name, string $value, int $expire = 0, string $path);ด้านบนแสดงเฉพาะพารามิเตอร์ที่น่าสนใจ ถ้าต้องการดูพารามิเตอร์ทั้งหมดดูได้จาก function.setcookie$name: ชื่อคุกกี้ เป็นพารามิเตอร์ที่จำเป็นตัวเดียวของฟังชั่นนี้$value: ค่าของคุกกี้$expire: อายุของคุกกี้ ถ้าไม่กำหนดไว้ค่าจะเป็น 0 ซึ่งจะหมดอายุทันทีที่เบราว์เซอร์ถูกปิด$path: พาธบนเซิฟเวอร์ที่จะให้เข้าถึงคุกกี้ได้ หากไม่กำหนดจะเป็น / ซึ่งสคริปท์สามารถเข้าถึงได้ทั้งหมด ถ้าเป็น /board ก็เฉพาะสคริปท์ในไดเร็คทอรี่ /board เท่านั้นถึงจะเข้าถึงได้ เป็นต้น
$_COOKIE ซึ่งเป็นตัวแปรชนิด superglobal ส่วนการเปลี่ยนค่าก็ใช้ setcookie() ใส่ค่าใหม่ลงไป ลบทิ้งก็ใส่ $expire ให้ติดลบ ส่วนใหญ่ที่เห็นจะใช้ -3600 (1 ชั่วโมงที่แล้ว) ตามคู่มือของ PHP แต่ทำไมถึงใช้ค่านี้ อันนี้ผมไม่รู้นะในส่วนของฝั่งผู้ใช้จะทำผ่าน JavaScript ผู้ใช้แก้ไขโดยตรงไม่ได้ (ยกเว้นจะใช้โปรแกรมแก้ไขคุกกี้)
document.cookie = "cookie_name=cookie_value; expires=expire_time; path=usage_path";แต่การสั่งแบบนี้ไม่ค่อยสะดวกนัก แนะนำให้สร้างฟังชั่นขี้นมาใช้แทน อายุของคุกกี้จะขึ้นอยู่กับค่า expires หากยังไม่หมดอายุ ถึงจะปิดเบราว์เซอร์ไปแล้วคุกกี้ก็ยังอยู่ (แต่ถ้าสั่งเคลียร์คุกกี้ผ่านทางเบราว์เซอร์มันก็จะหายไปได้นะ)
April 3, 2012
PHP: แทรก/ดึงข้อมูลออกจากอาร์เรย์ที่เรียงลำดับ
ใน PHP ตัวแปรชุดแบบอาร์เรย์นั้นจะถูก implement ด้วย hash table ทั้งหมด นี่อาจเป็นข้อดีในแง่ความสะดวก แต่ถ้าหากเราลองทำอะไรอย่างนี้
จะพบว่าตัวที่ถูก
สำหรับ argument ที่ให้กับ
argument ตัวที่ 3 จะเป็นการบอกจำนวนของตัวแปรในอาร์เรย์ที่จะลบทิ้งตั้งแต่จุดเริ่มต้นที่ได้บอกไว้ (ถ้าไม่ใส่ก็คือลบทั้งหมด) ซึ่งถ้าตัวเลขนี้เป็นลบ มันจะเป็นการบอกจำนวนของตัวแปรที่เหลือจากการลบนี้แทน
ส่วน argument ตัวสุดท้ายคืออาร์เรย์ที่จะนำเข้ามาแทรกลงในตำแหน่งที่ลบไป และเนื่องจากเราไม่สามารถข้าม argument ตัวที่ 3 ได้ ดังนั้นถ้าต้องการลบอาร์เรย์ต้นฉบับทิ้งจนสุดแล้วค่อยต่อท้ายด้วยอาร์เรย์ใหม่ ให้ใส่ argument ตัวที่ 3 เป็น
อย่างไรก็ตาม แม้ว่าเราจะสามารถใช้เครื่องมือเหล่านี้เพื่อสร้างอาร์เรย์ที่รักษาการเรียงลำดับตัวเลขไว้ได้ แต่โดยพื้นฐานของมันแล้ว มันไม่ได้ implement มาเพื่องานเช่นนี้โดยเฉพาะ ถ้าต้องการทำงานเช่นนี้โดยที่ยังคงประสิทธิภาพไว้อยู่ อาจพิจรณาการ implement แบบ linked list แทนครับ
จะพบว่าตัวที่ถูก
unset ไปนั้น กลายเป็นรูโหว่ๆ อยู่กลางอาร์เรย์ โดยที่ index ของ element ใน array ไม่เลื่อนลงมาถมช่องโหว่ให้เต็ม
ทางแก้นอกจากเลี่ยงไปใช้การวนแบบ foreach แทนแล้ว ในสถานการณ์ที่เลข index มีความสำคัญ (ต้องเลื่อนไปถมให้เต็ม) ก็มี array_splice สำหรับงานนี้ครับ
สำหรับ argument ที่ให้กับ
array_splice จะมีอยู่ทั้งหมด 4 ตัว โดยบังคับใส่อย่างน้อย 2 ตัวได้แก่อาร์เรย์ที่จะเปลี่ยนแปลง และตำแหน่งเริ่มต้นที่จะลบตัวแปรในอาร์เรย์ทิ้งargument ตัวที่ 3 จะเป็นการบอกจำนวนของตัวแปรในอาร์เรย์ที่จะลบทิ้งตั้งแต่จุดเริ่มต้นที่ได้บอกไว้ (ถ้าไม่ใส่ก็คือลบทั้งหมด) ซึ่งถ้าตัวเลขนี้เป็นลบ มันจะเป็นการบอกจำนวนของตัวแปรที่เหลือจากการลบนี้แทน
ส่วน argument ตัวสุดท้ายคืออาร์เรย์ที่จะนำเข้ามาแทรกลงในตำแหน่งที่ลบไป และเนื่องจากเราไม่สามารถข้าม argument ตัวที่ 3 ได้ ดังนั้นถ้าต้องการลบอาร์เรย์ต้นฉบับทิ้งจนสุดแล้วค่อยต่อท้ายด้วยอาร์เรย์ใหม่ ให้ใส่ argument ตัวที่ 3 เป็น
count เพื่อให้มั่นใจว่าลบตัวแปรทิ้งจนหมดก็ได้อย่างไรก็ตาม แม้ว่าเราจะสามารถใช้เครื่องมือเหล่านี้เพื่อสร้างอาร์เรย์ที่รักษาการเรียงลำดับตัวเลขไว้ได้ แต่โดยพื้นฐานของมันแล้ว มันไม่ได้ implement มาเพื่องานเช่นนี้โดยเฉพาะ ถ้าต้องการทำงานเช่นนี้โดยที่ยังคงประสิทธิภาพไว้อยู่ อาจพิจรณาการ implement แบบ linked list แทนครับ
March 24, 2012
PHP: วัน และเวลา
labels:
PHP
by
mementototem
ฟังชั่นที่แสดงวัน และเวลาออกมาใน PHP จะใช้
สำหรับ
ฟังชั่นอื่น ๆ ที่เกี่ยวกับ วัน และเวลา ยังมีอีกมากสามารถอ่านเพิ่มได้จาก ref.datetime
date()string date ( string $format[, int $timestamp = time() ] )
$format เป็นตัวกำหนดให้แสดงวัน และ/หรือเวลาออกมาในรูปแบบต่าง ๆ สามารถรายละเอียดของตัวอักษรที่ใช้แสดงผลได้จาก function.date นอกจากจะเขียนรูปแบบเองแล้ว PHP ยังเตรียมรูปแบบที่ใช้บ่อย (ในงานเบื้องหลัง) ไว้ให้บางส่วน
DATE_RSS: รูปแบบที่ใช้สำหรับ RSS (Sat, 24 Mar 2012 12:23:34 +0700)DATE_COOKIE: รูปแบบที่ใช้สำหรับ cookie (Saturday, 24-Mar-12 12:23:34 ICT)DATE_W3C: รูปแบบตาม W3C (2012-03-24T12:23:34+07:00)
$timestamp ใช้สร้างวันเวลาขึ้นมาแสดงผล ผ่านฟังชั่น mktime() และ strtotime()
int mktime (
[ int $hour = date("H")
[, int $minute = date("i")
[, int $second = date("s")
[, int $month = date("n")
[, int $day = date("j")
[, int $year = date("Y") ]]]]]] )
int strtotime ( string $time [, int $now = time() ] )
ผลของทั้ง 2 ฟังชั่นเหมือนกันคือได้ unix timestamp เหมือนกัน แต่ mktime() จะรับค่าเป็นตัวเลขระบุเจาะจง ส่วน strtotime() จะรับค่าเป็นข้อความได้สำหรับ
$now ใน strtotime() คือ เวลาที่เริ่มต้นคำนวณ หากระบุค่าของ $time เป็นข้อความสัมพันธ์กับการเพิ่มลดเวลา
แม้ว่า strtotime() จะสามารถพิมพ์เป็นภาษาที่มนุษย์เข้าใจได้ทันที แต่ว่าให้ระวังเรื่อง วัน-เดือน-ปี ที่เป็นตัวเลขจำนวนน้อย ๆ เช่น 10-11-12 เพราะบอกยากว่าแท้ที่จริงแล้วเป็นวันที่เท่าไหร่กันแน่ ทาง PHP จะทึกทักเอาเองว่า ถ้าคั่นด้วย / จะเป็นแบบอเมริกัน (m/d/y) แต่ถ้าคั่นด้วย - หรือ . จะเป็นแบบยุโรป (d-m-y) ทางออกที่ดีคือใช้มาตรฐาน ISO 8601 (YYYY-MM-DD) แทนฟังชั่นอื่น ๆ ที่เกี่ยวกับ วัน และเวลา ยังมีอีกมากสามารถอ่านเพิ่มได้จาก ref.datetime
March 21, 2012
PHP: รับข้อมูลจาก form
labels:
PHP
by
mementototem
ในครั้งก่อน ๆ จะเป็นการทำงานเฉพาะส่วนของ PHP ไม่มีการรับค่าจากผู้ใช้ ส่วนอันนี้จะพูดถึงการรับค่าจากผู้ใช้ผ่าน
การส่งค่าจาก
ทั้ง
และสิ่งสำคัญอีกอย่างคือ ควรจะตรวจสอบความถูกต้อง (validation) ของค่าที่ได้จากผู้ใช้ และ/หรือแปลงค่า (cast) ให้ถูกต้องก่อนจะนำมาใช้งานเสมอ จะเต็มรูปแบบหรือคร่าว ๆ ก็แล้วแต่ความเหมาะสม และหากใช้ค่าที่รับมากับฐานข้อมูล หรือส่งต่อให้ระบบอื่น ๆ ควรจะเรียกใช้ฟังชั่น string escape ที่เกี่ยวข้องเสียก่อนทุกครั้ง ซึ่งจะป้องกันการโจมตีได้ระดับหนึ่ง
<form> ของ HTML กันบ้างการส่งค่าจาก
<form> จะส่งมายังเซิฟเวอร์ได้ 2 แบบคือ
get: ข้อมูลจะถูกส่งผ่าน URL ทำให้มองเห็นได้ทุกคน และจำกัดปริมาณการส่งpost: ข้อมูลที่ส่งจะมองไม่เห็น (ง่าย ๆ) และ (เกือบ) ไม่จำกัดปริมาณการส่ง (ขึ้นอยู่กับค่าpost_max_sizeในไฟล์ php.ini)
get ไป แต่ถ้าข้อมูลนั้นเป็นความลับ หรือมีปริมาณมาก ๆ ก็ส่งผ่าน post โดยกำหนดค่า method ส่วน action คือไฟล์ .php ที่จะให้ประมวลผลข้อมูลจาก <form> อันนี้
ส่วนการนำค่ามาใช้งานนั้นจะใช้ผ่าน $_GET สำหรับ get และใช้ $_POST สำหรับ post ซึ่งเป็น associative array มี key เป็น name ของ <input> อันนั้น ๆ
ทั้ง
$_GET และ $_POST ถือเป็นตัวแปรแบบ superglobal ที่เรียกใช้ได้ทุกที่ตลอดเวลา แตกต่างจากตัวแปรแบบ global ตรงที่ไม่ต้องใส่ global นำก่อนจะใช้งาน
นอกจากนี้ยังมี $_REQUEST ที่เก็บค่าทั้งของ $_POST, $_GET และ $_COOKIE ไว้ด้วยกัน แต่เสี่ยงที่จะถูกโจมตี จึงไม่แนะนำให้ใช้
และสิ่งสำคัญอีกอย่างคือ ควรจะตรวจสอบความถูกต้อง (validation) ของค่าที่ได้จากผู้ใช้ และ/หรือแปลงค่า (cast) ให้ถูกต้องก่อนจะนำมาใช้งานเสมอ จะเต็มรูปแบบหรือคร่าว ๆ ก็แล้วแต่ความเหมาะสม และหากใช้ค่าที่รับมากับฐานข้อมูล หรือส่งต่อให้ระบบอื่น ๆ ควรจะเรียกใช้ฟังชั่น string escape ที่เกี่ยวข้องเสียก่อนทุกครั้ง ซึ่งจะป้องกันการโจมตีได้ระดับหนึ่ง
March 14, 2012
PHP: Function
labels:
PHP
by
mementototem
ฟังชั่น (function) จะแบ่งเป็น 2 ประเภทคือ
การสร้างฟังชั่น จะมีรูปแบบประมาณนี้ ตัวอย่างการสั่งพิมพ์ข้อความโดยไม่มีการส่งค่า และคืนค่า สำหรับการส่งค่าไปยังฟังชั่น สามารถสั่งได้ 2 แบบคือ
- ฟังชั่นที่มากับตัวภาษา (built-in function) เช่น
abs(),max(),min() - ฟังชั่นที่สร้างขึ้นเอง
การสร้างฟังชั่น จะมีรูปแบบประมาณนี้ ตัวอย่างการสั่งพิมพ์ข้อความโดยไม่มีการส่งค่า และคืนค่า สำหรับการส่งค่าไปยังฟังชั่น สามารถสั่งได้ 2 แบบคือ
- By Value เป็นส่งค่าของตัวแปรไปให้ ซึ่งค่าที่ถูกแก้ไขในฟังชั่นจะไม่ทำให้ค่าของตัวแปรที่ส่งเปลี่ยนแปลงไป
- By Reference เป็นส่งตำแหน่งอ้างอิงของตัวแปรไปให้ ซึ่งทำให้ค่าของตัวแปรที่ส่งเปลี่ยนแปลงไป การส่งค่าแบบ by reference จะใช้ & นำหน้าชื่อตัวแปร
return
return จะถือว่าเป็นการจบการทำงานของฟังชั่นนั้น เมื่อเจอ return โค้ดที่อยู่หลัง return จะไม่ถูกเรียกใช้งาน จึงสามารถนำไปประยุกต์ให้หยุดการทำงานของฟังชั่นเมื่อพบข้อผิดพลาดได้
ใช้ฟังชั่นเมื่อไหร่? ใช้เมื่อรู้สึกว่า จะต้องเขียนชุดคำสั่งเดิม ๆ มากกว่า 1 ครั้ง จำไว้ว่า โปรแกรมเมอร์นั้นขี้เกียจ เราจะไม่เขียนชุดคำสั่งเดิม ๆ ซ้ำเป็นครั้งที่ 2 (ที่จริง เพื่อให้แก้ไขจัดการง่าย ถ้าหากโค้ดมีบั๊ก แก้ที่เดียวจบ)
March 7, 2012
PHP: วนรอบ
labels:
PHP
by
mementototem
การวนรอบ (loop) ใน PHP มี 4 แบบ คือ
whileตรวจสอบ แล้วค่อยวนรอบdo...whileทำก่อน 1 ครั้งแล้วค่อยตรวจสอบforวนรอบตามจำนวนที่กำหนดforeachวนรอบตามจำนวน element ใน array
while
while จะตรวจสอบค่าก่อน หากเป็นจริง จึงวนทำตามคำสั่งภายใน หากเป็นเท็จก็จะไม่วนรอบนั้น ๆ มักใช้ในกรณีที่ไม่รู้จำนวนรอบที่แน่นอน หรือไม่ต้องการหาจำนวนรอบก่อนที่จะวน เช่น วนรอบแสดงข้อมูลจากไฟล์ หรือฐานข้อมูลเป็นต้น while สามารถเขียนได้ 2 แบบ เช่นเดียวกับ switchdo...while
do...while จะทำตามคำสั่งใน do ก่อน 1 ครั้งแล้วค่อยตรวจสอบ หากยังเป็นจริงก็ทำใน do อีก โดยทั่วไปแล้วแทบไม่ต่างจาก while เลย แต่การใช้ do...while เพื่อให้มั่นใจว่า คำสั่งใน loop จะถูกสั่งแน่ ๆ อย่างน้อย 1 ครั้ง
for
for จะวนตามจำนวนที่ระบุเอาไว้จนครบแล้วออกจากการวนรอบ มักใช้ในการวนรอบที่มีจำนวนแน่นอนซึ่งต่างจาก while และ do...while ที่มักใช้กับจำนวนรอบที่ไม่แน่นอน forสามารถเขียนได้ 2 แบบเหมือนกับ while
foreach
foreach ใช้ในการวนดูข้อมูลใน array เป็นหลัก เขียนได้ 2 แบบเช่นกัน
break และ continue
break จะเป็นการออกจากการวนรอบก่อนที่จะครบตามที่กำหนดไว้
continue จะข้ามรอบนั้น ๆ ไป แต่ยังวนรอบอยู่เหมือนเดิม
สรุปเรื่องคำสั่งทางเลือก
จากบทความเรื่องif...else และ switch กับเรื่องการวนรอบ จะเห็นว่า ใน PHP จะมีคำสั่ง หรือ syntax ทางเลือกอยู่หลายแบบ สรุปรวมเท่าที่เขียนมาทั้งหมดจะมี
if...elseที่ใช้if ():(ร่วมกับelse:และ/หรือelseif ():) และปิดด้วยendif;switchที่ใช้switch ():และปิดด้วยendswitch;whileที่ใช้while ():และปิดด้วยendwhile;forที่ใช้for ():และปิดด้วยendfor;foreachที่ใช้foreach ():และปิดด้วยendforeach;
February 25, 2012
PHP: Arrays
labels:
PHP
by
mementototem
Array คือ กลุ่มของตัวแปร ใน PHP แบ่งออกเป็น 3 กลุ่ม คล้าย ๆ กับภาษาอื่น คือ
เริ่มนับจาก 0 เป็น index ของ array ตัวแรก
จะใช้ คำ (key) แทน ตัวเลข (index) ทำให้มันมีความหมายในตัวเอง เข้าใจง่าย เรียกใช้ง่าย
พูดง่าย ๆ คือ การใช้ array เป็นค่าใน array อีกตัวหนึ่งนั่นเอง
- Numberic Array ใช้ตัวเลข (index) ระบุตำแหน่งใน array
- Associative Array ใช้คำบอกตำแหน่ง array ในบางภาษาเรียก array ลักษณะนี้ว่า dictionary
- Multidimensional Array เป็น array ซ้อน array
Numberic Arrays
เริ่มนับจาก 0 เป็น index ของ array ตัวแรก
Associative Arrays
จะใช้ คำ (key) แทน ตัวเลข (index) ทำให้มันมีความหมายในตัวเอง เข้าใจง่าย เรียกใช้ง่าย
Multidimensional Arrays
พูดง่าย ๆ คือ การใช้ array เป็นค่าใน array อีกตัวหนึ่งนั่นเอง
February 24, 2012
PHP: If... Else และ Switch
labels:
PHP
by
mementototem
If... Else...
คำสั่งทางเลือก If... Else ใน PHP จะใช้อยู่ 2 แบบ คือ if {} else และ if: else:
elseif ในแบบแรก สามารถเขียนแทนด้วย else if ได้ แต่จะทำงานช้ากว่า เพราะเป็นการแยกคำสั่งออกเป็น 2 คำสั่ง แต่ที่จะเป็นคำสั่งของ if อันแรกอันเดียวก็เป็น if 2 อัน และหากมีคำสั่งใน if แค่บรรทัดเดียวสามารถละ {} ได้ แต่ก็ต้องมั่นใจว่า อ่านโค้ดแล้วไม่งง ส่วนในแบบหลัง elseif ต้องติดกันเท่านั้น, ในแบบหลังนี้มักใช้ตอนที่เขียน PHP ร่วมกับ HTML หรือมีคำสั่งใน if... else เยอะมาก ๆ เพราะอ่านเข้าใจง่ายกว่า เช่น
แต่ถ้าต้องการคืนค่า หรือทำตามคำสั่งสั้น ๆ ง่าย ๆ สามารถใช้คำสั่ง ?: (ternary operator) แทนได้ โดยที่จะมีรูปแบบคือ
ทำการเปรียบเทียบ ? ถ้าเป็นจริงทำอันนี้ : ถ้าเป็นเท็จทำอันนี้
Comparison Operator
operator ในการเปรียบเทียบ จะมีเหมือน ๆ กับภาษาอื่นคือ == คือ เท่ากัน (แปลงค่าเปรียบเทียบกรณีตัวแปรต่างชนิดกัน === คือ เท่ากันทุกประการ (ถ้าตัวแปรต่างชนิดก็จะถือว่าไม่เท่ากัน) != และ <> คือ ไม่เท่ากัน !== คือ ค่าไม่เท่ากัน หรือ ต่างชนิดกัน < คือ น้อยกว่า > คือ มากกว่า <= คือ น้อยกว่า หรือเท่ากับ >= คือ มากกว่า หรือเท่ากับSwitch
ถ้าตรวจสอบค่าจากตัวแปรตัวเดียว ในรูปแบบต่าง ๆ สามารถใช้ switch แทน if... elseif ยาว ๆ ได้ ซึ่งโค้ดที่ได้จะอ่านง่ายกว่าด้วย เช่นและก็เหมือนกับ if... else ที่สามารถใช้รูปของ : ได้ด้วย คือ switch(ตัวแปรที่ต้องการ): ...(case: ต่าง ๆ)... endswitch;
และเนื่องจาก เมื่อ switch เจอ case ไหนแล้ว จะทำตาม case นั้นลงไปจนออกนอก switch หากไม่เจอคำสั่ง break; จึงประยุกต์ให้ตรวจสอบค่าหลาย ๆ ค่า แต่ทำคำสั่งเดียวกันได้ อย่างเช่น case: 'violet' และ case: purple จากตัวอย่างข้างบน
ถ้าสังเกต การเปรียบเทียบตัวแปรกับค่าคงที่ ผมจะให้ค่าคงที่ขึ้นก่อน รูปแบบนี้เรียกว่า Yoda Condition ข้อดีของมันคือ ถ้าเราเผลอใช้ = อันเดียวแทนที่จะเป็น == มันจะแจ้ง error ขึ้นมา แทนที่จะทำงานไปตามปกติ แล้วเกิดบั๊กที่ตรวจสอบได้ยาก แต่ข้อเสียคือ ทำให้การอ่านโค้ดไม่เป็นธรรมชาติ (ผู้ชาย เท่ากับ เพศ แทนที่จะเป็น เพศ เท่ากับ ผู้ชาย) ... ยกเว้นว่าจะชื่นชอบ Star War และเข้าใจท่าน Yoda เป็นอย่างดี...
แต่เราก็ไม่ควรจะใช้ Yoda Condition ในทุก ๆ ภาษา, บางภาษาเช่น Java ไม่อนุญาตให้กำหนดค่าตัวแปรในตอนเปรียบเทียบค่าอยู่แล้ว จึงไม่มีเหตุผลที่จะใช้ Yoda Condition แม้แต่น้อย
February 22, 2012
PHP: Operator
labels:
PHP
by
mementototem
Operator หรือ ตัวดำเนินการใน PHP จะเหมือนกับ C/C++ คือมี บวก ลบ คูณ หาร หารเอาเศษ เพิ่มขึ้นหนึ่ง และลดลงหนึ่ง
ควรระวังการใช้ เพิ่มขึ้นหนึ่ง(++) และลดลงหนึ่ง(--) ร่วมกับคำสั่งอย่างอื่นตรงนี้ด้วย แต่ถ้าสั่งเดี่ยว ๆ บรรทัดเดียวของมันเองก็ไม่ใช่ปัญหา จะแบบไหนก็ไม่ต่างกัน
การกำหนดค่า นอกจากจะใช้เครื่องหมาย = อย่างเดียวก็ใช้ร่วมกับ operator บวก ลบ คูณ หาร หารเอาเศษ ได้ด้วย หากเป็นการกระทำกับตัวมันเองและค่า หรือตัวแปรอื่น ๆ
ส่วนการเชื่อมต่อข้อความนั้น (string) จะใช้ . ในการเชื่อมข้อความเข้าด้วยกัน แต่ถ้าใช้ร่วมกับตัวแปรชนิดอื่นอย่าง boolean หรือ int ก็จะถูกแปลงมาให้เป็น string ก่อนที่จะเชื่อมต่อกับข้อความ
ควรระวังการใช้ เพิ่มขึ้นหนึ่ง(++) และลดลงหนึ่ง(--) ร่วมกับคำสั่งอย่างอื่นตรงนี้ด้วย แต่ถ้าสั่งเดี่ยว ๆ บรรทัดเดียวของมันเองก็ไม่ใช่ปัญหา จะแบบไหนก็ไม่ต่างกัน
การกำหนดค่า นอกจากจะใช้เครื่องหมาย = อย่างเดียวก็ใช้ร่วมกับ operator บวก ลบ คูณ หาร หารเอาเศษ ได้ด้วย หากเป็นการกระทำกับตัวมันเองและค่า หรือตัวแปรอื่น ๆ
ส่วนการเชื่อมต่อข้อความนั้น (string) จะใช้ . ในการเชื่อมข้อความเข้าด้วยกัน แต่ถ้าใช้ร่วมกับตัวแปรชนิดอื่นอย่าง boolean หรือ int ก็จะถูกแปลงมาให้เป็น string ก่อนที่จะเชื่อมต่อกับข้อความ
February 20, 2012
PHP: ตัวแปร
labels:
PHP
by
mementototem
ใน PHP ตัวแปรเป็นประเภท weak type (ไม่ต้องกำหนดชนิดตัวแปรก่อนกำหนดค่า) และ dynamic type (สามารถเปลี่ยนชนิดตัวแปรได้ด้วยการกำหนดค่าใหม่) โดยมีชนิดตัวแปรหลักอยู่ 8 ชนิด คือ
Boolean ที่เก็บค่า true (จริง) หรือ false (เท็จ) โดยไม่คำนึงถึงตัวใหญ่ตัวเล็ก (จะใช้ TRUE หรือ TrUe ก็ true เหมือนกัน) การแปลงเป็น boolean ใช้ (bool) หรือ (boolean)
Integer หรือ int เก็บค่าตัวเลข สามารถกำหนดเป็นเลขฐานสิบ ฐานแปด (ขึ้นต้นด้วย 0) ฐานสอง (ขึ้นต้นด้วย 0b — ต้องเป็น PHP5.4+) หรือฐานสิบหก (ขึ้นต้นด้วย 0x) ก็ได้ และกำหนดเครื่องหมาย - เพื่อให้เป็นค่าลบได้ ข้อจำกัดที่ควรรู้เกี่ยวกับ integer คือ ถ้า php ทำงานแบบ 32bit มันจะมีขนาด 32bit แต่ถ้าทำงานบนระบบ 64bit มันจะมีขนาด 64bit ถ้าค่ามีขนาดเกินที่ int จะเก็บได้ PHP จะแปลงชนิดตัวแปรจาก int เป็น float โดยอัตโนมัติ... การแปลงเป็น int ใช้ (int) หรือ (integer) หรือใช้ฟังชั่น intval() ก็ได้
Float (บางคนเรียก double) พูดง่าย ๆ คือ ตัวเลขที่มีจุดทศนิยม
String เก็บข้อความ โดยมี " (double quoted) หรือ ' (single qouted) ครอบข้อความนั้น ๆ โดย single quoted จะใส่ escape character ได้แค่ \' และ \\ นอกจากนั้นจะเป็นอย่างที่ใส่ ส่วน double quoted จะสามารถใส่ escape character ได้ครบ และสามารถดึงค่าตัวแปรออกมาแสดงได้ด้วย นอกจากนี้ยังมีกำหนดค่าตัวแปรโดย heredoc และ nowdoc ได้
Array เก็บค่าเป็นชุด ๆ ใน PHP สามารถเรียกโดยใช้ index ก็ได้ หรือจะใช้แบบ dictionary หรือ associated array (key => value) ก็ได้ เราสามารถใช้ array เก็บ array ได้ด้วยนะ แต่ระวังซ้อนกันเยอะจนงงเอง...
Object เป็น instance ของคลาส โดยทั่วไป เมื่อสร้างคลาสขึ้นมาแล้ว จะต้องสร้าง object ของคลาสเพื่อเรียกใช้งานฟังชั่นต่าง ๆ ภายในคลาสนั้น ๆ
นอกจากนี้ยังมี ชนิดตัวแปรแบบพิเศษอีก 2 ตัวคือ
Resources ซึ่งเป็นข้อมูลที่ได้จากแหล่งภายนอกอย่าง ฐานข้อมูล หรือไฟล์ จะต้องส่งให้ฟังชั่นที่เกี่ยวข้องดึงข้อมูลออกมาก่อนที่จะนำมาแสดงผล
NULL บ่งบอกว่า ไม่มีค่า ตัวแปรนั้น ไม่ได้ถูกกำหนดค่าใด ๆ ไว้ (หรืออีกนัยหนึ่งคือ ยังไม่มีตัวแปรนั้นเกิดขึ้น) สามารถแปลงเป็น NULL ได้โดย (unset) แต่ตัวแปร และค่าของตัวแปรยังอยู่นะ แค่คืนค่ากลับมาเป็น NULL เฉย ๆ (ทำไปเพื่อ?)
นอกจากนั้นยังมี ตัวแปรแบบ pseudo ที่มักเอาไว้เขียนเป็น doc ของฟังชั่นคือ
Mixed เป็นตัวแปรชนิดไหนก็ได้ (แต่ไม่ได้หมายความว่า "ตัวแปรทุกชนิด" นะ)
Number เป็นตัวเลข จะเป็น int หรือ float ก็ไม่เกี่ยง
Callback เป็น string แต่เป็น string ที่บอกชื่อฟังชั่น มักใช้ในฟังชั่นประเภท callback ที่ส่งค่าต่อให้ฟังชั่นที่เกี่ยวข้องทำงาน แล้วส่งค่ากลับมา
เราสามารถตรวจสอบชนิดของตัวแปรโดยใช้ฟังชั่น gettype()
เราสามารถใช้ var_dump() ที่แสดงข้อมูลทุกอย่างของตัวแปร และ print_r() เพื่อแสดงข้อมูลของตัวแปรให้อ่านได้ง่าย ๆ แต่ถ้า แสดงออกมาแล้วยังอ่านไม่รู้เรื่อง เพราะติดกันไปหมดก็ครอบส่วนนั้นด้วยแท็ก <pre> ครับ
ใน PHP มีการตรวจสอบค่าเฉพาะของตัวแปรอยู่หลายแบบ ซึ่งบางครั้งก็ดูเหมือนจะซ้ำซ้อนกัน เช่น
ผลที่ได้จะแสดงความแตกต่างระหว่าง empty() กับ isset() ลองสังเกตดูเองนะครับ ; )
แม้ว่า บางอันจะทำให้สับสนไปบ้าง เช่น -1 มีค่าเป็น true, กำหนดค่าตัวแปรเป็น null แต่ถูกมองว่า ไม่เคยมีตัวแปรนี้อยู่, หรือเรียกชนิดตัวแปรว่า float แต่พอสั่งแสดงชนิดตัวแปรกลับแสดงเป็น double แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์
Boolean ที่เก็บค่า true (จริง) หรือ false (เท็จ) โดยไม่คำนึงถึงตัวใหญ่ตัวเล็ก (จะใช้ TRUE หรือ TrUe ก็ true เหมือนกัน) การแปลงเป็น boolean ใช้ (bool) หรือ (boolean)
Integer หรือ int เก็บค่าตัวเลข สามารถกำหนดเป็นเลขฐานสิบ ฐานแปด (ขึ้นต้นด้วย 0) ฐานสอง (ขึ้นต้นด้วย 0b — ต้องเป็น PHP5.4+) หรือฐานสิบหก (ขึ้นต้นด้วย 0x) ก็ได้ และกำหนดเครื่องหมาย - เพื่อให้เป็นค่าลบได้ ข้อจำกัดที่ควรรู้เกี่ยวกับ integer คือ ถ้า php ทำงานแบบ 32bit มันจะมีขนาด 32bit แต่ถ้าทำงานบนระบบ 64bit มันจะมีขนาด 64bit ถ้าค่ามีขนาดเกินที่ int จะเก็บได้ PHP จะแปลงชนิดตัวแปรจาก int เป็น float โดยอัตโนมัติ... การแปลงเป็น int ใช้ (int) หรือ (integer) หรือใช้ฟังชั่น intval() ก็ได้
Float (บางคนเรียก double) พูดง่าย ๆ คือ ตัวเลขที่มีจุดทศนิยม
String เก็บข้อความ โดยมี " (double quoted) หรือ ' (single qouted) ครอบข้อความนั้น ๆ โดย single quoted จะใส่ escape character ได้แค่ \' และ \\ นอกจากนั้นจะเป็นอย่างที่ใส่ ส่วน double quoted จะสามารถใส่ escape character ได้ครบ และสามารถดึงค่าตัวแปรออกมาแสดงได้ด้วย นอกจากนี้ยังมีกำหนดค่าตัวแปรโดย heredoc และ nowdoc ได้
Array เก็บค่าเป็นชุด ๆ ใน PHP สามารถเรียกโดยใช้ index ก็ได้ หรือจะใช้แบบ dictionary หรือ associated array (key => value) ก็ได้ เราสามารถใช้ array เก็บ array ได้ด้วยนะ แต่ระวังซ้อนกันเยอะจนงงเอง...
Object เป็น instance ของคลาส โดยทั่วไป เมื่อสร้างคลาสขึ้นมาแล้ว จะต้องสร้าง object ของคลาสเพื่อเรียกใช้งานฟังชั่นต่าง ๆ ภายในคลาสนั้น ๆ
นอกจากนี้ยังมี ชนิดตัวแปรแบบพิเศษอีก 2 ตัวคือ
Resources ซึ่งเป็นข้อมูลที่ได้จากแหล่งภายนอกอย่าง ฐานข้อมูล หรือไฟล์ จะต้องส่งให้ฟังชั่นที่เกี่ยวข้องดึงข้อมูลออกมาก่อนที่จะนำมาแสดงผล
NULL บ่งบอกว่า ไม่มีค่า ตัวแปรนั้น ไม่ได้ถูกกำหนดค่าใด ๆ ไว้ (หรืออีกนัยหนึ่งคือ ยังไม่มีตัวแปรนั้นเกิดขึ้น) สามารถแปลงเป็น NULL ได้โดย (unset) แต่ตัวแปร และค่าของตัวแปรยังอยู่นะ แค่คืนค่ากลับมาเป็น NULL เฉย ๆ (ทำไปเพื่อ?)
นอกจากนั้นยังมี ตัวแปรแบบ pseudo ที่มักเอาไว้เขียนเป็น doc ของฟังชั่นคือ
Mixed เป็นตัวแปรชนิดไหนก็ได้ (แต่ไม่ได้หมายความว่า "ตัวแปรทุกชนิด" นะ)
Number เป็นตัวเลข จะเป็น int หรือ float ก็ไม่เกี่ยง
Callback เป็น string แต่เป็น string ที่บอกชื่อฟังชั่น มักใช้ในฟังชั่นประเภท callback ที่ส่งค่าต่อให้ฟังชั่นที่เกี่ยวข้องทำงาน แล้วส่งค่ากลับมา
เราสามารถตรวจสอบชนิดของตัวแปรโดยใช้ฟังชั่น gettype()
เราสามารถใช้ var_dump() ที่แสดงข้อมูลทุกอย่างของตัวแปร และ print_r() เพื่อแสดงข้อมูลของตัวแปรให้อ่านได้ง่าย ๆ แต่ถ้า แสดงออกมาแล้วยังอ่านไม่รู้เรื่อง เพราะติดกันไปหมดก็ครอบส่วนนั้นด้วยแท็ก <pre> ครับ
ใน PHP มีการตรวจสอบค่าเฉพาะของตัวแปรอยู่หลายแบบ ซึ่งบางครั้งก็ดูเหมือนจะซ้ำซ้อนกัน เช่น
- empty() ตัวแปรนั้นว่างเปล่า (0, '', array(), false) หรือไม่
- isset() ตัวแปรนั้นถูกกำหนดค่าใด ๆ ที่ไม่ใช่ NULL หรือไม่
ผลที่ได้จะแสดงความแตกต่างระหว่าง empty() กับ isset() ลองสังเกตดูเองนะครับ ; )
แม้ว่า บางอันจะทำให้สับสนไปบ้าง เช่น -1 มีค่าเป็น true, กำหนดค่าตัวแปรเป็น null แต่ถูกมองว่า ไม่เคยมีตัวแปรนี้อยู่, หรือเรียกชนิดตัวแปรว่า float แต่พอสั่งแสดงชนิดตัวแปรกลับแสดงเป็น double แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์
February 3, 2012
PHP: เครื่องมือ มาตรฐานการเขียนโค้ด และคอมเมนต์
labels:
PHP
by
mementototem
ทำงานกับ PHP
ในการทำงานกับ PHP สามารถใช้เพียง Text Editor ต่าง ๆ (แต่ต้องเป็น Plain Text Editor เป็นพวก Word Processor อย่าง MS Office Word อันนี้ใช้ไม่ได้) แต่ถ้ามี Syntax Hilighter ก็จะช่วยให้มองโค้ดได้ง่ายขึ้น อย่างเช่น Notepad2-Mod, Notepad++, gEdit (GNOME), Kate (KDE) หรือ Vim (เว็บเรามีสอนใช้ Vim ด้วยนะ) เป็นต้น
แต่ถ้าต้องการความสามารถเพิ่มขึ้นอย่างการจัดการโค้ด และ Auto Complete ก็มีโปรแกรมที่เป็น IDE อย่าง eclipse+PDT หรือ Netbean อันนี้ขึ้นอยู่กับความชอบ ความต้องการของแต่ละคน
นอกจากโปรแกรมฟรี และโปรแกรมโอเพนซอร์สที่พูดมาข้างต้น ยังมีโปรแกรมที่เป็นลิขสิทธิ์อีกหลายโปรแกรม ซึ่งมีความสามารถแตกต่างกันไปให้เลือกอีกมากมาย
เมื่อมีเครื่องมือเขียนโค้ดแล้ว ก็ต้องมีที่ไว้รันโค้ด อาจจะเป็นโฮสต์ที่รองรับ PHP ที่มีอยู่แล้ว หรือจะทดสอบบนเครื่องตัวเองก็มีโปรแกรมเว็บเซิฟเวอร์อยู่
บน Windows สามารถใช้ AppServ หรือ XAMPP (Portable) หรือ Zend Server CE
ส่วนบน ลินุกซ์ ให้ติดตั้ง Apache, PHP, MySQL Server (สำหรับฐานข้อมูล) (โดยทั่วไปจะเรียกรวมว่า LAMP) ผ่านทาง Package Manager ได้โดยตรง (สะดวกซะ)
ถ้าบน Mac OSX ก็มี MAMP
ถ้าใครใช้ Windows แต่อยากได้สภาพแวดล้อมเป็นลินุกซ์ สามารถที่จะติดตั้ง VM อย่าง Virtual Box แล้วติดตั้งลินุกซ์ (แบบไม่มี GUI) ตั้งค่านิดหน่อย แล้วใช้เป็น Web Server เพื่อทดสอบก็ได้เช่นกัน
มาตรฐานการเขียนโค้ด
การเขียนโค้ดตามภาษาต่าง ๆ จะมีข้อบังคับ ซึ่งทุกคนต้องปฏิบัติตาม ถ้าไม่ปฏิบัติตามโค้ดจะรันไม่ผ่าน และมาตรฐานการเขียนโค้ด ซึ่งถึงไม่ปฏิบัติตามโค้ดก็ยังทำงานได้ตามปกติ
มาตรฐานโค้ดมีไว้เพื่อให้การอ่านโค้ด และนักพัฒนาทำงานร่วมกันได้ง่ายขึ้น แต่ทั้งนี้ทั้งนั้น มาตรฐานของแต่ละที่อาจจะไม่เหมือนกัน อันนี้ขึ้นอยู่กับกลุ่ม และบริษัทที่เราอยู่ เช่น มาตรฐานโค้ดของ Drupal จะไม่เหมือนกับของ WordPress และทั้งคู่ก็ไม่ตรงกับมาตรฐานของ PHP
การที่เราจะยึดมาตรฐานใดในการทำงาน ก็ต้องดูว่า เราทำงานกับกลุ่มไหน ก็ให้ยึดมาตรฐานของกลุ่มนั้น ถ้าในบริษัทก็ควรจะมีข้อตกลงของบริษัทนั้น ๆ โค้ดที่ได้จะเหมือน ๆ กันทั้งหมด แต่ถ้าตั้งกลุ่มขึ้นมาเอง ก็หาข้อตกลงกันในกลุ่มเสีย ส่วนทำงานคนเดียว ก็ต้องใช้มาตรฐานเดียวกันในทุก ๆ โปรเจ็ค
แต่ก็ใช่ว่า มันจะเปลี่ยนแปลงไม่ได้เลย วันเวลาเปลี่ยนไป อาจจะถึงเวลาเปลี่ยนมาตรฐานกันบ้าง ก็ไม่แปลกอะไร ยึดหลัก แต่อย่ายึดติด
เปิด/ปิดเท็กสำหรับ PHP
ก่อนจะเขียน PHP จะต้องมีแท็กเปิดก่อน ซึ่งที่นิยมกันจะมี <?php และ <? ส่วนตัวแนะนำให้ใช้แบบเต็มคือ <?php
ถ้าต้องการปิดแท็กก็ใช้ ?> แต่ถ้าไฟล์นั้นทั้งไฟล์เป็น PHP หรือ โค้ดส่วนท้ายไม่ได้มีส่วนผสมของ HTML ก็สามารถละ ?> ปิดท้ายไฟล์ได้ การทำแบบนี้จะทำให้ไม่มีปัญหา header already sent ในกรณีมีมีวรรคหรือบรรทัดเปล่า ๆ อยู่ท้ายเอกสารได้ด้วย
คอมเมนต์
รูปแบบการคอมเม้นต์โคดใน PHP ไม่ต่างกับภาษาอื่นมากนักนอกจากนี้ยังมี PHPDoc ที่ใช้ในการอธิบายการทำงานของ Class/Function จะใช้ /** */ การเขียน PHPDoc จะช่วยให้โปรแกรม IDE สามารถดึงข้อมูลส่วนนี้ไปแสดงเวลาเรียกใช้ฟังชั่นได้ด้วย
ถ้าต้องการคอมเมนต์โค้ดที่ยาว ๆ ซับซ้อน เพื่อการทดสอบการทำงาน ไม่แนะนำให้ใช้รูปแบบการคอมเมนต์แบบด้านบน แต่ให้ใช้ if (0) { ส่วนที่ต้องการคอมเมนต์ } แทน เพราะถ้ามีคอมเมนต์อยู่ในโค้ดก็ไม่ต้องสั่งคอมเมนต์หลาย ๆ รอบ
(ตัวอย่างไม่ซับซ้อนเท่าไหร่เลย...)
January 20, 2012
PHP: ทำความรู้จักกับ PHP
labels:
PHP
by
mementototem
คุณ neizod ถามว่าสนใจจะลองเขียนดูไหม ผมเลยลองกับ PHP เพราะคิดว่าเป็นภาษาที่ถนัดที่สุด (ถ้าไม่นับ HTML/CSS นะ)
PHP เป็นภาษาที่ใช้ในงานด้านเว็บเพจ เพื่อสร้างหน้าเว็บแบบไดนามิค และทำงานฝั่งเซิฟเวอร์เป็นหลัก แต่ก็สามารถทำงานบน command line ได้ ทำงานเป็นโปรแกรม GUI แบบ standalone (WinBinder/PHP-GTK) ก็ได้ ถ้า... บ้าพอ
PHP ทำงานแบบ interpreter (แปลทีละบรรทัด ขณะทำงาน) และมีภาษาที่ใกล้เคียงคือ ASP ของ Microsoft
PHP นั้นใช้ระบบตัวแปรแบบ Dynamic Typing (เปลี่ยนชนิดตัวแปรขณะที่ทำงานได้) และ Weak Typing (เปลี่ยนชนิดของค่าในตัวแปรอัตโนมัติ, ไม่จำเป็นต้องกำหนดชนิดตัวแปรก่อนแปลงค่า) สามารถเขียนได้ทั้งแบบ Functional และแบบ OOP ถ้าเขียนสคริปท์สั้น ๆ จะใช้ functional ก็ได้ แต่ถ้าเป็นโปรเจ็คขนาดใหญ่แนะนำให้ใช้แบบ OOP
PHP รุ่นล่าสุด (official) ตอนที่เขียนคือ 5.3.9 แต่ก็ต้องดูด้วยว่าเซิฟเวอร์ที่เราใช้นั้น ใช้ PHP รุ่นไหนอยู่
เมื่อเรียบร้อยแล้วก็เปิด Text Editor ขึ้นมาใช้ตามสะดวก แล้วพิมพ์
บันทึกเป็นไฟล์ชื่อ
แถม: ถ้าต้องการดูรายละเอียดของเว็บเซิฟเวอร์ที่ใช้ รวมทั้งรุ่นของ PHP ให้ใช้
PHP เป็นภาษาที่ใช้ในงานด้านเว็บเพจ เพื่อสร้างหน้าเว็บแบบไดนามิค และทำงานฝั่งเซิฟเวอร์เป็นหลัก แต่ก็สามารถทำงานบน command line ได้ ทำงานเป็นโปรแกรม GUI แบบ standalone (WinBinder/PHP-GTK) ก็ได้ ถ้า... บ้าพอ
PHP ทำงานแบบ interpreter (แปลทีละบรรทัด ขณะทำงาน) และมีภาษาที่ใกล้เคียงคือ ASP ของ Microsoft
PHP นั้นใช้ระบบตัวแปรแบบ Dynamic Typing (เปลี่ยนชนิดตัวแปรขณะที่ทำงานได้) และ Weak Typing (เปลี่ยนชนิดของค่าในตัวแปรอัตโนมัติ, ไม่จำเป็นต้องกำหนดชนิดตัวแปรก่อนแปลงค่า) สามารถเขียนได้ทั้งแบบ Functional และแบบ OOP ถ้าเขียนสคริปท์สั้น ๆ จะใช้ functional ก็ได้ แต่ถ้าเป็นโปรเจ็คขนาดใหญ่แนะนำให้ใช้แบบ OOP
ประวัติโดยย่อ
- 1994: คุณ Rasmus Lerdoft ให้กำเนิด PHP ในฐานะสคริปท์ของ Perl ที่ชื่อว่า Personal Home Page Tools
- 1995: PHP ถูกเขียนใหม่โดยใช้ภาษา C แบบ CGI เป็นรุ่น 1.0 โดยมีฟังชั่นพื้นฐานเหมือนกับ PHP ปัจจุบัน, ใช้ตัวแปรแบบ Perl, ฝัง HTML ลงไปได้, รองรับฟอร์ม
- 1997: คุณ Zeev Suraski และ Andi Gutmans เขียน parser ของ PHP ใหม่ และใช้เป็นฐานของ PHP 3 และเปลี่ยนชื่อเป็นแบบ recursive ว่า PHP: Hypertext Preprocessor ซึ่งปล่อยออกมาในปี 1998
- 1999: สร้าง Zend Engine (Zend เป็นคำที่มาจาก Zeev และ Andi)
- 2000: ปล่อย PHP4 ใช้ Zend Engine 1.0
- 2004: ปล่อย PHP5 ใช้ Zend Engine II และสนับสนุน OOP
PHP รุ่นล่าสุด (official) ตอนที่เขียนคือ 5.3.9 แต่ก็ต้องดูด้วยว่าเซิฟเวอร์ที่เราใช้นั้น ใช้ PHP รุ่นไหนอยู่
Hello World
PHP นั้นเน้นการทำงานบนเว็บเซิฟเวอร์เป็นหลัก ถ้ามีโฮสต์ที่รองรับ PHP อยู่แล้วก็ทดลองอัพโหลดไฟล์ และเรียกใช้ผ่านเบราว์เซอร์ได้ แต่ถ้ายังไม่มี หากอยู่บน Windows แนะนำให้ติดตั้ง XAMPP (Portable) แต่หากใช้ Linux Distro ก็ติดตั้งแพ็กเก็จ Apache และ PHP ลงไปในเครื่องเมื่อเรียบร้อยแล้วก็เปิด Text Editor ขึ้นมาใช้ตามสะดวก แล้วพิมพ์
บันทึกเป็นไฟล์ชื่อ
hello.php แล้วอัพโหลด หรือเก็บไว้ในโพลเดอร์ที่ Apache สามารถเข้าถึงได้ (ถ้าเป็น XAMPP จะอยู่ที่ .../xampp/htdocs/ ถ้าเป็น Apache บน Linux ที่ไม่ได้ปรับแต่งอะไรจะเป็น /var/www/) เปิดเบราว์เซอร์ไปที่ http://localhost/hello.php (หากเก็บไว้ในไดเร็คทอรี่ย่อยอื่น ๆ ก็ต้องพิมพ์ให้ตามนั้น) เบราว์เซอร์จะแสดง Hello World! สีดำบนพื้นสีขาวให้ แถม: ถ้าต้องการดูรายละเอียดของเว็บเซิฟเวอร์ที่ใช้ รวมทั้งรุ่นของ PHP ให้ใช้
phpinfo()
Subscribe to:
Posts (Atom)