เนื้อหานี้ได้ถูกย้ายไปบ้านใหม่แล้ว
ไปกันเลย
บทนำเกี่ยงกับ Bluetooth (Introduction to Bluetooth)
1.1 ประวัติความเป็นมาของ Bluetooth
“Bluetooth ไม่ได้หมายถึง “ฟันสีฟ้า” หากแต่คือตำนานของกษัตริย์นักรบไว้กิ้งผู้ยิ่งใหญ่แห่งดินแดนสแกนดิเนเวีย”
เมื่อพันกว่าปีมาแล้ว ณ ดินแดนที่เป็นประเทศเดนมาร์กในปัจจุบันได้เคยเป็นที่ตั้งของอาณาจักร Jutland ซึ่งปกครองโดยกษัตริย์ Gorm ผู้ชรา ค.ศ.908 องค์มเหสีแห่งกษัตริย์ Gorm ได้ให้กำเนิดโอรส นามว่า Herald
รูปที่ 1.1 กษัตริย์ Harald Bluetooth ปี ค.ศ. 940-981
(ที่มาของรูป : http://www.siamphone.com/news/bluetooth/page.htm)
ก่อนอื่นที่เราจะมาบิดเจ้ารูบิคเราต้องมาทำความรู้จักกับมันก่อนนะครับ
ส่วนประกอบ โดยรูบิค นี้จะประกอบไปด้วย
เรียกชื่อแต่ละด้าน
การหมุนแต่ละด้านนั้นเราจะมีสัญลักษณ์ที่เป็นสากลนะครับเค้าเรียกกันว่า
Notation
อักษรตัวใหญ่ คือ หมุนทิศตามเข็มนาฬิกา
‘ คือ หมุนทิศทวนเข็มนาฬิกา
2 คือ หมุน 2 ครั้ง
อักษรตัวเล็ก คือ หมุนด้านนั้น ๆ 2 ชั้นพร้อมกัน
| สัญลักษณ์ | ก่อนหมุน | ไม่มีอักษรเพิ่ม | ‘ | 2 | อักษรตัวเล็ก |
| U | |||||
| F | |||||
| R | |||||
| B | |||||
| L | |||||
| D | |||||
| M | |||||
| E | |||||
| S | |||||
| x(หมุนทั้งลูก) | |||||
| y(หมุนทั้งลูก) | |||||
| z(หมุนทั้งลูก) |
การเปิดปิดแท็ก PHP (PHP Code Syntax)
|
รูปแบบแท็ก |
เปิดแท็ก PHP |
ปิดแท็ก PHP |
|
แบบมาตรฐาน |
<?php |
?> |
|
แบบสั้น |
<? |
?> |
|
แบบ ASP |
<% |
%> |
รูปแบบคำสั่ง (PHP Statement)
<HTML>
<BODY>
<?php
echo “Hello, World!!”;
?>
</BODY>
</HTML>
ตัวแปร (Variables)
o การประกาศตัวแปร
§ การประกาศตัวแปรเริ่มต้นด้วยเครื่องหมาย $ (Dollar sign)
§ ชื่อตัวแปรต้องเริ่มต้นด้วยตัวอักษรภาษาอังกฤษหรือเครื่องหมายขีดล่าง (underscore “_”)
§ ตัวอย่างการประกาศตัวแปรที่ถูกต้อง:
$total
$_cell1
$length_of_string
§ ตัวอย่างการประกาศตัวแปรที่ผิด:
total
$1_total
$2_length
o การกำหนดค่าให้ตัวแปร
§ กำหนดค่าเป็นตัวเลข:
<?php
$total = 10;
?>
§ การกำหนดค่าเป็นข้อความ (string) ให้ใช้ quotes (”) หรือ single quote (’):
<?php
$example1 = ‘This is a single quoted string’;
$example2 = “This is a double quoted string”;
?>
§ ข้อแตกต่างระหว่าง quotes (”) กับ single quote (’):
<php
$total = 10;
$example1 = ‘The total is $total’;
$example2 = “The total is $total”;
?>
ผลการกำหนดค่าให้ตัวแปร $example1: “The total is $total”
ผลการกำหนดค่าให้ตัวแปร $example2: “The total is 10″
§ การนำข้อความ (string) มาเชื่อมต่อกันโดยใช้จุด “.” :
<php
$a = ‘apples’;
$b = ‘bananas’;
$c = ”;
$c = $a . ‘ and ‘ . $b;
?>
ผลการกำหนดค่าให้ตัวแปร $c: “apples and bananas”
§ การนำข้อความ (string) มาเชื่อมต่อกันโดยใช้ “.=” :
<php
$a = ‘apples’;
$a .= ‘ and bananas’;
?>
ผลการกำหนดค่าให้ตัวแปร $a: “apples and bananas”
อักขระต้องห้าม (Escaping Characters)
|
Character |
Escaped Character |
Description |
|
ไม่มี |
n |
Adds a linefeed |
|
ไม่มี |
r |
Adds a carriage return |
|
ไม่มี |
t |
Adds a tab |
|
|
\ |
Backslash |
|
$ |
$ |
Dollar Sign |
|
“ |
” |
Double Quote |
อาร์เรย์ (Arrays)
o อาร์เรย์ คือ ตัวแปรชนิดหนึ่งที่สามารถเก็บค่าได้หลายค่าในเวลาเดียวกัน
§ การสร้างอาร์เรย์ให้เรียกใช้ฟังก์ชั่น array()
§ อาร์เรย์จะถูกชี้ตัวแหน่งโดยคีย์
§ การสร้างอาร์เรย์:
$shoppingList = array( 1 => “toothpaste”, 2 => “sun cream”, 3 => “band-aids”);
§ การแสดงค่าจากอาร์เรย์:
echo “The third item in the shopping list is $shoppingList[3];”
ผลลัพธ์: “The third item in the shopping list is band-aids”
คำสั่งควบคุม (Control Structures)
if
if ($apples > $bananas) echo “You have more apples than bananas!”;
if … else
if ($apples > $bananas) echo “You have more apples than bananas!”;
else if ($apples == $bananas) echo “You have apples less than or equal to bananas!”;if … else if … else
if ($apples > $bananas) echo “You have more apples than bananas!”;
else if ($apples == $bananas) echo “You have apples equal to bananas!”;
else echo “You have less apples than bananas!”;
ตัวดำเนินการ (Operators)
|
Operator |
ความหมาย |
|
== |
เท่ากับ (Equal to) |
|
!= |
ไม่เท่ากับ (Not equal to) |
|
<> |
ไม่เท่ากับ (Not equal to) |
|
< |
น้อยกว่า (Less than) |
|
> |
มากกว่า (Greater than) |
|
<= |
น้อยกว่าหรือเท่ากับ (Less than or equal to) |
|
>= |
มากกว่าหรือเท่ากับ (Greater than or equal to) |
การใช้คำสั่งควบคุมและตัวดำเนินการ (Control Structures andOperators)
if ($apples > $bananas)
{
echo “You have more apples than bananas, so I’m taking away your bananas!”;
$bananas = 0;
}
การวนลูปแบบ for (for Loop)
o การใช้ fore สำหรับการวนลูปค่าทั้งหมดอาร์เรย์
<?php
$arrayAmpur = array( “เมื่อง” , “บางกรวย” , “บางใหญ่” );
for ( $i = 0; $i < count($arrayAmpur); $i ++)
{
echo ” $i : ” . $arrayAmpur[$i] . “<BR>”;
}
?>
ผลลัพธ์:
0 : เมื่อง
1 : บางกรวย
2 : บางใหญ่
การวนลูปแบบ foreach (foreach Loop)
o การใช้ foreach สำหรับการวนลูปค่าทั้งหมดอาร์เรย์
<?php
$arrayAmpur = array( “1201″ => “เมื่อง” , “1202″ => “บางกรวย” );
foreach ( $arrayAmpur as $kAmpur => $vAmpur)
{
echo ” $kAmpur : $vAmpur <BR>”;
}
?>
ผลลัพธ์:
1201 : เมื่อง
1202 : บางกรวย
การวนลูปแบบ while (while Loop)
o การใช้ while สำหรับการวนลูปค่าทั้งหมดจากตาราง employees ของฐานข้อมูล
<?php
$rs = mysql_query(”SELECT * FROM employees”);
while ( $row_rs = mysql_fetch_array($rs) )
{
echo “Employee ID: ” . $row_rs[’employeeid’] . “<BR>”;
echo “First Name: ” . $row_rs[’firstname’] . “<BR>”;
echo “Last Name: ” . $row_rs[’lastname’] . “<BR>”;
}
?>
ผลลัพธ์:
Employee ID: 26
First Name: David
Last Name: Beckham
ฟังก์ชั่น (Functions)
o ฟังก์ชั่นของ PHP (PHP Built-In Functions)
echo() เช่น echo(” Hello, World “)
print() เช่น print(” Hello, World “)
date() เช่น date(”Y-m-d H:i:s”)
substr() เช่น substr(”ABCDEF” , 0 , 4)
strlen() เช่น strlen(”ABCDEFGH”)
strpos() เช่น strpos(”ABCDEFGHI” , “DE”)
strtoupper() เช่น strtolower(”AbCdEfGh”)
strtolower() เช่น strtolower(”AbCdEfGh”)
trim() เช่น trim(” A B C “)
explode() เช่น explode(”|” , “ABC|DEF|GHI”)
list() เช่น list($a , $b , $c) = explode(”|” , “ABC|DEF|GHI”)
sprintf() เช่น sprintf(”%01.2f” , 5.56)
o ฟังก์ชั่นที่สร้างขึ้นเอง (PHP User-Defined Functions)
§ รูปแบบการประกาศฟังก์ชั่น
function function_name ( argument )
{
statement;
…..
}
§ ฟังก์ชั่นสำหรับตรวจสอบความยาวของข้อมูล:
<?php
function check_length($data) {
if (strlen($data) < 6) return “The data was too small”;
else return “That data was fine”;
}
?>
หากพารามิเตอร์มีขนาดสั้นกว่า 6 ตัวอักษร จะได้ผลลัพธ์: “The data was too small”
หากพารามิเตอร์มีขนาดไม่สั้นกว่า 6 ตัวอักษร จะได้ผลลัพธ์: ” That data was fine”
§ ฟังก์ชั่นนี้สามารถเรียกใช้ได้จากที่ใดๆ ในไฟล์ PHP
<?php
$example = “qwertyuiop”;
echo check_length($example);
?>
โดยวิธี GET หรือ POST สมมุติว่า เรามีฟอร์มสำหรับให้ผู้ใช้ป้อนชื่อ (login) และรหัสผ่าน (password) จากนั้นก็ส่งมายัง Webserver และใช้สคริปต์ PHP เป็นตัวจัดการกับข้อมูลที่ส่งมาโดยวิธีการแบบ POST ตามตัวอย่าง
|
ตัวอย่าง signin.php
|
|
<form action=”login.php” method=”post”> |
ภายในสคริปต์ login.php เราสามารถอ่านข้อมูลที่ส่งมาได้ ในกรณีนี้ ที่เราสนใจคือ ค่าจาก login และ password ที่อยูในฟอร์ม และสามารถจะอ่านข้อมูลเหล่านั้นได้ เพราะ PHP จะเก็บข้อมูลไว้ในตัวแปรชื่อ $login และ $password ตามลำดับ ตัวอย่างเช่น login.php อาจจะเป็นสคริปต์ง่ายๆดังนี้
|
ตัวอย่าง login.php
|
|
<HTML> |
เราสามารถอ่านข้อมูลที่ได้จากการส่งแบบ GET ได้เช่นกัน ตัวอย่างเช่น
|
ตัวอย่าง
|
|
<a href=”view.php?ID=103543564&mode=plaintext”> click </a> |
เมื่อผู้ใช้คลิ้กที่ link ก็จะติดต่อกับสคริปต์ที่ชื่อว่าview.php โดยผ่านข้อมูลสองตัวคือ ID และ mode ภายในสคริปต์ เราก็ใช้ $ID และ $mode สำหรับอ่านค่าของข้อมูลที่ส่งมา ในตัวอย่างนี้ $ID จะได้ค่าเป็น “103543564″ และ $mode ได้ค่า “plaintext”
อีกตัวอย่างหนึ่งที่แสดงให้เห็นการใช้ตัวแปรแบบ global ซึ่งเป็นตัวแปรที่ตัวแปลชุดคำสั่ง PHP ได้สร้างขึ้น ทุกครั้งที่ทำงาน หนึ่งในตัวแปรนั้นคือ $HTTP_USER_AGENT
|
ตัวอย่าง
|
|
<? |
จากตัวอย่าง เราสามารถใช้ตัวแปรดังกล่าวในการตรวจดูว่า ผู้ใช้ได้ใช้ web browser ตัวไหน เช่น ระหว่าง IE (Microsoft Explorer) หรือ Mozilla (Netscape)
ภาษาแบบ scripting language ในปัจจุบันหลายๆภาษาก็สนับสนุนการเขียนโปรแกรมเชิงวัตถุด้วย ตัวอย่างเช่น Perl และ PHP ก็รวมอยู่ในนั้นด้วย แม้ว่าจะไม่ซับซ้อนเหมือนอย่างภาษาซีพลัสพลัสหรือจาวาก็ตาม
คลาสคือโครงสร้างที่ประกอบด้วยสมาชิก (class members) หรือคุณสมบัติ (properties) ตามแต่จะเรียก และ ฟังก์ชันสมาชิก (member functions) การนิยามคลาสขึ้นมาใช้งานจะเริ่มด้วย class { … } โดยข้างในจะมีส่วนของตัวแปรสมาชิก และฟังก์ชันสมาชิกตามลำดับ ฟังก์ชันที่มีชื่อเดียวกับคลาสจะเรียกว่า class constructor ทุกครั้งที่มีการสร้างออปเจคจากคลาสโดยใช้คำสั่ง new ฟังก์ชันที่ทำหน้าที่เป็น class constructor ก็จะถูกเรียกมาทำงานก่อนทุกครั้ง ประโยชน์ของการใช้งานก็เช่น ใช้กำหนดค่าเริ่มต้น หรือเตรียมพร้อมก่อนที่จะเริ่มใช้ออปเจค
ลองดูตัวอย่าง การเขียนคลาสสำหรับแบบข้อมูลเชิงนามธรรม (Abstract Data Type) ที่เรียกว่า stack การทำงานของ stack ก็เป็นดังนี้ ถ้าเราใส่ข้อมูลเข้าไป ข้อมูลเหล่านั้นก็จะถูกเก็บไว้เสมือนกับว่า วางซ้อนกันจากข้างล่างขึ้นข้างบน ถ้าเราจะดึงข้อมูลออกมาใช้ก็จะได้ข้อมูลที่อยู่ข้างบนสุด ซึ่งก็คือข้อมูลที่เราใส่เข้าไปครั้งล่าสุดนั่นเอง หน้าที่ของ stack ที่สำคัญก็มีเช่น
|
Function
|
ความหมาย
|
|
push()
pop() is_empty()่ get_size() |
ใส่ข้อมูลไว้ใน stack ดึงข้อมูลออกมา ตรวจดูว่า stack มีข้อมูลอยู่อีกหรือไม่ หาจำนวนของข้อมูลที่ถูกเก็บไว้ใน stack |
การสร้างคลาส stack ในภาษา PHP ทำได้ดังตัวอย่างต่อไปนี้
|
ตัวอย่าง
|
|
<? function stack() { // class constructor function push($elem) { // put an element on stack function get_size() { // get number of elements stored function is_empty() { // is stack empty ? function pop() { // retrieve an element from the top of stack $inst = new stack; // create an object from stack class for ($i=0; $i < 10; $i++) { while (! $inst->is_empty() ) { echo “stack is “.($inst->is_empty() ? “empty.” : “not empty.”).”<BR>\n”; $inst = 0; // unuse this instance of class stack |
โปรดสังเกตว่า ตัวแปร $this ที่ปรากฎอยู่ในคลาสจะเหมือน this ที่เราใช้ในภาษาซีพลัสพลัส และการนิยามและสร้างฟังก์ชันสมาชิกจะทำภายในคลาสทั้งหมด (เหมือนในภาษาจาวา) PHP ยังสนับสนุนการสืบทอดคุณสมบัติของคลาส (inheritance) ทำให้เราสามารถสร้างคลาสขึ้นมาใหม่ โดยใช้คลาสที่มีอยู่เดิมและเพื่อส่วนขยายเข้าไป การสืบสอดคุณสมบัติจากคลาสหนึ่งไปยังอีกคลาสหนึ่ง จะใช้คำสั่ง extends คล้ายกับของภาษาจาวา ตามตัวอย่างดังนี้
|
ตัวอย่าง
|
|
<? function stack() { function push($elem) { function get_size() { function is_empty() { function pop() { // class LimitedStack is derived from class stack. class LimitedStack extends stack { function LimitedStack ($capacity = 10) { function is_full() { function push($elem) { $inst = new LimitedStack(5); |
คลาส LimitedStack นี้มีคุณสมบัติที่ได้รับมาจากคลาส stack แต่แตกต่างตรงที่ว่า เราได้กำหนดความจุ ของ LimitedStack เอาไว้ โดยตัวแปร $max_size ผู้ใช้จะต้องกำหนดขนาดความจุของออปเจคจากคลาส LimitedStack ก่อนใช้ ถ้าไม่กำหนดก็จะใช้ค่า 10 เป็นค่าความจุโดยอัตโนมัติตามตัวอย่าง (เป็น default parameter)
เมื่อมีการกำหนดความจุก็จะต้องมีการเขียนฟังก์ชันสมาชิกเพิ่มขึ้นอีก ชื่อ is_full() เพื่อตรวจสอบดูว่า จำนวนของข้อมูลใน stack เท่ากับความจุที่กำหนดไว้แล้วหรือไม่
โปรดสังเกตว่า PHP สนับสนุนการนิยามฟังก์ชันทับฟังก์ชันเดิมของคลาสที่ได้รับคุณสมบัติมา และสิ่งที่จะลืมไม่ได้คือ constructor จากคลาสลูก (child class) จะไม่เรียกใช้ constructor จากคลาสแม่ (parent class) จะต้องมีการเรียกใช้อย่างเจาะจง
ในกรณีที่เราสร้างอาร์เรย์สำหรับเก็บออปเจค เวลาจะใช้ออปเจคแต่ละตัว จะต้องใช้ตัวแปรช่วยตามตัวอย่างต่อไปนี้
|
ตัวอย่าง
|
|
<? function MyObj( $set_id) { function show() { // can create the array of objects // To access each object we must use help variable like follows: |
จากตัวอย่างเราใช้ตัวแปร $tmp ในการเข้าถึงออปเจคแต่ละตัวในถูกเก็บไว้ในอาร์เรย์ $obj_array เนื่องจากเราไม่สามารถเรียกใช้ฟังก์ชันของออปเจคได้โดยตรงถ้าออปเจคอยู่ในอาร์เรย์ เช่น $obj_array[0]->show();
การอ่านค่าสำหรับบ่งบอกวันเดือนปีและเวลาในปัจจุบัน เราสามารถใช้คำสั่ง date () ตัวอย่างเช่น แสดงวันเดือนปีของวันนี้
|
ตัวอย่าง
|
|
<? |
“Y-m-d” หมายถึงสตริงค์ที่กำหนดรูปแบบ (formatted string) ของการแสดงวันที่ ในกรณีนี้คือ ปีค.ศ.-เดือน-วัน ตามลำดับ จริงๆแล้วฟังก์ชัน date() จะต้องการอาร์กิวเมนต์สองตัวคือ สตริงค์ที่กำหนดรูปแบบ เช่น “Y-m-d” และค่าของ TimeStamp (integer) ในหน่วยเป็นวินาที นับตั้งแต่ 1 มกราคม 1970 ในกรณีที่เราไม่ได้กำหนด TimeStamp ก็จะหมายถึง TimeStamp เวลาในปัจจุบัน
ถ้าเราต้องการแสดงทั้งเวลาและวันเดือนปี ก็ต้องกำหนดรูปแบบของสตริงค์ใหม่ เช่น “D d F Y h:i:s” ซึ่งตัวอักษรแต่ละตัวจะมีความหมายและเป็นตัวบ่งบอกหน้าที่ เช่น d ใช้แทนที่วันในหนึ่งเดือน D ใช้แทนชื่อวันแบบย่อในเจ็ดวัน F ใช้แทนชื่อเดือนในทั้งหมด 12 เดือน Y แทนที่ปีค.ศ. เป็นเลขสี่หลัก h i s ใช้แทนชั่วโมง นาที และวินาทีตามลำดับ
|
ตัวอย่าง
|
|
<? |
ตัวอย่างฟังก์ชันที่เกี่ยวข้องกับการทำงานของสตริงค์ สองฟังก์ชันแรกที่เราจะทำความรู้จักคือ ฟังก์ชัน strtolower() และ strtoupper() ซึ่งมีหน้าที่คือ เอาไว้แปลงตัวอักขระภาษาอังกฤษให้เป็นตัวพิมพ์เล็ก หรือตัวพิมพ์ใหญ่ทั้งหมด ตามตัวอย่างต่อไปนี้
|
ตัวอย่าง
|
|
<? $answer = strtoupper(“Yes”); |
ประโยชน์ของฟังก์ชันทั้งสองที่เห็นได้ชัด คือ เอาไว้ใช้แปลงข้อความให้เป็นตัวพิมพ์ใหญ่หรือเล็กทั้งหมด ก่อนที่เราจะใช้ในการเปรียบเทียบข้อความ เช่น ผู้ใช้อาจจะใส่ข้อความไว้ใน $answer ว่า “Yes” “YeS” “yES” หรือ “YES” เป็นต้น แต่เราอยากรู้ว่า ผู้ใช้ใส่คำว่า yes หรือไม่ โดยไม่สนใจว่าจะเป็น ตัวพิมพ์ใหญ่หรือเล็ก ในกรณีนี้ เราก็แปลงให้เป็นตัวพิมพ์เล็กก่อน แล้วก็นำมาเปรียบเทียบ สมมุติว่า มีสตริงค์หรือข้อความอยู่แล้วต้องการจะแยกออกเป็นส่วนย่อยๆโดยใช้ตัวอักขระ หรือสตริงค์ที่มีอยู่ข้างในเป็นตัวแยก เราจะใช้ฟังก์ชัน explode() ตามตัวอย่างต่อไปนี้
|
ตัวอย่าง
|
|
<? |
จากตัวอย่างข้างบนเราใช้ “:” เป็นตัวแยกส่วนของข้อความว่า “ohh:users:/bash” และค่าที่ได้จากฟังก์ชัน explode() จะเป็น array ดังนั้น เราก็สามารถใช้ฟังก์ชัน list() เก็บส่วนของข้อความที่ถูกแยกแล้วได้
ในกรณีนี้มีสามส่วนและถูกแยกเก็บไว้ในตัวแปร $user $group และ $shell ตามลำดับ ฟังก์ชันที่ทำงานตรงกันข้ามกับฟังก์ชัน explode() คือฟังก์ชัน join ตัวอย่างการใช้งานมีดังนี้
|
ตัวอย่าง
|
|
<? |
การแปลง \n ให้เป็น <BR>
ฟังก์ชัน nl2br จะทำหน้าที่แปลง \n ให้เป็น <BR> สำหรับขึ้นบรรทัดใหม่ในเอกสาร HTML โดยอัตโนมัติ เช่น สมมุติว่า เราเปิดไฟล์และอ่านข้อความจากไฟล์นั้น แล้วต้องการจะแทรกข้อความเหล่านั้น เป็นบรรทัดๆ ลงในเอกสาร HTML เนื่องจากว่าในข้อความที่เป็นสตริงค์และมี ‘\n’ จบท้าย และเราต้องการจะแปลงให้เป็น <BR> เพื่อจัดหน้าเอกสารให้เหมาะสม เราก็ใช้ฟังก์ชันดังกล่าวช่วย
|
ตัวอย่าง
|
|
<? |
คำสั่งทั้งสองเอาไว้แทรกเนื้อหาจากไฟล์อื่นที่ต้องการ ข้อแตกต่างระหว่าง include และ require อยู่ตรงที่ว่า ในกรณีของการแทรกไฟล์ใช้ชื่อต่างๆ กันมากกว่าหนึ่งครั้งโดยใช้ลูป คำสั่ง require จะอ่านเพียงแค่ครั้งเดียว คือไฟล์แรก และจะแทรกไฟล์นี้เท่านั้นไปตามจำนวนครั้งที่วนลูป ในขณะที่ include สามารถอ่านได้ไฟล์ต่างๆ กันตามจำนวนครั้งที่ต้องการ
|
ตัวอย่าง
|
|
<? |
|
ตัวอย่าง include1.inc
|
|
สวัสดีพ่อแม่พี่น้อง<BR> |
|
ตัวอย่าง include2.inc
|
|
ว่ายังไงนะใครเป็นพี่น้องคุณ<BR> |
|
ตัวอย่าง การแทรกไฟล์ที่มีคำสั่งสคริปต์
|
|
<? |
|
ตัวอย่าง script.inc
|
|
<P> |
การแทรกไฟล์ภายในโครงสร้างของ if-else หรือ for-loop เป็นต้น มีข้อควรระวังเวลาใช้ คือ จะต้องใส่ { } เอาไว้ เพื่อให้อยู่ในบล็อกของโครงสร้าง
|
ตัวอย่าง
|
|
if ($version < 1.0) { |
ดังนั้นควรจะระมัดระวัง การแทรกไฟล์โดยใช้ include หรือ require ในตำแหน่งๆต่าง โดยเฉพาะอย่างยิ่งในกรณีที่ แทรกไฟล์ที่มีคำสั่ง PHP อยู่ด้วย
PHP Regular Expressions Regular Expression หรือเรียกสั้นๆ regex เป็นเครื่องมือที่มีประโยชน์มากในการค้นหาตัวอักษร คำ หรือ ข้อความรูปแบบต่างๆ ที่เราต้องการจากข้อความอื่นๆ เมื่อค้นหาได้แล้วเราก็อาจจะแทนที่ด้วยข้อความอื่นๆ ได้
การใช้ regex ไม่ได้มีเฉพาะใน PHP นะครับ อย่างใน text editor เช่น vi emacs หรือ ใน Perl VBscript และ shell program อย่างเช่น awk และ sed ก็มีเหมือนกัน แม้กระทั่งใน MySQL ก็มีเช่นกันครับ
Metacharacters
ถ้าคุณต้องการจะใช้ regex ละก็คงหนีไม่พ้นที่จะต้องทำความรู้จักกับ metacharacters ครับ เพราะนอกจากเราจะใช้ตัวอักษรและตัวเลขต่างๆ ในการสร้างรูปแบบ (pattern) ของตัวอักษรที่เราต้องการจะค้นหาแล้ว เราสามารถใช้ metacharacters มาช่วยสร้างรูปแบบอื่นๆ ที่มีความซับซ้อนมากขึ้นได้
เมื่อลองแบ่งประเภทของ Metacharacters อาจแบ่งได้ดังนี้
1. Metacharacters ที่เกี่ยวกับตำแหน่ง (Positioning)
| ^ | ใช้แทนรูปแบบที่ขึ้นต้นด้วยคำที่กำหนดในตำแหน่งเริ่มต้นของข้อความ เช่น “^the” จะตรงกับข้อความใดๆ ที่ขึ้นต้นด้วย the |
| $ | ใช้แทนรูปแบบที่ลงท้ายด้วยคำที่กำหนด เช่น “on the table$” จะตรงกับข้อความใดๆ ที่ลงท้ายด้วย on the table |
| . | ใช้แทนตัวอักษรใดๆ 1 ตัวอักษร ยกเว้น newline (\\n) เช่น “com.” จะ ตรงกับ com1 และ coms แต่จะไม่ตรงกับ telecom (เพราะไม่มีตัวอักษรใดต่อท้าย) |
2. Metacharacters ที่เกี่ยวกับจำนวนครั้งที่ปรากฏของตัวอักษร
| ? | แทนตัวอักษรว่าสามารถจะไม่ปรากฏหรือปรากฏ 1 ครั้ง เช่น ab? จะตรงกับ “a” หรือ “ab” (ตัว b จะไม่ปรากฏ หรือปรากฏ 1 ครั้ง) |
| * | แทนตัวอักษรว่าสามารถจะไม่ปรากฏหรือปรากฏได้หลายครั้ง เช่น ab* จะตรงกับ “a”, “ab”, “abb”, “abbb”, “abbbb” และ “abbbb…” |
| + | แทนตัวอักษรว่าสามารถจะต้องปรากฏ 1 ครั้ง หรือปรากฏได้หลายครั้ง เช่น ab+ จะตรงกับ “ab”, “abb”, “abbb”, “abbbb” และ “abbbb…” |
| {n} | เมื่อ n แทนจำนวนตัวเลข ความหมายก็คือ จะต้องปรากฏ n ครั้ง เช่น ab{4} จะตรงกับ “abbbb” เท่านั้น(b จะต้องปรากฏ 4 ครั้ง) |
| {n,} | เมื่อ n แทนจำนวนตัวเลข ความหมายก็คือ จะต้องปรากฏอย่างน้อย n ครั้ง เช่น ab{2, } จะตรงกับ “abb”, “abbb”, “abbbb” และ “abbbb…” |
| {n,m} | เมื่อ n และ m แทนจำนวนตัวเลข ความหมายคือ จะต้องปรากฏอย่างน้อย n ครั้งแต่ไม่เกิน m ครั้ง เช่น ab{2,5} จะตรงกับ “abb”, “abbbb” และ “abbbbb” เท่านั้น |
3. Metacharacters ที่กำหนดกลุ่มและช่วงของตัวอักษร
| [ ] | แทนตัวอักษรหนึ่งตัว ซึ่งจะปรากฏเป็นตัวอักษรตัวใดตัวหนึ่งใน [ ] เช่น [xy] จะตรงกับ “x”, “y”, “5x”, “abcdx” ถ้าไม่ปรากฏ x หรือ y อยู่เลยก็จะถือว่าไม่ตรง เช่น “qwert” |
| - | ใช้ร่วมกับ [ ] แทนช่วงของตัวอักษรหรือตัวเลข เช่น [a-e] จะตรงกับ “1234a”, “hello” แต่จะไม่ตรงกับ “HELLO” |
4. Metacharacters อื่นๆ
| ( ) | ใช้สำหรับจัดกลุ่มตัวอักษรเข้าด้วยกัน หรือกำหนดกลุ่มของรูปแบบย่อย เช่น a(bc)? จะตรงกับ a หรือ abc (ab จะไม่ปรากฏ หรือปรากฏ 1 ครั้ง) |
| \ | ใช้เป็น escape character และความหมายอื่นๆ เช่น ถ้าต้องการหา “*” ในข้อความจะต้องใช้ “\\*”
การใช้ baclslash ในอีกความหมายหนึ่งก็คือ ใช้แทน non-printing character เช่น \\a แทน alarm, BEL character (hex 07), \\n แทน newline (hex 0A) \\r แทน carriage return (hex 0D) และ \\t แทน tab (hex 09) เป็นต้น |
| | | ใช้เป็นทางเลือกว่าจะเลือกค่าที่อยู่ทางซ้ายหรือขวาของ | เช่น “gr(a|e)y” จะตรงกับคำว่า “gray” หรือ “grey” |
5. Metacharacters พิเศษที่แทนกลุ่มของตัวอักษรต่างๆ ซึ่งจะต้องใช้ใน bracket [ ] เสมอ
| [:alpha:] | จะตรงกับข้อความที่มีตัวอักษรใดๆ ตั้งแต่ a ถึง z หรือ A ถึง Z หรือเขียนได้เป็น [0-9a-zA-Z] ตรงกับ “ABC”, “abc”, “aBc” แต่จะไม่ตรงกับ “123″ |
| [:alnum:] | จะตรงกับข้อความที่มีตัวอักษรและตัวเลข (alphanumeric character) หรือเขียนได้เป็น [0-9a-zA-Z] ซึ่งเท่ากับ [[:alnum:]] เช่น “ab12″, “12d” แต่จะไม่ตรงกับ “&*” และ “:;” เป็นต้น |
| [:digit:] | จะตรงกับข้อความที่มีตัวเลขอย่างน้อยหนึ่งตัว เช่น “1″, “1a2b3c” แต่จะไม่ตรงกับ “abc” เป็นต้น |
| [:lower:] | จะตรงกับข้อความที่มีตัวอักษรตัวเล็กอย่างน้อยหนึ่งตัว (lowercase characters) เช่น “xyzabc” แต่จะไม่ตรงกับ “ABC”, “B123″ และ “123″ เป็นต้น |
| [:upper:] | จะตรงกับข้อความที่มีตัวอักษรตัวใหญ่อย่างน้อยหนึ่งตัว (lowercase characters) เช่น “XZabc”, “A23″ แต่จะไม่ตรงกับ “abc”, “a123″ และ “123″ เป็นต้น |
| [:space:] | จะตรงกับข้อความที่มี space อย่างน้อย 1 ตัว เช่น ” “, “a bc”, “12 3″ แต่จะไม่ตรงกับ “ab”, “abZX” และ “456″ เป็นต้น |
| [:print:] | จะตรงกับข้อความที่มีตัวอักษรใดๆ ที่สามารถแสดงออกมาได้ (printable character) เช่น “abcX”, “124″ และ ” ” แต่จะไม่ตรงกับ “\\n” (newline) |
| [:graph:] | จะตรงกับข้อความที่มี graphical character ยกเว้น space (” “) เช่น “abc”, “ab&” และ “1aA” แต่จะไม่ตรงกับ ” “ |
| [:xdigit:] | จะตรงกับข้อความที่มีเลขฐานสิบหก ได้แก่ a ถึง f , 0 ถึง 9 และ A ถึง F เช่น “1B”, “0A” แต่จะไม่ตรงกับ “XZ” เป็นต้น |
| [:punct:] | จะตรงกับข้อความที่มี punctuation อย่างน้อยหนึ่งตัว เช่น “a;”, “a23b?” แต่จะไม่ตรงกับ “abc”, “123″ และ “AB3″ เป็นต้น |
ลองมาดูตัวอย่างที่ซับซ้อนขึ้นมาหน่อยนะครับ
“id.[0-9]” จะตรงกับข้อความในรูปแบบ id ตามด้วยตัวอักษรใดๆหนึ่งตัวและตัวเลขอีกหนึ่งตัว
เช่น “ida1” “idx2” “idc5abc” “id3456″ และ แต่จะไม่ตรงกับ “id5x” เพราะ x ไม่ใช่ตัวเลขระหว่าง 1 ถึง 9
“^id.[0-9]$” จะตรงกับข้อความในรูปแบบ id ตามด้วยตัวอักษรใดๆหนึ่งตัวและตัวเลขอีกหนึ่งตัว
เช่น “ida1” “idx2” แต่จะไม่ตรงกับ “idc5abc” “id3456″ “dfidf6sdf” “id5x”
“^.{5}$” จะตรงกับข้อความที่มีตัวอักษรหรือตัวเลข 5 ตัวติดกันเท่านั้น
เช่น “abcde” “12345” “a1b2c” แต่จะไม่ตรงกับ “abcdef” “ab1″ “123a5bc” เป็นต้น
“a(bc)*” จะตรงกับข้อความที่มีตัวอักษร a อย่างเดียว หรือตามด้วย bc อย่างน้อย 1 ครั้ง
เช่น “a” “abc” “abcbc” “abcbcbc” แต่จะไม่ตรงกับ “abcb” เป็นต้น
“a(bc){2,4}” จะตรงกับข้อความที่มีตัวอักษร “abcbc” “abcbcbc” และ “abcbcbcbc” เท่านั้น และจะไม่ตรงกับ “abcbcbcbcbc”
“a(bc)?” จะตรงกับข้อความ “a” และ “abc” เท่านั้น
“[a-z]” จะตรงกับข้อความที่มีตัวอักษรตัวเล็กตั้งแต่ a ถึง z ในข้อความ
เช่น “x” “a456xcdf” “1234u” แต่จะไม่ตรงกับ “34116″ “@#$%” และ “ABC” เป็นต้น
“^[a-zA-Z]” จะตรงกับข้อความที่ขึ้นต้นด้วยตัวอักษรตัวเล็กหรือตัวใหญ่
เช่น “a999″ “A dog” และ “ABCD” แต่จะไม่ตรงกับ “2 dogs” “23sdfadg” เป็นต้น
จากตัวอย่างข้างบนถ้าเราเปลี่ยนเป็น “[^a-zA-Z]” ความหมายจะตรงกับข้อความอะไรก็ได้ที่มีตัวอักษรที่ไม่ใช่ตัวอักษรตัวเล็ก หรือตัวใหญ่ปนอยู่ด้วย เช่น “ab%Sd” “abc45” และ “Abc#” แต่ถ้าต้องการให้ตรงกับตัวอักษรตัวแรกของข้อความจะต้องไม่เป็นตัวอักษรตัว เล็กหรือใหญ่ จะต้องใช้รูปแบบเป็น “^[^a-zA-Z]” ซึ่งจะตรงกับ “12AB” และ “#ABc” แต่จะไม่ตรงกับ “ab%Sd” “abc45″ และ “Abc#” ส่วน “[^a-zA-Z]$” ก็จะหมายถึงข้อความอะไรก็ได้ที่ไม่ลงท้ายด้วยตัวอักษรตัวเล็กหรือตัวใหญ่ เช่น “AbcD2” และ “abcd%” เป็นต้น
“[0-9]%” จะตรงกับข้อความที่มีตัวเลขแล้วตามด้วย %
เช่น “90%” “90%df” “a4%” “ad7%” แต่จะไม่ตรงกับ “xx%” เป็นต้น
“[0-9][0-9]%” จะตรงกับข้อความที่มีตัวเลข 2 ตัวแล้วตามด้วย %
เช่น “90%” “90%z” “is 90%” แต่จะไม่ตรงกับ “xx%” “ad7%” เป็นต้น
“[0-9][0-9]%$” จะตรงกับข้อความที่มีตัวเลข 2 ตัวแล้วตามด้วย % เท่านั้น ซึ่งจะต้องไม่มีอะไรต่อท้ายเครื่องหมาย %
เช่น “90%” “is 90%” แต่จะไม่ตรงกับ “90%z” “xx%” “ad7%” เป็นต้น
สำหรับ brackets [ ] นั้นจะมีข้อควรระวังเมื่อเรานำ metacharacters เช่น ^ . [ ] $ * + ? { } เข้าไปไว้ใน brackets [ ] แล้วมันจะกลายเป็นตัวอักษรธรรมดาๆ ตัวหนึ่ง โดยความหมายของ metacharacters จะหายไป
ตัวอย่างเช่น “[*][0-9]” จะตรงกับข้อความที่มีตัว * แล้วตามด้วยตัวเลข เช่น “d9x*8x”
จากตัวอย่างที่แล้ว ถ้าเรานำเครื่องหมาย brackets [ ] ที่ครอบ * อยู่ออก ก็จะกลายเป็น “*[0-9]” ซึ่งเมื่อไม่มีเครื่องหมาย brackets อยู่แล้ว จะทำให้ * กลับไปเป็น metacharacters เช่นเดิม และเมื่อทดลองคำสั่งนี้ เราก็จะได้ error ออกมาเป็น Warning: REG_BADRPT…
เพื่อแก้ปัญหานี้เราสามารถนำ escape character ( \\ ) มาช่วย โดยการใส่ \\ เข้าไปข้างหน้า * ก็จะได้เป็น “\\*[0-9]” ซึ่งก็จะมีความหมายเท่ากับ “[*][0-9]” นั่นเองครับ
สำหรับ Metacharacters พิเศษที่แทนกลุ่มของตัวอักษรต่างๆ นั้นเราสามารถนำมาใช้กำหนดรูปแบบที่เราต้องการได้ เช่น ^[[:alpha:]] จะมีความหมายเท่ากับ ^[a-zA-Z] ในตัวอย่างที่ผ่านมา หรือเราสามารถเขียนในรูปแบบอื่นๆ ได้ เช่น ถ้าต้องการหาข้อความที่ประกอบด้วยตัวเลข 0 ถึง 9 หรือตัวอักษร a ถึง e ก็สามารถเขียนได้เป็น [[:digit:]a-e] ซึ่งจะตรงกับข้อความ เช่น “1″ “15″ “a” “b0abczvh” แต่จะไม่ตรงกับ “g” และ “hjvz” เป็นต้น
นอกจากนี้มีข้อที่ควรสังเกตอีกประการหนึ่งก็คือ เราสามารถนำเอา regex 2 อันมารวมกันได้ ซึ่งรูปแบบของการเปรียบเทียบก็จะตรงกับรูปแบบของการรวมกันนั้นๆ เช่น “[a-z][0-9]$” ก็จะตรงกับข้อความที่มีตัวอักษร 2 ตัวท้ายเป็นตัวอักษรตัวเล็กตามด้วยตัวเลข เช่น “ASDFz5” และ “1235d0” และก็จะไม่ตรงกับ “ABCD4″ เป็นต้น
ตัวอย่างการนำเอา regex หลายๆ ตัวมารวมกัน เช่น “[0-9]{2}-[0-9]{2}-[0-9]{4}” ซึ่งก็จะเป็นรูปแบบ xx-xx-xxxx โดยที่ x แต่ละตัวแทนตัวเลข เช่น 08-04-2002 เป็นต้น ซึ่งถ้าไม่ได้จัดเรียงตัวเลขรูปแบบนี้ก็จะไม่ตรงกับรูปแบบของ regex ที่กำหนด
ฟังก์ชันของ PHP ที่นำเอา regex ไปใช้ซึ่งได้แก่
ฟังก์ชันของ PHP ที่ใช้กับ Regular Expression
จากหน้าที่ผ่านมาจะมีเฉพาะตัวอย่างของ regex อาจจะทำให้เกิดความงุนงงสักหน่อยนะครับ ในส่วนนี้เราจะพูดถึงฟังก์ชันของ PHP ที่นำเอา regex ไปใช้ซึ่งได้แก่
ereg( ) มี syntax คือ int ereg (string pattern, string string [, array regs]) ความหมายก็คือค้นหารูปแบบ (pattern) ที่กำหนดใน string ที่ให้มา ถ้าคนพบรูปแบบที่กำหนดก็จะคืนค่า True ถ้าไม่พบหรือเกิดความผิดพลาด ก็จะคืนค่า False ตัวอย่างง่ายๆ เช่น
<?php
$text = “Hello”;
if (ereg(“^[0-9]“, $text)) {
echo “$text is valid.”;
} else {
echo “$text is invalid.”;
}
?>
จากตัวอย่างข้างต้น ฟังก์ชัน ereg จะคืนค่า false และจะพิมพ์ประโยค Hello is invalid. ออกมา
นอกจากนี้เรายังสามารถใช้ parenthesized substring ( ) มาช่วยในการดึงข้อความย่อย (substring) ค่าออกมาจาก $string หลังจากเจอรูปแบบที่ตรงกับที่กำหนด เช่น
<?php
$date = “08-04-2002″;
if (ereg(“([0-9]{2})-([0-9]{2})-([0-9]{4})”, $date, $regs)) {
$date = $regs[1];
$month = $regs[2];
$year = $regs[3] + 543;
echo “$date $month $year”;
} else {
echo “รูปแบบของวันที่ไม่ถูกต้องครับ!”;
}
?>
จากตัวอย่างข้างบน จะได้ผลลัพธ์ คือ “08 04 2545″ จะเห็นว่ามีตัวแปร $regs เพิ่มขึ้นมา (อาจจะตั้งเป็นชื่ออื่นๆ ได้) ตัวแปรนี้จะเป็นตัวแปร array ที่รับค่าต่างๆ จาก ( ) (parenthesized substring) โดยจะมีรูปแบบดังนี้
และถ้าหากมีวงเล็บอันที่สี่ซ้อน เพิ่มขึ้นมาอีกก็จะมีค่าเป็น $regs[4] เป็นเช่นนี้ต่อไปจนถึง $regs[9] ครับ รวมแล้วก็มีทั้งหมด 10 ตัวครับ
ตัวอย่างการดึงตัวเลข 4 ตัวที่ติดกันออกมาจากข้อความ
<?
$user_text = @$_POST["user_text"];
if (isset($user_text)) {
$user_text = htmlspecialchars(quotemeta($user_text));
echo “<b>ข้อความของคุณคือ</b>: $user_text<br>”;
if (ereg(“[0-9][0-9][0-9][0-9]“, $user_text, $regs)) {
echo “<b>ตัวเลขติดกัน 4 ตัวแรกที่พบคือ</b>: $regs[0]<br>”;
} else {
echo “ไม่พบตัวเลขติดกัน 4 ตัวตามรูปแบบที่กำหนด<br>”;
}
}
?>
ตัวอย่างการตรวจสอบความถูกต้องของ email
<?
function check_email($input_email) {
if( eregi( “^” .
“[a-z0-9]+([_\\\\.-][a-z0-9]+)*” . //user
“@” .
“([a-z0-9]+([\\.-][a-z0-9]+)*)+” . //domain
“\\\\.[a-z]{2,}” . //sld, tld
“$”, $input_email, $regs)
) { return TRUE; } else { return FALSE; }
}
if (isset($_POST["user_email"])) {
$user_email = $_POST["user_email"];
echo “<b>Email ที่คุณป้อนมาคือ</b>: $user_email<br>”;
if (check_email($user_email)) {
echo “<b>Email ที่คุณป้อนมีรูปแบบถูกต้องแล้วครับ</b>”;
} else {
echo “<b>Email ที่คุณป้อนมีรูปแบบไม่ถูกต้องครับ</b>”;
}
}
?>
PHP แต่เดิมย่อมาจาก Personal Home Page แต่ต่อมาก็เปลี่ยนเป็นย่อมาจาก PHP Hypertext Preprocessor ครับ แต่ก่อนจะอธิบายต่อไปก็คงต้องพูดถึง PHP ว่ามันมีความสำคัญยังไง และทำไมเราต้องให้ความสนใจมันด้วย
เคยได้ยินคำว่า Dynamic Web pages ไหมครับ? Dynamic Web pages ก็คือ เว็บเพจที่ไม่อยู่นิ่งและมีการเปลี่ยนแปลง มันเปลี่ยนแปลงในลักษณะที่มีการตอบโต้กับผู้ใช้หรือคนที่เข้ามาดูเว็บนั่นเองครับ ส่วนมันจะเปลี่ยนแปลงหรือตอบโต้กับผู้ใช้ยังไงนั้นก็แล้วแต่คนที่ทำเว็บจะกำหนดไว้ครับ
นอกจาก Dynamic Web pages แล้วเคยได้ยินคำว่า Static Web pages ไหมครับ? ถึงคุณจะตอบว่าเพิ่งได้ยินเป็นครั้งแรก แต่ผมบอกได้เลยว่าคุณน่าจะเคยสัมผัสหรือเข้าไปดูเว็บลักษณะนี้มาบ้างแล้ว ก็คือเป็นเว็บเพจที่เป็นยังไงก็เป็นอยู่อย่างนั้นไงครับ ไม่มีการโต้ตอบกับคนดู เพราะ Static แปลว่า คงที่ครับ เช่นเว็บพวกเอกสารสำคัญ เอกสารวิชาการต่างๆ
แต่เว็บเพจหลายๆ แห่งก็จัดว่าเป็น Static Web pages แต่ผู้สร้างใช้เทคนิคของ Dynamic Web pages มาสร้างได้เหมือนกันนะครับ เอ… แล้วอย่างนี้เว็บเพจที่มีเว็บมาสเตอร์คอยปรับปรุงข่าวต่างๆ ให้ทันสมัยอยู่ตลอดละครับ? เช่นมีการเปลี่ยนข่าวในหน้าแรกเป็นประจำอยู่ทุกๆ วัน เว็บเหล่านี้เป็น Dynamic หรือ Static Web pages ครับ? ลองคิดดูนะครับ
ทีนี้ Dynamic Web pages มันให้ประโยชน์ยังไง? เป็น Static Web pages อยู่ดีๆ แล้วทำไมต้องมาทำให้เป็น Dynamic ด้วย? ลองคิดถึง Amazon.com อีกทีนะครับ สมมติว่ามันเป็น Static Web pages แบบที่เรียกว่าไม่มีระบบฐานข้อมูลอะไรเลย ทุกอย่างถูกบันทึกอยู่ในกระดาษล้วนๆ เมื่อมีการรับคำสั่งซื้อหนังสือผ่านเว็บฟอร์ม พอคุณสั่งซื้อหนังสือเสร็จแล้ว ก็มีข้อความตอบมาทางเว็บว่า ขณะนี้เราได้รับคำสั่งซื้อของคุณแล้ว และพนักงานของเรากำลังทำการตรวจคำสั่งซื้อของท่าน เมื่อพนักงานเราทำการตรวจสอบเสร็จแล้วเราจะแจ้งกลับไปทาง email ที่ท่านให้มาอีกครั้งหนึ่ง
เบื้องหลังฉากการทำงานลักษณะนี้อาจจะเป็นดังนี้ครับ พนักงานคนหนึ่งนำคำสั่งซื้อของคุณที่พิมพ์ออกมาจากเครื่องพิมพ์ ตรวจสอบดูว่าคุณสั่งซื้อหนังสืออะไรมาบ้างและคุณสั่งมาอย่างละกี่เล่ม แล้วนำไปเช็คดูในคลังสินค้าว่ามีหนังสือตามที่คุณสั่งมาหรือเปล่า แต่ละเล่มราคาเท่าไหร่ คุณให้เค้าส่งให้แบบไหน? ธรรมดาหรือด่วน? ต้องบวกค่าขนส่งเข้าไปอีกเท่าใด เมื่อรวมภาษี เข้าไปแล้วยอดรวมเป็นราคาเท่าไหร่? แล้วพนักงานคนนี้ก็จัดแจงส่ง email แจ้งยอดรวมทั้งหมดตอบคุณกลับมา ทั้งหมดนี่อาจใช้เวลาไม่ถึงชั่วโมงหรือเป็นชั่วโมงหรือเป็นวันๆ ขึ้นอยู่กับคำสั่งซื้อของคุณและของคนอื่นๆ ที่สั่งเข้ามาพร้อมๆ กันว่ามีจำนวนมากน้อยแค่ไหน จะเห็นว่าใช้เวลาค่อนข้างมาก แน่นอนว่าการตรวจสอบใช้เวลามากๆ แบบนี้ย่อมไม่เป็นผลดีต่อธุรกิจครับ
แล้วในเมื่อปัจจุบันเรามีระบบคอมพิวเตอร์ มีระบบฐานข้อมูลอยู่แล้วทำไมเราจึงไม่นำมาใช้ เมื่อใครคนหนึ่งคิดได้ดังนั้น ก็เลยมีการเชื่อมโยงระบบฐานข้อมูลกับเว็บเพจเกิดเป็น Database-driven Web pages ขึ้นมาไงครับ
ขอย้อนกลับมาที่ระบบสั่งซื้อหนังสืออีกครั้งหนึ่งครับ เมื่อมีการนำระบบฐานข้อมูลเข้ามาใช้ร่วมกับเว็บเพจ ในระบบฐานข้อมูลก็จะมี รายชื่อหนังสือ ชื่อผู้แต่งของหนังสือแต่ละเล่ม ปีที่ตีพิมพ์ สำนักพิมพ์ ราคาและปริมาณที่มีอยู่ในคลังสินค้า อะไรอย่างนี้เป็นต้นครับ ทีนี้เมื่อมีการสั่งซื้อผ่านเว็บเพจเข้ามา คอมพิวเตอร์ก็จะทำการตรวจสอบ คิดราคา คิดยอดเงินทั้งหมด แล้วแจ้งผลให้คุณทราบผ่านทางเว็บเพจหลังจากที่คุณทำการสั่งซื้อแล้วทันที สะดวกและรวดเร็วกว่าขั้นตอนแรกไหมครับ และวิธีการในลักษณะนี้ก็ทำให้ประหยัดค่าใช้จ่ายด้วย เพราะไม่ต้องมาจ้างคนจำนวนมากมาคอยตรวจสอบความถูกต้องของคำสั่งซื้อ
แล้ว PHP เข้ามาเกี่ยวข้องตรงไหน? เกี่ยวตรงที่เราสามารถสร้าง Dynamic Web pages ได้จาก PHP ไงครับ เราสามารถใช้ PHP สร้างเว็บเพจที่มีการโต้ตอบกับผู้ใช้ สามารถกำหนดให้มีการแสดงผลบนเว็บได้แตกต่างกันไปตามแต่ผู้ใช้ต้องการ และเราสามารถใช้ PHP ในการติดต่อกับระบบฐานข้อมูลต่างๆ เพื่อสร้างเป็น Database-driven Web pages ขึ้นมาได้เช่นกัน
PHP เป็น Server-side scripting language คือในทุกๆ ครั้งก่อนที่เครื่องคอมพิวเตอร์ซึ่งให้บริการเป็น Web Server จะส่งหน้าเว็บเพจที่เขียนด้วย PHP ให้เรา มันจะทำการประมวลผลตามคำสั่งที่มีอยู่ให้เสร็จเสียก่อน แล้วจึงค่อยส่งผลลัพธ์ที่ได้ให้เรา ผลลัพธ์ที่ได้นั้นก็คือเว็บเพจที่เราเห็นนั่นเอง
ถึงตอนนี้ หากคุณเริ่มจะสนใจ PHP แล้ว ผมอยากให้คุณทราบว่า PHP เป็นภาษาที่ง่ายต่อการเรียนรู้ ยิ่งถ้าคุณมีความคุ้นเคยกับภาษา C หรือ Perl Script ก็จะยิ่งง่ายเข้าไปใหญ่ เพราะ syntax คล้ายกันมากนั่นเอง และหากคุณใช้ PHP เขียนเว็บเพจแล้วเกิดปัญหาหรือข้อสงสัย คุณก็สามารถที่จะสอบถามไปยังผู้ใช้ PHP ที่มีอยู่จำนวนมากมายทั่วโลกได้ คนไทยเองก็ใช้ PHP กันค่อนข้างมากนะครับ จะเห็นว่าในปัจจุบันมีหนังสือเกี่ยวกับ PHP ออกวางจำหน่ายหลายเล่ม และถ้าคุณลองค้นหารายละเอียดของผู้ให้บริการ Web hosting ต่างๆ แล้ว ก็จะเห็นว่าหลายๆ แห่งจะมี PHP หรือ ASP ให้เลือกใช้ ครับ
คำสั่ง Linux
คำสั่งสำหรับการเคลื่อนย้ายdirectory
pwd แสดง path ที่กำลังทำงานอยู่ในขณะนั้น
cd คำสั่งสำหรับการย้าย directory
cd [dirname]
ยกตัวอย่างเช่น cd aloha
cd .. เพื่อไปยัง directory ก่อนหน้า
cd ../.. เปลี่ยนไปไดเร็กทอรี่ก่อนหน้าสองลำดับก็พิมพ์
cd ~ เพื่อกลับไปที่ไดเร็กทอรี่ home
โดยเครื่องหมาย ~ จะหมายถึง home ไดเร็กทอรี่
คำสั่งเกี่ยวกับเวลา
date คำสั่งแสดงวันเวลา
cal แสดงปฏิทิน
โดยที่ cal แสดงเดือนปัจจุบัน
และสำหรับ cal -3 ก็จะแสดงปฏิทิน 3 เดือน คือเดือนที่แล้ว เดือนปัจจุบัน และเดือนหน้า
คำสั่งสำหรับการแสดงรายละเอียดในรูปแบบต่างๆ ของ files
ls คำสั่งแสดงรายชื่อ files และ folders
ls –[option] โดยที่ option name ต่างๆ มีดังนี้
-a แสดงfiles ทั้งหมด รวมถึง files ที่ซ้อนอยู่ด้วย
-l แสดงรายละเอียดทั้งหมด เป็นแถวยาวลงมา
-c แสดงรายละเอียดทั้งหมดของ files ตามลำดับเวลาที่สร้างหรือแก้ไข
-t แสดงชื่อไฟล์เรียงตามลำดับเวลาที่แก้ไขล่าสุด
-u แสดงชื่อไฟล์ตามเวลาที่เข้าใช้งาน
cat เป็นคำสั่งสำหรับแสดงรายละเอียดที่อยู่ภายใน file นั้นๆ หรือ ใช้สำหรับเชื่อมต่อ files ตั้งแต่ 2 files ขึ้นไป
กรณีแสดงรายละเอียดภายใน file
cat [dirname]/[filename]
ยกตัวอย่างเช่น cat aloha/1.txt
กรณีต้องการเชื่อมต่อ files ตั้งแต่ 2 files ขึ้นไป
cat [dirname1]/[filename1] [dirname2]/[filename2] … > [newFilename]
ยกตัวอย่างเช่น
cat aloha/1.txt 2.txt > 12.txt
less เป็นคำสั่งสำหรับแสดงรายละเอียดที่อยู่ภายใน file นั้นๆเช่นเดียวกับ cat
less [dirname]/[filename] หรือ less [filename]
กด “q” เพื่อต้องการออกจากคำสั่ง
ยกตัวอย่างเช่น less 12.txt
head เป็นคำสั่งที่ใช้เมื่อต้องให้แสดง 10 บรรทัดแรกของ file นั้นๆ
head [option] file
โดยที่ option โดย option ที่มักใช้กันคือ -n เพื่อทำการระบุบรรทัดที่ต้องการ (หากไม่ระบุจะเป็น 10 บรรทัด)
ยกตัวอย่างเช่น head 1.txt
head -n 10 1.txt
tail เป็นคำสั่งที่ใช้เมื่อต้องให้แสดง 10 บรรทัดสุดท้ายของ file นั้นๆ
tail [option] file
โดยที่ option โดย option ที่มักใช้กันคือ
-n เพื่อทำการระบุบรรทัดที่ต้องการ (หากไม่ระบุจะเป็น 10 บรรทัด) และ
-c เพื่อระบุจำนวน byte
ยกตัวอย่างเช่น tail 2.txt
tail -n 10 2.txt
more เนื่องจากคำสั่ง cat ไม่เหมาะกับการดูข้อมูลที่มีความยาวมากๆ ดังนั้น จึงได้มีการพัฒนา more ขึ้น เพื่อช่วยให้สามารถดูข้อมูลที่มีขนาดยาวได้เป็นช่วงๆ
more [filename ]
ภายในโปรแกรม more จะมีคำสั่งเพื่อใช้งานคราวๆ ดังนี้
= แสดงเลขบรรทัด
q ออกจากโปรแกรม
<space> เลื่อนไปยังหน้าถัดไป
<enter> เลื่อนไปยังบรรทัดถัดไป
h แสดง help
ยกตัวอย่าง more 1.txt
คำสั่งสำหรับการควบคุมการทำงานในส่วนของ File และ Directory
cp คำสั่งสำหรับการทำสำเนา file
cp [ex file] [new file]
ยกตัวอย่างเช่น cp 1.txt 2.txt
mv เป็นคำสั่งสำหรับการเคลื่อนย้าย file หรือ เปลี่ยนชื่อ file
กรณีเปลี่ยนชื่อ file
mv [filename เก่า] [filename ใหม่]
ยกตัวอย่างเช่น mv 1.txt 11.txt
กรณีเคลื่อนย้าย file ไปยัง directory ที่ต้องการ
mv [dirnameต้นทาง]/[filename] [dirnameปลายทาง]/[filename]
ยกตัวอย่างเช่น mv 1.txt aloha
rm –r คำสั่งสำหรับลบ directory ใช้ได้ทั้ง directory ที่มีข้อมูลอยู่ หรือ directory เปล่าก็ได้
rm –r [dirname]
ตัวอย่างเช่น rm –r aloha
rm –rf [dirname] ลบหมดเลยไม่มีถาม
ตัวอย่างเช่น rm –r aloha
rmdir เป็นคำสั่งใช้สำหรับการลบ directory เช่นเดียวกันกับ rm –r แต่ในกรณีนี้ต้องเป็น directory เปล่าๆเท่านั้น
rmdir [dirname]
ตัวอย่างเช่น rmdir aloha
rmdir -rf เป็นคำสั่งใช้สำหรับการลบ directory เช่นเดียวกันกับ rmdir แต่ในกรณีนี้สามารถลบ directory ที่ไม่ว่างได้
rmdir -rf [dirname]
ตัวอย่างเช่น rmdir -rf aloha
mkdir คำสั่งสร้าง directory
mkdir [dirname]
ตัวอย่างเช่น mkdir aloha
ln เป็นคำสั่งสำหรับสร้าง link ซึ่งจะคล้ายกับ short cut ในวินโดว์ส
ln -s target [linkname]
-s เป็นการให้สร้าง symbolic link คือถ้าลบ link แล้วจะไม่ทำให้ target เป็นอะไรไม่เกี่ยวกัน ส่วน target ก็คือfile หรือdirectoryที่เราต้องการสร้าง link สุดท้าย linkname คือ ชื่อของ link ถ้าไม่ใส่จะเป็นชื่อเดียวกับ target
chmod ใช้สำหรับเปลี่ยนสิทธิเจ้าของแฟ้มข้อมูลหรือ Directory
chmod [option]… mode[mode] file หรือ
chmod [option]… octalmode file
โดย option ที่มักใช้กันใน chown คือ
-R เปลี่ยน Permission ของทุกๆ แฟ้มย่อยใน Directory และการอ้างอิง mode จะใช้ตัวอักษร u g o a + – r w x X s t u g o โดย
u หมายถึง User ผู้เป็นเจ้าของแฟ้ม
g หมายถึง Group ผู้เป็นเจ้าของแฟ้ม
o หมายถึง บุคคลอื่นๆ
a หมายถึง ทุกๆ กลุ่ม
r หมายถึง สิทธิในการอ่าน
w หมายถึง สิทธิในการเขียน/แก้ไข
x หมายถึง สิทธิในการ execute หรือ ค้นหา (ในกรณีของ Directory)
ส่วน s t u g และ o นั้น จะขอกล่าวถึงในเอกสารเรื่อง Unix Permission ต่อไป เนื่องจากผลลัพธ์ของคำสั่ง ls -l จะแสดงเป็นลำดับ ดังตัวอย่างต่อไปนี้
$ ls -l krerk.jpg
-rw-r–r– 1 pok pok 13201 เม.ย. 21 2000 krerk.jpg
ดังนั้น การเขียน Permission อาจจะเขียนได้เป็นเลขฐาน 8 เช่น 644 หมายถึง 110100100 ซึ่งจะตรงกับ rw-r–r- เป็นต้น
chown [option]… owner[:group] file หรือ
chown [option]… :group file
โดย option ที่มักใช้กันใน chown คือ -R เปลี่ยน Permission ของทุกๆ แฟ้มย่อยใน Directory
ตัวอย่าง chown krerk:users /home/krerk
chown nobody data.txt
touch คำสั่งที่ใช้ในการสร้าง file เปล่า
touch [filename]
ยกตัวอย่างเช่น touch book.txt
wc คำสั่งแสดงรายละเอียดจำนวนบรรทัด จำนวนคำและขนาดของ file ของ
wc [filename]
ตัวอย่างเช่น wc 2.txt
vi คำสั่งสำหรับการสร้าง file ขึ้นมาใหม่ vi ย่อมาจาก visual editor
vi [filename]
ตัวอย่างเช่น vi 1.txt
rm คำสั่งสำหรับลบ file ออก
rm [filename]
ยกตัวอย่างเช่น rm 1.txt
ll คำสั่งแสดงรายชื่อ files และ folders เช่นเดียวกันกับ ls แต่มีข้อแตกต่างคือ ll จะแสดงรายละเอียดของแต่ละ file และ folder เพิ่มมากขึ้น เช่น username วัน และเวลา ที่สร้าง file หรือ folder นั้นๆ
คำสั่งสำหรับขอความช่วยเหลือ
man คำสั่งสำหรับดูรายละเอียดการใช้คำสั่งต่างๆ บน Linux
man [command]
ตัวอย่างเช่น man ls
man rmdir
apropos [keyword] คำสั่งสำหรับดูคู่มือการใช้คำสั่งต่างๆ บน Linux สำหรับ keyword
apropos [keyword]
คำสั่งสำหรับการค้นหา
find เป็นคำสั่งที่ใช้สำหรับค้นหาแฟ้มข้อมูล
find [path].. expression
ลักษณะของ expression
เช่น -name [pattern] เพื่อใช้หาชื่อ file ตาม pattern ที่ระบุ
-perm [+-] mode เพื่อใช้หา file ตาม mode ที่ต้องการ
-user NAME หา file ที่เป็นของ user ชื่อ NAME
-group NAME หา file ที่เป็นของ group ชื่อ NAME
ดังตัวอย่าง
find -name *.doc
find /usr -perm +111 (หาแฟ้มที่มี Permission อย่างน้อยเป็น 111)
คำสั่งเกี่ยวกับผู้ใช้
finger ใช้สำหรับแสดงรายละเอียดของผู้ใช้
finger หรือ finger [username]
กรณีไม่ระบุชื่อ finger จะแสดงรายละเอียดของ User ที่กำลัง logon อยู่บนเครื่องนั้นๆ ทั้งหมด
ยกตัวอย่างเช่น finger biouser
who คำสั่งแสดง username ที่กำลัง log on อยู่ในขณะนั้นทั้งหมด
whoami คำสั่งแสดง username ที่ของผู้ใช้ในขณะนั้น
ps แสดงงานที่กำลังทำในช่วงเวลานั้นทั้งหมดเฉพาะของตัวเอง
ps aux แสดงงานที่กำลังทำในช่วงเวลานั้นทั้งหมดของ user ที่กำลัง log on อยู่ในขณะนั้นทั้งหมด
talk ใช้สำหรับการพูดคุยระหว่างผู้ใช้ด้วยกันบนระบบ ซึ่งผู้ใช้ทั้งทั้ง 2 ฝ่ายจะต้องพิมพ์คำสั่ง Talk ถึงกันก่อน จึงจะเริ่มการสนทนาได้
talk user[@host] [tty]
กรณีไม่ระบุ host โปรแกรมจะถือว่าหมายถึงเครื่องปัจจุบัน (นอกจากนี้ยังมีคำสั่ง ytalk ซึ่งสามารถพูดคุยได้พร้อมกันมากกว่า 2 คน) ซึงบางกรณีเราอาจจะต้องระบุ tty ด้วยหากมีผู้ใช้ Log in เข้าสู่ระบบด้วยชื่อเดียวกันมากกว่า 1 หน้าจอ
ตัวอย่าง talk krerk@vwin.co.th
write จะใช้เพื่อการส่งข้อมูลทางเดียวจากผู้เขียนไปถึงผู้รับบนเครื่องเดียวกันเท่านั้น
write user [tty]
เมื่อมีการพิมพ์คำสั่ง write ผู้ใช้จะเห็นข้อความซึ่งจะแสดงว่าข้อความดังกล่าวถูกส่งมาโดยใคร ซึ่งหากผู้รับต้องการตอบกลับ ก็จะต้องใช้คำสั่ง write เช่นกัน เมื่อพิมพ์เสร็จแล้วให้พิมพ์ตัวอักษร EOF หรือ กด CTRL+C เพื่อเป็นการ interrupt ทั้งนี้ข้อความที่พิมพ์หลังจาก write จะถูกส่งหลังจากการกด Enter เท่านั้น
ตัวอย่าง write krerk
mesg จะใช้เพื่อควบคุมว่าผู้อื่นมีสิทธิที่จะส่งข้อความ write ถึงเราหรือไม่
mesg [y | n]
โดย option มีความหมายคือ
y – หมายถึงผู้อื่นมีสิทธิที่จะส่งข้อความถึงเรา
n – หมายถึงผู้อื่นมีไม่สิทธิที่จะส่งข้อความถึงเรา
ตัวอย่าง mesg y
mesg n
คำสั่งอื่นๆ
clear คำสั่งสำหรับล้างหน้าจอ
tar [option]… [file]…
โดย option ที่มักใช้กันใน echo คือ
-c ทำการสร้างใหม่ (backup)
-t แสดงรายชื่อแฟ้มข้อมูลในแฟ้มที่ backup ไว้
-v ตรวจสอบความถูกต้องของการประมวลผล
-f ผลลัพธ์ของมาที่ file
-x ทำการ restore
ตัวอย่าง tar -cvf mybackup.tar /home/*
tar -tf mybackup.tar
tar -xvf mybackup.tar
alias macroname=’command’
ตัวอย่าง alias ll=’ls -F -l’
echo [option]… msg
โดย option ที่มักใช้กันใน echo คือ
-n ไม่ต้องขึ้นบรรทัดใหม่
ตัวอย่าง echo -n “Hello”
echo “Hi..”
free [-b|-k|-m]
โดย option ที่มักใช้กันใน free คือ
-b แสดงผลลัพธ์เป็นหน่วย byte
-k แสดงผลลัพธ์เป็นหน่วย kilobyte
-m แสดงผลลัพธ์เป็นหน่วย megabyte
ตัวอย่าง free
free -b
free -k
sort [option] file
ตัวอย่าง sort data.txt
หยิบรูบิคของท่านขึ้นมา เริ่มกันโลด!!!!


อันนี้แนะนำให้ใช้รูบิคเก่าๆ มันจะง่ายต่อการแงะ

อันตราย อันตราย เด็กๆอย่าทำตามลำพังจะดีที่สุด



ที่ว่าแก้รูบิคภายใน 10 นาทีก็คือเวลาแงะ แงะยากหน่อยก็ 20 นาที
