Archive for the ‘PHP’ Category
Wednesday, September 3rd, 2008 |
ที่หยิบเรื่อง PHP Framework มาพูดในครั้งนี้ไม่ใช่อะไร เพราะว่าตอนนี้งานที่ทำให้ฝรั่งเขาอยากได้มากๆคือ Zend Framework ซึ่งผมเองก็ไม่เคยจับมาก่อนเช่นกันสำหรับตัวนี้ เพราะเคยเล่นเจ้า CodeIgniter ตามที่ผมเคยลองที่ http://www.myblog.in.th/?p=305
คำถามของหลายๆคนตามมาว่า
ทำไมถึงใช้ Framework ?
แล้วทำไมผมถึงไม่ใช้ ทำเว็บตัวเอง ?
ทำไมถึงใช้ Framework ?
ส่วนตัวแล้วผมชอบในหลักการของ PHP Framework ที่มี MVC ซึ่งทันก็มีข้อดีก็คือ
- พัฒนาต่อง่าย
- เหมาะกับการทำงานเป็นทีม
- เหมาะกับ Application
ซึ่งเท่าที่ดูแล้ว Framework มันเหมาะกับการทำเป็น Application เฉพาะทางซะมากกว่าเช่น Web App ที่ทำหน้าที่เกี่ยวกับการเงิน , สารสนเทศ อะไรแนวนี้มากกว่าการทำเว็บไซต์ทั่วๆไป
แต่มันมีอยู่อย่างหนึ่งที่ผมไม่ชอบบนตัว PHP Framework ก็คือเรื่องของความเร็วในการประมวลผล มันคิดมากไป ขั้นตอนมากเกินไป ซึ่งเมื่อผมจับ Zend Framework เล่นดู ผมก็ต้องการที่จะรู้ว่ามันทำงานได้เร็วไหม แค่ไหน อย่างไร ก็ไม่แคร้วต้องทดสอบจับเวลามันครับ
ผมเชื่อมั่น 100% ว่าไม่มีทางที่ PHP Framework ใดจะประมวลผลได้เร็วเท่าเขียน PHP แบบปกติ หรือ เขียนในรูปแบบ OOP , Class , Function ครับ เพราะพิสูจน์มาแล้ว
ลองดูจากที่ผมเล่นตัว CodeIgniter โดยไม่ได้ติดต่อดาต้าเบสอะไรเลย แค่ดึง head body footer มาแสดงเท่านั้น แต่มันใช้เวลาคิดถึง 0.0383 วินาที ดังรูป
วกมาที่ทดสอบ Zend Framework กันบ้าง โดยผมทำตามตัวอย่างของการเริ่มต้นสร้างเว็บด้วย Zend Framework โดยติดต่อตาราง 1 ตาราง ข้อมูล 2 แถวเท่านั้น ได้ผลตามรูป
โดยใช้ Process Time : 0.1391561031 วินาทีในการประมวลผล
ทีนี้ผมก็ทดสอบเขียน PHP ปกติโดยใช้งานติดต่อกับ Class ที่เขียนขึ้นเองในการเชื่อมต่อดาต้าเบส 1 ตาราง ข้อมูล 1000 แถว เรียกมาแสดงผลแล้วก็จับเวลา ซึ่งได้ผลแบบนี้
เทียบกัน 2 อันเป็นไงบ้างครับ การเขียน PHP ปกตินั้นประมวลผลได้เร็วกว่าใช้ PHP Framework มากมายหลายขุมเลยทีเดียว
หากมาวิเคราะห์กันว่าหากเราใช้งาน Framework ในการทำเว็บไซต์ ผลกระทบที่ตามมาก็คืออะไรบ้าง
- ต้องการ Server ประสิทธิภาพสูงขึ้น
- ค่าใช้จ่ายสูงขึ้น
- ต้องการคนที่เข้าใจใน Framework นั้นๆในการพัฒนาต่อ
แล้วทำไมผมถึงไม่ใช้ ทำเว็บตัวเอง ?
ก็อย่างที่บอกไปครับ ผมเน้นงานด้าน OutPut มากกว่า Input เพราะผมต้องการนำเสนอเว็บ ไม่ได้ต้องการนำเสนอ Code เพราะหากผมสนใจแต่เรื่อง Code ที่ต้องเริศหรู ต้องเป็น Framework หรือเป็น OOP ทั้งหมด เว็บผมคงไม่สามารถใช้งานในระดับที่ CPU Load ต่ำขนาดนี้ได้
ลองดูหน้าแรกของผมก็ได้ ติดต่อตารางทีละ 9 ตาราง (อาจจะมากกว่าเพราะมีส่วนของสคริป Banner ต่างๆที่รันผ่านการเรียกด้วย Javascript) แต่สามารถทำได้ที่ 0.0079 วินาที ซึ่งหากผมใช้งาน Framework ผมว่าไม่มีทางได้ต่ำกว่า 0.2 - 0.3 วินาทีอย่างแน่นอน ถึงแม้จะเอาเทคโนโลยี Cache ที่มีในตัว Framework มาใช้ก็ตาม
และนี่คือเหตุผลที่ว่าทำไมผมถึงไม่ใช้ Framework ในเว็บของผมเอง แต่ผมเลือกใช้พวก OOP , Class ซะมากกว่า
อยู่ที่การคำนึงถึงการใช้งานของแต่ละระบบ แต่ละ Application ว่าต้องการอะไร ?
สำหรับผมแล้วผมคำนึงถึง “ผู้เสพ” มากกว่า “ผู้พัฒนา” ผู้เสพก็คือคนเข้าชมเว็บไซต์ หากเราทำให้เว็บของเรา
- เร็ว
- ข้อมูลถูกต้อง
- ระบบมีมาตรฐาน ปลอดภัย
เท่านี้มันก็มากพอแล้วครับ ส่วนผู้พัฒนา หากคุณเก่งซะอย่าง(ไม่ต้องมากก็ได้) ยังไงก็แก้ไขได้ครับ เพราะมันก็ใช้ OOP , Class เท่านั้น ส่วน PHP Framework คุณไม่สามารถจ้าง PHP Programer ทั่วๆไปมาทำได้เลย ดังนั้นค่าจ้างก็ย่อมแพงขึ้นตามครับ
แต่ยังไงตอนนี้ก็ทำไปครับทำไงได้ ฝรั่งดันอยากได้ Zend Framework จากทำระบบ CMS ใช้เวลาสัก 2 วันเสร็จ ตอนนี้หากมาใช้ Framework 2 วันไม่มีทางเสร็จแน่นอน!!!
Posted in PHP, ความรู้ | 1 Comment »
Friday, August 29th, 2008 |
ตอนนี้กระแสของการทำเว็บบนมือถือกำลังระบาดหนักเพราะตอนนี้แทบทุกคนล้วนแล้วแต่มีมือถือแทบทุกคน บางคน 2-3 เครื่องก็มี บริการหลายๆ อย่างหันไปให้บริการบนมือถือมากยิ่งขึ้น มาคิดถึงเขียนโปรแกรมบนมือถือเมื่อก่อน สมัยนั้นจะเขียนโปรแกรมด้วย wml (Wireless Application Protocol) ซะเป็นส่วนมาก และโดยมากเว็บที่มีบริการผ่าน w@p ก็มักจะใช้ URL เป็น
wap.xxx.com
xxx.com/wap/
อะไรทำนองนี้ ซึ่งผมเองก็เขียน w@b site เล่นอยู่เหมือนกัน เป็นการแสดงซื้อขายล่าสุด แต่หลังๆก็เลิกทำเพราะแทบไม่มีคนใช้งานบนมือถือ แหมก็ช่วงนั้นค่า GPRS อย่างแพง ช้า แถมคิดเป็นไบต์อีกใครจะมาเล่น
มาอีกช่วงหนึ่ง Pocket PC หรือ PDA เริ่มระบาดหนัก อีกทั้งใน Pocket PC ก็สามารถใช้งานบราวเซอร์ได้ด้วย แถมรองรับพวก html , Xhtml ก็เลยทำให้สามารถเขียนอะไรได้ง่ายมากขึ้น ยังมีโปรแกรมเมอร์หลายๆคนยังคงคิดว่า การเขียนสคริปเพื่อใช้งานบน Pocket PC ต้องเป็นภาษาเฉพาะ PHP ใช้งานบนมือถือไม่ได้ หากเป็นเมื่อก่อนไม่เถียงครับ แต่ตอนนี้ ใช้งานได้ปกติครับ เขียน PHP เหมือนเว็บปกติเลย แต่ต้องดีไซน์ขนาดให้มันพอเหมาะ พอดีเท่านั้น ซึ่งหลังๆมาก็จะเปลี่ยนชื่อ URL มาเป็น
ppc.xxx.com
xxx.com/ppc/
pda.xxx.com
xxx.com/pda/
อะไรประมาณนี้ ซึ่งเห็นเยอะกับ URL ในลักษณะนี้ อย่างของ tarad.com ก็มีให้บริการทั้ง w@p และ Pocket PC ครับ
อย่าง w@p ก็จะเป็นประมาณนี้ http://wap.tarad.com/belong2u
หรือ Pocket PC หรือ PDA ก็จะเป็น http://pda.tarad.com/belong2u
และในปัจจุบันคนเริ่มหันมาใช้กะ URL แบบนี้ครับ
http://m.xxx.xom
ซึ่งสดๆร้อนๆผมเพิ่งได้รับ SMS จาก SCB Easy net ว่าสามารถเข้าเช็คเงินได้ผ่านมือถือได้ที่ http://m.scbeasy.com ก็ลองใช้แล้วครับ โอเคเลยทีเดียว
อ่ะเข้าเรื่อง กรณีที่จะทำเว็บให้มันเลือกอัตโนมัติเลยหล่ะจะทำไง ว่าใช้เครื่องอะไรเปิดจะได้เปิดโปรแกรมให้ถูกต้อง เช่น ใช้ PC เปิดเว็บก็เข้าหน้าเว็บปกติ หากเข้าด้วย Pocket PC ก็ไปในหน้าของ Pocket PC หรือ แม้แต่ดูผ่าน iphone หรือ ipod ก็ไปอีกหน้านึง
หลักการมันก็เพียงแค่นั่งดึงเอาค่า HTTP_USER_AGENT มาทำการตรวจสอบก็เท่านั้นเอง ผมลองเขียนโค๊ด บรรทัดเดียว ดังนี้
<?php echo $_SERVER[’HTTP_USER_AGENT’] ;?>
ผมทดสอบผ่านเครื่อง PC ก็ได้ผลดังนี้
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MEGAUPLOAD 2.0)
ผมทดสอบผ่าน HTC Touch ของผมแสดงผลดังนี้
PPC;240×320;HTC_P3450/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mozilla/4.0 (compatible;MSIE 6.0; Windows CE; IEMobile 7.6)
ได้ค่านี้มาก็เอามาเปรียบเทียบค่าโดยการเขียนฟังก์ชั่นเช็คค่ามันซะ แล้วก็กำหนดให้มัน redirect ไปที่ไหน โดยสามารถเขียนแบบนี้ได้
<?php
function detect_mobile_device(){
// check if the user agent value claims to be windows but not windows mobile
if(stristr($_SERVER[’HTTP_USER_AGENT’],’windows’)&&!stristr($_SERVER[’HTTP_USER_AGENT’],’windows ce’)){
return false;
}
// check if the user agent gives away any tell tale signs it’s a mobile browser
if(eregi(’up.browser|up.link|windows ce|iemobile|mini|mmp|symbian|midp|wap|phone|pocket|mobile|pda|psp’,$_SERVER[’HTTP_USER_AGENT’])){
return true;
}
// check the http accept header to see if wap.wml or wap.xhtml support is claimed
if(stristr($_SERVER[’HTTP_ACCEPT’],’text/vnd.wap.wml’)||stristr($_SERVER[’HTTP_ACCEPT’],’application/vnd.wap.xhtml+xml’)){
return true;
}
// check if there are any tell tales signs it’s a mobile device from the _server headers
if(isset($_SERVER[’HTTP_X_WAP_PROFILE’])||isset($_SERVER[’HTTP_PROFILE’])||isset($_SERVER[’X-OperaMini-Features’])||isset($_SERVER[’UA-pixels’])){
return true;
}
// build an array with the first four characters from the most common mobile user agents
$a = array(
‘acs-’=>’acs-’,
‘alav’=>’alav’,
‘alca’=>’alca’,
‘amoi’=>’amoi’,
‘audi’=>’audi’,
‘aste’=>’aste’,
‘avan’=>’avan’,
‘benq’=>’benq’,
‘bird’=>’bird’,
‘blac’=>’blac’,
‘blaz’=>’blaz’,
‘brew’=>’brew’,
‘cell’=>’cell’,
‘cldc’=>’cldc’,
‘cmd-’=>’cmd-’,
‘dang’=>’dang’,
‘doco’=>’doco’,
‘eric’=>’eric’,
‘hipt’=>’hipt’,
‘inno’=>’inno’,
‘ipaq’=>’ipaq’,
‘java’=>’java’,
‘jigs’=>’jigs’,
‘kddi’=>’kddi’,
‘keji’=>’keji’,
‘leno’=>’leno’,
‘lg-c’=>’lg-c’,
‘lg-d’=>’lg-d’,
‘lg-g’=>’lg-g’,
‘lge-’=>’lge-’,
‘maui’=>’maui’,
‘maxo’=>’maxo’,
‘midp’=>’midp’,
‘mits’=>’mits’,
‘mmef’=>’mmef’,
‘mobi’=>’mobi’,
‘mot-’=>’mot-’,
‘moto’=>’moto’,
‘mwbp’=>’mwbp’,
‘nec-’=>’nec-’,
‘newt’=>’newt’,
‘noki’=>’noki’,
‘opwv’=>’opwv’,
‘palm’=>’palm’,
‘pana’=>’pana’,
‘pant’=>’pant’,
‘pdxg’=>’pdxg’,
‘phil’=>’phil’,
‘play’=>’play’,
‘pluc’=>’pluc’,
‘port’=>’port’,
‘prox’=>’prox’,
‘qtek’=>’qtek’,
‘qwap’=>’qwap’,
’sage’=>’sage’,
’sams’=>’sams’,
’sany’=>’sany’,
’sch-’=>’sch-’,
’sec-’=>’sec-’,
’send’=>’send’,
’seri’=>’seri’,
’sgh-’=>’sgh-’,
’shar’=>’shar’,
’sie-’=>’sie-’,
’siem’=>’siem’,
’smal’=>’smal’,
’smar’=>’smar’,
’sony’=>’sony’,
’sph-’=>’sph-’,
’symb’=>’symb’,
‘t-mo’=>’t-mo’,
‘teli’=>’teli’,
‘tim-’=>’tim-’,
‘tosh’=>’tosh’,
‘treo’=>’treo’,
‘tsm-’=>’tsm-’,
‘upg1′=>’upg1′,
‘upsi’=>’upsi’,
‘vk-v’=>’vk-v’,
‘voda’=>’voda’,
‘wap-’=>’wap-’,
‘wapa’=>’wapa’,
‘wapi’=>’wapi’,
‘wapp’=>’wapp’,
‘wapr’=>’wapr’,
‘webc’=>’webc’,
‘winw’=>’winw’,
‘winw’=>’winw’,
‘xda-’=>’xda-’
);
// check if the first four characters of the current user agent are set as a key in the array
if(isset($a[substr($_SERVER[’HTTP_USER_AGENT’],0,4)])){
return true;
}
}
function detect_iphone(){
if(eregi(’iphone’,$_SERVER[’HTTP_USER_AGENT’])||eregi(’ipod’,$_SERVER[’HTTP_USER_AGENT’])){
return true;
}
}
// example 1 - detect and redirect mobile browsers
if(detect_mobile_device()){
header(’Location: show.php?name=mobile’);
exit;
}
// example 2 - detect and redirect desktop browsers
if(!detect_mobile_device()){
header(’Location: show.php?name=web’);
exit;
}
// example 3 - send iphone to specific site
if(detect_iphone()){
header(’Location: show.php?name=iphone’);
exit;
}
?>
ฟังก์ชั่นก็เขียนในลักษณะแนวๆนี้แทบทั้งนั้น สำหรับฟังก์ชั่นนี้ผมก็เอามาจาก http://www.andymoore.info/php-to-detect-mobile-phones/ ก็สามารถนำไปใช้ได้เลยนะครับหากขี้เกียจเขียนแล้ว
ในตัวอย่างจะเห็นว่าผมเขียน
header(’Location: show.php?name=web’);
เอาไว้ เพื่อทดสอบเวลามันไปไหน และ ส่งค่าไปถูกต้องหรือไม่ โดยคราวนี้ผมได้ลองทดสอบอีกรอบโดยการสร้างไฟล์ที่ชื่อ show.php โดยเขียนโค๊ดแบบนี้
<?php
echo $_GET[’name’];
?>
<br /><br />
<?php
echo $_SERVER[’HTTP_USER_AGENT’] ;
?>
ผมทดสอบผ่านเครื่อง PC ก็ได้ผลดังนี้
web
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MEGAUPLOAD 2.0)
ผมทดสอบผ่าน HTC Touch ของผมแสดงผลดังนี้
mobile
PPC;240×320;HTC_P3450/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mozilla/4.0 (compatible;MSIE 6.0; Windows CE; IEMobile 7.6)
ซึ่งจากการตรวจสอบถือว่าถูกต้องครับ ดังนั้นเราสามารถเอาค่ามาใช้ได้เลยว่าใช้โทรศัพท์รุ่นไหน อย่างไร แล้วจะกำหนดเงื่อไขอะไรต่อไปก็จัดการทำเองเลย หวังว่าคงไม่ยากสำหรับคนที่อยากทำเว็บที่ใช้งานได้ทั้งคอมพิวเตอร์ และ มือถือนะครับ
อ่านเพิ่มเติมเรื่อง w@p ได้จากที่นี่
http://www.expert2you.com/view_article.php?art_id=236
http://en.wikipedia.org/wiki/Wireless_Application_Protocol
Posted in PHP, ความรู้ | No Comments »
Thursday, August 14th, 2008 |
วันนี้ผมได้มีโอกาสลองของกับเว็บตัวเองอีกแล้วกับการใช้ ob_gzhandler ในเว็บไซต์ Mocyc.com
ก็เนื่องมาจากผมเองชอบโมเว็บอยากให้เว็บไซต์ใช้ทรัพยากรในเครื่องให้น้อยที่สุด เครื่อง Server ทำงานได้สบายที่สุด ดังนั้นในเว็บ Mocyc.com จึงได้มีการใช้แนวคิดการออกแบบหลายๆอย่างเช่น
- ลดและเลี่ยงการใช้ Join Table Database ให้น้อยที่สุด หรือ ไม่ใช้เลย
- เขียนสคริป Cache เพื่อลดอัตราการติดต่อกับ MySQL ดาต้าเบส
ซึ่งก็ได้ผลดีและทำให้ Server ที่ใช้งานอยู่นั้นทำงานได้สบายๆ ไม่หนักมากมายนัก
และล่าสุด เมื่อราวๆ บ่าย 2 ของวันที่ 14 สค. 51 ผมเองก็ได้จูนเว็บ Mocyc.com อีกครั้ง โดยการใช้งาน ob_gzhandler หรือใช้ความสามารถของ gzip ครับ

ดูจากกราฟนะครับ เมื่อวานยังไม่ได้ใช้งาน ob_gzhandler ลองเทียบกับวันนี้หลัง 15.00 น. ดูครับ CPU LOAD ลดลงเป็นครึ่งเลยครับ ว๊าววววว…..
ob_gzhandler หมายความว่า ในกรณีที่ browser ของเราสามารถอ่านเวปที่มีการบีบอัดได้ ( header ที่ส่ง request ไปยัง server จะมีคำว่า enable gzip) พอเจ้า php (ที่มีการระบุใน script ว่า ob start , ob_gzhandler ) รู้ว่า browser ของเราสามารถรับเวปที่มีการบีบอัดได้ มันจะส่ง html ที่มีการบีบอัดมาแทน ดังนั้น แทนที่จะส่งมา 50,000-200,000 ไบต์ มันก็จะเหลือมาแค่ 5,000-10,000 ไบต์ แล้วมาคลายที่เครื่องเราแทน
ก่อนที่จะเอาลองเทสบนเว็บ Mocyc.com ผมได้ลองเทสใน localhost ในเครื่อง โดยการคิวรี่ข้อมูลมาแสดงผลจำนวน 1,000 ข้อมูล ในกรณีที่ไม่ได้ใช้ ob_gzhandler ใช้เวลาประมาณ 0.001 - 0.0012 sec แต่เมื่อผมใช้ ob_gzhandler จะใช้เวลาเฉลี่ยประมาณ 0.0009 - 0.001 sec. ซึ่งเทียบแล้วก็คือไวกว่าปกติครับ ก็เลยนำมาทดสอบใน Mocyc.com เลยครับ ซึ่งก็ได้ผลดังกราฟครับ
การใช้งานก็ไม่มีอะไรมากมายเลยครับ ก็แค่ใช้คำสั่ง
ob_start(’ob_gzhandler’);
ในกรณีที่ต้องการให้มีการบีบอัดข้อมูล
ob_start();
ในกรณีที่ไม่ต้องการบีบอัดข้อมูล
เดี๋ยวลองดูผลต่อไป แต่จากการทดสอบดูแล้วค่อนข้างน่าพอใจมากครับกับการเพิ่มคำสั่งเพิ่มไปแค่นิดเดียว
หากลองสังเกตุจะเห็นว่าช่วง 4 ทุ่มจะสูง เพราะเป็นช่วงที่คนเข้าเว็บเยอะครับ ส่วนตอนช่วงเที่ยงคืน นั่นคือ ผมสั่งให้ระบบผมทำงานอัตธนมัติในการลบประกาศซื้อขายที่หมดอายุ รวมไปถึงจัดการระบบดาต้าเบสต่างๆ โดยผมเขียนโปรแกรมสั่งให้มันทำงานช่วง 00.00 น. ครับ
Posted in PHP, ความรู้ | 1 Comment »
Thursday, May 29th, 2008 |
ขำตัวเองไม่หายเลยครับที่เจ้าตัว ‘ (Single Quote) ตัวเดียวก็ทำให้เกิดเรื่องได้ ที่ขำก็คือ ไม่ได้ดูให้ดีแบบว่ามันหลงหูหลงตาแฮ่ะ (ปกติไม่เคยลืมเลยนะ)
แล้วมันเกิดอะไรขึ้นเหรอ ???
ก็เจ้า Maxsite ที่ผมทำขึ้นมานะสิ ตัว 1.10 ที่มีเว็บบอร์ดเข้ามาด้วย เพราะมีคนทำเว็บบอร์ดส่งมาให้ผมนานมากๆแล้ว ไอ้ผมเองก็ไม่เอะใจแฮ่ะ เพราะลองๆดูใช้ได้ และไล่ๆโค๊ดดูก็โอเค
แต่…คงด้วยความมองไม่ละเอียดมากนักจึงพบว่ามีการคร่อมการรับค่าตัวแปรไม่ได้ใช้ Single Quote คร่อมไป 1 ค่า อ้าวกรรมจริงๆ
นี่เลยเขียนแบบนี้
$res[category] = $db->select_query(”SELECT category_name FROM “.TB_WEBBOARD_CAT.” WHERE id=”.$_GET[category].” “);
มองผ่านๆโค๊ดเยอะๆหลายร้อยบรรทัดคงไม่เห็นก็ได้ เพราะที่อื่นมันใส่หมดนี่หว่า 555 ใครจะคิดว่าคนที่ส่งโค๊ดมาให้จะลืมเขียน
แล้วมันทำอะไรได้บ้างหล่ะ
คำตอบคือ ทำได้หมดครับ หากรู้โครงสร้างของดาต้าเบส นั่นก็คือ หากคนที่ใช้งาน หรือ เล่น maxsite อยู่แล้วก็จะรู้ละว่าตารางมีชื่อไรบเาง ฟิลล์ชื่อไรบ้าง หากไม่รู้ก็คงต้องสุ่มๆเอา แต่หากคนที่เล่นอยู่แล้วก็ทำได้ครับ
หากเป็นผม ผมจะทำไรครับหากผมเป็นแฮกเกอร์ ผมก็คงใส่คำสั่ง SQL ลงไปให้สร้าง user ในตาราง admin โดยกำหนดสิทธิ์ให้เหมือน admin แล้วก็ login ไปแก้เนื้อหาครับ ก็เหมือนๆที่หลายๆคนที่ใช้ maxsite โดนกัน
ส่วนวิธีที่เนียนสุดๆก็คือ ใช้คำสั่ง SQL injection ลงไปเพื่อให้แสดงผล user ของ admin แล้วก็จัดแจงนำ password ที่ได้ไปถอดรหัส md5 ตามเว็บไซต์ที่เทียบรหัสผ่าน (หากรหัสผ่านง่ายๆโดนหมดครับ ดังนั้นควรตั้ง password ยากๆหน่อย)
ไม่พูดถึงเรื่องการแฮกผ่าน SQL injection ละกันเพราะมันเป็นพื้นฐานของ SQL อยู่แล้ว ลองหาอ่านตาม google คงมีเพียบ
แก้ก็ง่ายๆละ
$res[category] = $db->select_query(”SELECT category_name FROM “.TB_WEBBOARD_CAT.” WHERE id=’”.$_GET[category].”‘ “);
แค่นี้ก็หมดปัญหาละครับ
คราวหน้าคงต้องไล่ดูให้ดีๆหน่อยแว้วเรา 555
งานนี้ยกเครดิตให้คุณ Tesz ที่ไปแกะแงะ Maxsite แล้วจึงรู้ว่ามีจุดนั้นที่ทำผิดพลาดไป
ไว้งานหน้าจะขอให้ช่วยกันงัดแงะสคริปอีกครับ
Posted in PHP, ความรู้ | 1 Comment »
Thursday, May 15th, 2008 |
หลายๆคนชอบถามผมว่าทำไมผมเขียนโค๊ดผมไม่ชอบเขียนโค๊ดติดต่อดาต้าเบส แบบเทพๆ ผมก็มาคิดในใจ
เทพยังไงว่ะ!!!
ก็เขียนแบบ JOIN TABLE อะไรแบบนี้ ทำไมผมต้องมาเขียน Select ตั้ง 2 รอบ อะไรแบบนี้ มีคนถามผมว่าทำไมผมไม่เขียนแบบนี้
$result = mysql_query(”SELECT * FROM orders_to_item LEFT JOIN items ON orders_to_item.item_id=items.item_id WHERE orders_to_item.order_id = ‘”.$_GET[’order_id’].”‘ “);
พี่เขียนไม่เป็นใช่ม๊า ???? (มีคนถามผม)
ไอ้เขียนหน่ะเขียนเป็น แต่ไม่ใช้ (กรูไม่ใช้ใครจะทำไม)
แต่ที่ไม่ใช้มันก็มีเหตุผลของมัน อาจจะเพราะว่าผมไม่ได้เดินมากะสายคอมโดยตรง ที่นั่งเรียนทฤษฏีดาต้าเบส จากรั้วมหาวิทยาลัย ที่วันๆอาจารย์ก็สอนเรื่องเดิมๆก็พวกการออกแบบดาต้าเบส การติดต่อดาต้าเบส การ JOIN TABLE อะไรพวกนี้ ซึ่งจะว่ากันจริงๆ
อาจารย์ส่วนมากไม่ได้มาจับกับ Database ใหญ่ๆกันหรอก โดยมากก็สอนให้รู้ถึงทฤษฏี และ บอกข้อดีก็เท่านั้น ซึ่งคนที่เรียนๆมาก็คงได้ยินอาจารย์พูดว่า
“การ JOIN ทำให้เราเขียนโค๊ดคิวรี่ข้อมูลได้สั้นขึ้น ไวขึ้น ง่ายขึ้น”
ก็ถูกอย่างที่อาจารย์พูดนะ เขียนโค๊ดสั้นๆ ง่ายขึ้น จริงๆว่ะ
แต่บังเอิญว่าผมเดินมาคนละสายกัน ผมวุ่นกับเรื่องการแก้ไขดาต้าเบสบ่อยมากๆ มากซะจนผมคืดว่าการเอาข้อมูลมาแสดงผลจากดาต้าเบสยังไงให้เอามาได้ไวที่สุด และ ส่งผลกระทบกับ Server ให้น้อยที่สุด และผมก็พบทางสว่าง(มานานแล้ว)
หากคนเรียนดาต้าเบสแล้วทำพวก JOIN ไรเก่งๆก็คงได้ A ไปตามๆกัน แต่หากมาทำให้ประสิทธิภาพโดยรวมของระบบนั้นท่านคงได้ C D กันเป็นแถวๆ
ผมเคยทำมาหมดครับพวก JOIN เนี่ย มันเป็นทฤษฏีที่น่าสนใจ แต่ไม่น่านำมาใช้เลยให้ตาย เพราะผมลองจับ Process มาหมดครับ ยังไงการ คิวรี่ข้อมูลสองครั้ง สามครั้ง ก็ไวกว่าการ JOIN TABLE ครับ ยืนยัน และ ฟันธง
อ้างจากคำพูดนายเปิ้ล Apsserv ที่เคยพูดกะผมนานแล้วว่า
“ดาต้าเบสมีไว้เก็บข้อมูล ไม่ได้มีไว้เอามาคำนวน ทำไงก็ได้ให้ดึงออกมาแสดงให้ไวที่สุดก็พอ”
และปัญหาจากเร่องการ JOIN ก็เกิดขึ้น กับ Server จนได้ เมื่อนายเปิ้ลมาคุยกับผมว่า
apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
หิหิ
apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
เจออีกแล้ว
apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
JOIN นรก
ได้เห็นคำพูดก็รู้เลยว่าเรื่องอะไร แล้วก็ดู Stats ของ Server ทันที ผลเป็นแบบนี้

พอดีลูกค้าออกแบบระบบเว็บใหม่ นี่คือผลแค่ 1 เว็บเท่านั้นนะ เว็บเขาออกแบบระบบใหม่ให้ JOIN TABLE ผลที่ได้ดูครับ Traffic เท่าเดิม แต่ลองดูที่ CPU LOAD กับ SERVER LOAD ดูสิครับ พุ่งขึ้นทันตา
เห็นไหมหล่ะครับ คำว่าเขียนโค๊ดติดต่อ Database แบบเทพๆ สุดท้ายเมื่อเขียนโค๊ดแบบนี้ ก็ต้องอาศัยของเทพๆอีกเช่นกันก็คือ
Server แบบเทพๆ
ซึ่งก็ต้องแลกมาด้วย ราคาขั้นเทพอีกด้วย 5555
ผมไม่ได้รู้เรื่องสถาปัตยกรรมคอมมากนักหรอก แต่สิ่งที่นายเปิ้ลเคยบอกผมไว้ว่า
“การ Select ในแบบปกติระบบจะทำงานบน เมมโมรี่ แต่หาก JOIN เมื่อไหร่ มันจะไปทำงานบนฮาร์ดดิสก์แทน สมัยก่อนแรมอาจจะน้อยคนเลยหันไปทำงานบนฮาร์ดดิสก์ แต่ปัจจุบัน Server มีแรมในระดับ GB ทั้งนั้น ดังนั้นลองมาคิดดูว่า เมมโมรี่ เทียบกับฮาร์ดดิสก์ที่ทำงานในระดับไม่กี่พัน หรือ หมื่น rpm จะทำงานเร็วได้เท่าเมมโมรี่ได้ เพราะการอ่านบนฮาร์ดดิสก์ ไหนจะอ่านไฟล์เว็บ ไหนจะอ่านนู่นๆนี่ๆอีก”
เว็บ Mocyc.com ผมเมื่อก่อน(5-6 ปีก่อน)คนเข้าน้อยกว่านี้ แต่ทำไม Server แทบรับไม่ได้ พอมาเขียนระบบการใช้งาน Database ใหม่ ตอนนี้คนเข้าเยอะกว่าตอนนั้น 3-4 เท่า แต่ Server ทำงานเบาลงกว่าเดิมมาก
บางครั้งทฤษฏีที่ร่ำเรียนมา มันก็สู้ประสบการณ์ไม่ได้ สู้ๆๆๆ
วันนี้มาเพิ่มซะหน่อย ลองดูผลหลังจากเอา JOIN ออก ดีนะที่เจ้าของเว็บเชื่อ และ แก้ไขโค๊ดให้ โดยเปลี่ยนการคิวรี่ข้อมูล ไม่ใช้ JOIN ผลออกมาแบบนี้ครับ

ดูกราฟเทียบกันสิครับ
หากเป็นเว็บไซต์ใหญ่ๆหล่ะ คนเข้าวันนึงเป็นหลายหมื่น หรือ เป็นแสน ผลกระทบย่อมมากตาม สุดท้ายก็มีแค่คำแก้ตัวคำเดียวว่า “Server รับไม่ไหว” เหอๆๆๆ
Posted in PHP, ความรู้ | 4 Comments »