Archive for the ‘ PHP Technology ’ Category

ปัญหาการใช้ Single quote (‘) ใน SQLite

มีงานที่ต้องใช้ PHP กับ SQLite จากเดิม code ที่เขียนการ intsert ใน Database จะไม่มีปัญหากับการ Insert single quote เพราะใช้กับฐานข้อมูล MySQL คำสั่ง insert เป็นดังนี้

INSERT INTO TB(ID, NAME) VALUES(1, 'Hi I\'m Supot');

สามารถ Insert ข้อมูลได้ปกติไม่มีปัญหาอะไร และ ข้อมูลที่ลงไปก็ถูกต้อง คือ ลง Hi I’m Supot แต่พอเปลี่ยนฐานข้อมูลจาก MySQL ไปเป็น SQLite คำสั่้ง insert ข้างต้นไม่สามารถใช้ได้ เนื่องจากคำสั่งข้อมูลได้มาจากการใช้ function addslashes จากการค้นหาพบงิธีการแก้ไขจากที่นี่ SQL Quoting And PHPเปลี่ยนไปใช้ function sqlite_escape_string

$name = sqlite_escape_string(DATA_XX)

แหล่งข้อมูล
SQL Quoting And PHP
addslashes
sqlite_escape_string

[PHP]Unable to load dynamic library “php_mcrypt.dll”

มีโอกาสได้ใช้งาน module mcrypt ใน PHP พอเปิดใช้งานแล้วลอง start Apache ดูแต่ก็ยังใช้ไม่ได้ เปิดดู log เจอ error ดังนี้

PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\\AppServer\\AppServ\\php5\\ext\\php_mcrypt.dll' - The specified module could not be found.\r\n in Unknown on line 0

วิธีการแก้ไขปัญหา ให้ copy libmcrypt.dll ไปวางใน folder bin ของ Apache จากนั้นทำการ restart Apache ก็สามารถใช้งาน mcrypt ได้แล้ว

[PHP] การส่ง parameter แบบ pass by reference

เขียน PHP มาก็ไม่นานและไม่ชำนาญ เพราะส่วนมาก็ใช้พวก CMS หรือ Blog อย่าง WordPress ทำเว็บอย่างเดียว พอมีงานที่ต้องเขียนเอง เนื่องจากติดนิสัยมาจากการเขียน Java อยากส่ง parameter ไปให้ function แบบ pass by reference ลองหาข้อมูลดู สามารถได้ตวามดังนี้ การส่ง parameter แบบปกติจะเป็นแบบ pass by value ดังนั้นถ้าต้องการให้ส่งแบบ pass by reference จะต้องทำดังนี้

public function passByRef(&$param){
	//Code here...
}

จุดที่แตกต่างก็คือ เครื่องหมาย “&” ที่ใส่ก่อนหน้า $param
ตัวอย่างเช่น

<?php
$name = "Supot";
echo "Before : ".$name."<br/>";
passByRef($name);
echo "After : ".$name."<br/>";

function passByRef(&$params){
	$params = "Change value";
}
?>

ผลที่ได้จะเป็น

Before : Supot
After : Change value

โอ้ มันช่างง่ายอะไรเช่นนี้ แต่ตอนใช้งานนี่วุ่นพอควรถ้าไม่จำ พอไปลองหาดูในเอกสารของ PHP แล้วมี function เป็นแบบ pass by reference อยู่พอสมควร

[PHP] ปัญหา Cannot send session cache limiter headers already sent

เนื่องจากเวลาทำเว็บ PHP มักนิยม encoding ด้วย UTF-8 เสมอไม่เคยเจอปัญหา เพิ่งจะมาเจอก็ตอนเปลี่ยนมาใช้ Notepad++ ในการเขียน PHP แทน Adobe Dreamweaver เพราะไม่ค่อยได้ใช้ในการ Design แค่ Code อย่างเดียว ปัญหาที่เจอเคือการใช้งาน Session ดังนี้

<?php
session_start();
echo "Session Start...";
?>

ดูผ่านๆ ไม่น่ามีปัญหาอะไร แต่เจอ Errorแบบนี้

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxx) in xxx

ก็หน้ามืดไปเกือบ ชั่วโมงได้ สุดท้ายพบว่าเป็นที่ Notepad++ เนื่องจาก Default Encoding ผมกำหนดเป็น UTF-8 ดังรูป
php-utf8-encoding-problem
ตัว Notepad++ เพิ่มข้อความอะไรสักอย่างในไฟล์ ดังนี้ (เปิดจากไฟล์ปกติจะไม่เจอ ที่เจอเนื่องจากลองใช้ Java อ่านข้อมูลออกมา)

๏ปฟ<?php
session_start();
echo "Session Start...";
?>

ทำให้เกิด error ดังกล่าว วิธีแก้ไขให้ บันทึกรูปแบบ Encoding เป็น Encoding UTF-8 Without BOM ดังรูป
php-utf8-encoding-problem
หวังว่าคนที่เจอปัญหาเดียวกันจะได้แก้ไขได้ถูกทางครับ
เพิ่มเติม 08-02-2011 : เพื่อนที่ทำงานแนะนำว่าให้เพิ่ม ob_start(); ในบรรทัดแรกก็แก้ปัญหาได้เหมือนกัน

[MySQL] MyISAM กับ InnoDB

ต่อจากตอนที่แล้ว พอมาใช้ PDO แล้วชีวิตมันก็ดีขึ้นตามลำดับ ที่ควรจะเป็น แต่มาติดปัญหาเรื่อง Transaction นิดหน่อย เนื่องมาจากตารางที่ออกแบบมานั้น (คนอื่นออกแบบมาอีกที) ใช้ engine เป็น MyISAM ซึ่งเท่าที่อ่านมาคือมันไม่รองรับการทำ transaction ผมไม่รู้เสียเวลา่ตั้งนานว่าเขียน Code ผิดตกหล่นตรงไหนนี่ สั่ง rollback ก็แล้ว ข้อมูลก็ยังมาอยู่ดี จนสุดท้ายลองไปดูโครงสร้างของ table โอ้ๆๆ ถึงบางอ้อเลย เลยลองเปลี่ยนมาเป็น InnoDB แล้วทุกอย่างก็เป็นไปอย่างที่คิดไม่มีผิด

ISAM (MyISAM) ซึ่งมีความรวดเร็วในการอ่านและเขียนสูง เนื่องจากมีการจัดเก็บไว้ในรูปแบบของแฟ้มข้อมูล ซึ่งรองรับการอ่านข้อมูลพร้อมๆ กันได้ (เหมาะสำหรับ Web Application) แต่อาจจะมีปัญหาเมื่อใช้งานกับระบบที่ต้องมีการอ่าน/เขียน ข้อมูลในตารางเดียวกัน พร้อมๆ กันที่สำคัญ ฐานข้อมูลประเภท MyISAM จะมีปัญหาเรื่อง Index เสีย และ Data Corrupt บ่อยมาก หากใช้งานใน OS ที่เป็น Windows และมีการ Shutdown อย่างไม่ถูกต้อง ซึ่งทำให้ผู้ดูแลระบบต้องมีการซ่อมแซม (repair table bad_table) ตารางทีมีปัญหาอยู่เรื่อยๆ
InnoDB ข้อดีคือ รองรับการทำ Transaction รองรับการอ่านและเขียน พร้อมๆ กันได้ดีกว่าฐานข้อมูลประเภท MyISAM และยังมีระบบ Auto Data Recovery หากมีการ shutdown โดยไม่เหมาะสม (ไฟดับ)ซึ่งในการใช้งานผู้ใช้สามารถเลือกได้ว่าจะให้ตารางใดเป็นประเภท InnoDB หรือ MyISAM ขึ้นอยู่กับความเหมาะสม (ว่าจะเลือกความเร็ว หรือ ประสิทธิภาพ)
ที่มา : http://joezine.exteen.com/20060305/myisam-innodb

หมายเหตุ : ที่หาไม่เจอสักที เพราะปกติผมจะให้ Default engine เป็น InnoDB เลยไม่เคยเจอปัญหานี้
อ้างอิง/แหล่งข้อมูล
InnoDB vs MyISAM vs Falcon benchmarks – part 1