หน้าเว็บ

วันศุกร์ที่ 7 มกราคม พ.ศ. 2554

วิธีตรวจสอบว่า PHP request เป็น GET หรือ POST

มีหลายๆครั้งที่เราต้องการให้โค้ด php ไฟล์หนึ่งรองรับทั้ง GET และ POST ดังนั้นจะต้องมีส่วนที่ใช้ในการตรวจสอบว่า request ที่เข้ามายังหน้าเว็บเป็นประเภท GET หรือเป็นประเภท POST วิธีทำก็ง่ายๆดังนี้

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// …
}


ระบบที่ทดสอบ
PHP: 5

ที่มา:
http://stackoverflow.com/questions/1372147/php-check-whether-a-request-is-get-or-post

วันศุกร์ที่ 30 กรกฎาคม พ.ศ. 2553

วิธีเขียน PHP เรียกข้อมูลจาก MS Access .mdb บน Ubuntu

การเรียกดูข้อมูลจาก MS Access บน Ubuntu โดยใช้ PHP นั้นสามารถทำได้โดยเรียกผ่าน ODBC (ย่อจาก Open Database Connectivity ซึ่งเป็น API ใช้สำหรับการเชื่อมต่อกับฐานข้อมูลใดๆ โดย ODBC จะทำหน้าที่เป็น Layer กลางแปลงคำสั่ง odbc ไปเป็นคำสั่งของฐานข้อมูลนั้นๆให้)

1. ก่อนอื่นเตรียมอุปกรณ์กันก่อน ดังต่อไปนี้
sudo apt-get install php5-odbc libmdbodbc mdbtools unixodbc-bin

2. หลังจากนั้นทำการสร้าง DSN (Data Source Name) เพื่อให้ ODBC ทำการเชื่อมต่อ
ในขั้นตอนนี้จะเกี่ยวข้องด้วย 2 ไฟล์ด้วยกันคือ
2.1 ไฟล์ /etc/odbcinst.ini ซึ่งเป็นไฟล์ที่ใช้ในการกำหนด Driver ในการเชื่อมต่อ บางกรณีไฟล์นี้อาจถูกเขียนไว้แล้ว แต่ถ้ายังไม่มีหรือมีแล้วแต่ไม่ใช่ Driver ตัวเดียวกันก็ให้เพิ่มเข้าไปดังนี้ (อย่าลืม sudo ด้วย เดี่ยว save ไม่ได้)
[mdbtoolsodbc]
Description = MDB Tools odbc drivers
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage = 1
CPTimeout =
CPReuse =
UsageCount = 1

- ตรง [mdbtoolsodbc] เป็นชื่อ driver ของเรา ใส่เป็นอะไรก็ได้แต่ห้ามมีเว้นวรรค ไว้ใช้สำหรับการอ้างถึงจากไฟล์อื่น
- ตรง Description ใส่อะไรก็ได้ เป็นแค่คำบรรยายให้เราเข้าใจทีหลังเวลากลับมาอ่าน
- ตรง Driver ลองตรวจสอบดูว่าไฟล์อยู่ที่ /usr/lib หรือไม่ ถ้าไม่อยู่ให้เปลี่ยน path ให้ตรงกับที่อยู่จริง

ขั้นตอนนี้จะเป็นการกำหนด ODBC Driver ให้เป็น mdbtools ซึ่งใช้สำหรับการเชื่อมต่อกับไฟล์ MS Access (.mdb) พอเสร็จแล้ว save และไปขั้นตอนถัดไป

2.2 ไฟล์ /etc/odbc.ini ไฟล์นี้จะเป็นตัวกำหนดการเชื่อมต่อไปยังฐานข้อมูลของเราให้เพิ่มรายละเอียดดังนี้
[TestDatabase]
Description = Miscrosoft Access Database of TestDatabase
Driver = mdbtoolsodbc
Database = /home/supasate/desktop/testdatabase.mdb
Servername = localhost
UserName =
Password =
port = 5432

- ตรง [TestDatabase] เป็นชื่อฐานข้อมูลที่ใช้ในการเชื่อมต่อ ซึ่งตั้งเป็นอะไรก็ได้ ไว้ใช้อ้างถึงจากที่อื่น (ตั้งให้คล้ายกับชื่อไฟล์ .mdb ก็ดี)
- ตรง Description เช่นเดิมเป็นอะไรก็ได้
- ตรง Driver อ้างอิงชื่อ driver ที่เราสร้างไว้ที่ไฟล์ odbcinst.ini ดังนั้นเขียนให้เหมือนกัน
- ตรง Database ให้ใส่ path ไปยังไฟล์ MS Access (.mdb) ที่เราต้องการเรียกข้อมูล
- ส่วนที่เหลือจริงๆไม่ต้องพิมพ์ก็ได้ แต่เขียนให้ดูเป็นตัวอย่างเผื่อเอาไปใช้กับฐานข้อมูลแบบอื่นที่เป็นแบบ server และมีการยืนยันตัวตน

เท่านี้เราก็พร้อมที่เชื่อมต่อกันแล้ว

3. เขียน PHP เพื่อทำการเชื่อมต่อ ดังตัวอย่างข้างล่าง ผมเขียนไว้ในไฟล์ test.php
if (!($conn = odbc_connect("TestDatabase", "", ""))) {
echo "Connection Falied.";
} else {
echo "Connection Success.";
$query = "SELECT ID, FirstName, LastName From EMPLOYEE";
$result = odbc_exec($conn, $query);
while ($row = odbc_fetch_array($result)) {
print $row['ID'].' '.$row['FirstName'].' '.$row['LastName'].'
';
}

- odbc_connect("ชื่อ db ที่เรากำหนดไว้ในไฟล์ odbc.ini", "username", "password")
- $query ใส่คิวรีที่ต้องการ ในที่นี้คือจะดึง field ID, FirstName, LastName มาจากตาราง EMPLOYEE
- odbc_exe(คอนเน็คชันที่สร้างขึ้น, คิวรีสตริง)
- odbc_fetch_array ดึงข้อมูลมาทีละแถว

ในกรณีที่อยากรู้ว่าฐานข้อมูลเรามีตารางอะไรและ Field อะไรบ้างนั้นให้ใช้ตัว GNOME MDB Viewer ในการดู

ลองทดลองบน Command line ดูก่อน โดยสั่ง
php test.php
ถ้าไม่สำเร็จลองตรวจสอบชื่อ Driver ชื่อ ODBC และ Path ไปยังฐานข้อมูลว่าถูกต้องหรือไม่
ถ้าสำเร็จก็ลองไป run บน server ดู โดยถ้าบน server ไม่สำเร็จอาจเกิดจาก SELinux หรือ Firewall ในกรณีที่ต้องมีการเชื่อมต่อ port

ขอให้โชคดีครับ

ระบบที่ทดสอบ
OS: Ubuntu 10.04

อ้างอิง
http://ubuntuforums.org/showthread.php?t=678690
http://www.infoqu.com/dev/database-management/access-msaccess-via-odbc-from-linux-php-228635-1/

วันจันทร์ที่ 2 มีนาคม พ.ศ. 2552

ปัญหา run php บน command line ไม่ได้

อาการคือ run php บน apache server บน localhost ได้เป็นปกติ
แต่พอจะลอง run php เฉยๆบน cmd (command line) ปรากฎมันขึ้น pop-up
php.exe - Unable to Locate Component
This application has failed to start because php_mbstring.dll was not found. Re-installing the application may fix this problem.

แล้วในจอ cmd ขึ้นว่า
PHP Warning: PHP Startup: Unable to load dynamic library 'C:\AppServ\php5\ext\php_exif.dll' - The specified module could not be found.
in Unknow on line 0

บ่อเกิดของปัญหา คิดว่ามี 2 แบบ โดยให้ดูในไฟล์ php.ini
1. extension_dir กำหนดชี้ไปผิดที่หา dll ไม่เจอ (dll เก็บอยูุ่ในโฟลเดอร์ ext ของ php5 ที่เราลงไว้)
2. extension=php_mbstring.dll นั้นประกาศไว้หลัง extension=php_exif.dll

วิธีแก้
ซึ่งกรณีของผมเป็นกรณีที่สอง เนื่องจากว่า php_exif.dll นั้นต้องมีการเรียกใช้ php_mbstring.dll ก่อน ดังนั้นให้ย้าย ขึ้นมาไว้บรรทัดก่อน php_exif.dll
แต่ถ้าเป็นกรณีที่หนึ่งก็ให้แก้ extension_dir ชี้ไปให้ถูกที่แทน

เมื่อทำดังนั้นก็สามารถใช้งานได้เลย (ส่วนสาเหตุว่าทำไม run บน apache localhost แล้วผ่านนี่ไม่แน่ใจ แต่เดาว่า apache อาจจะมีกระบวนการในการ resolve ปัญหานี้โดยเว้นไปโหลดอันอื่นก่อนแล้วค่อยกลับมาโหลดตัวที่ค้างอยู่ทีหลัง)

ระบบที่ทดสอบ
OS: Windows Vista SP1
PHP: ลงผ่าน AppServ 2.5.10

วันอังคารที่ 6 มกราคม พ.ศ. 2552

ปัญหา Cannot modify header information - headers already sent .... บน PHP

ปัญหานี้เกิดจาก มีการส่ง header ไปใหม่หลังจากที่มีการส่ง header และ content ไปครั้งนึงแล้ว

วิธีตรวจแก้ปัญหา
1. ลองดูว่าก่อนที่เรามีการส่ง header ไปใหม่ (เช่น คำสั่ง header()) นั้นมีการ echo หรือ print อะไรออกแล้วหรือไม่ ถ้ามีต้องเอาออกถึงจะใช้คำสั่งเพื่อส่ง header ไปได้

2. ดูว่าด้านหน้า tag ตอนจบ มีเว้นวรรคซ่อนหรือ whitespace รูปแบบอื่นอยู่หรือไม่ กรณีนี้บางครั้งมักเกิดจากไฟล์ UTF-8 แล้วมีการเติม BOM ไว้ที่เริ่มไฟล์ (แต่จะมองไม่เห็น) เช่น ใช้ notepad2 แล้ว encoding เป็น UTF-8 with signature เป็นต้น ให้แก้โดยใช้ UTF-8 เฉยๆ

ระบบที่ทดสอบ
PHP: 5.2

อ้างอิง
http://www.tech-recipes.com/rx/1489/solve-php-error-cannot-modify-header-information-headers-already-sent/

วันพฤหัสบดีที่ 7 สิงหาคม พ.ศ. 2551

แก้ PHPList ให้ทำงานกับ SMTP แบบ TLS

บังเอิญช่วงนี้ผมกำลัง implement ระบบ newsletter ให้กับองค์กรแห่งหนึ่งอยู่ ซึ่งผมก็เลือก PHPList มาใช้เพื่อการนี้

แต่คราวนี้มีปัญหาเกิดขึ้น เมื่อผมพยายามจะใช้ PHPList ส่งเมล์ โดยใช้ SMTP ขององค์กรแห่งนี้

ปัญหาคือว่า องค์กร นี้ใช้ SMTP Authentication, TLS, port 25

แต่ตัว PHPList เวอร์ชันล่าสุดที่ผมใช้นั้นคือ 2.10.5 นั้นไม่รองรับ TLS เพราะว่าลองไปดู module ในการส่งเมล์ของ PHPList จะเห็นว่ามันใช้ PHPMailer เวอร์ชัน1.73 (ดูจากไฟล์ Changelog อันบนสุด) แต่ว่าตัวที่จะรองรับต้องเป็น PHPMailer เวอร์ชัน 2 ขึ้นไป

ก็เลยลองไปโหลดเอา PHPMailer 2.2.1 มา แล้วทำกระบวนการตาม http://www.bookwish.org/phplist-and-gmail-smtp โดยทำการดัดแปลงเล็กน้อยจาก gmail ที่เป็น ssl ให้เป็น tls ดังนี้

สรุปคือ

1. extract PHPMailer 2.2.1 ออกมาจะได้โฟลเดอร์ชื่อ phpMailer_v2.2.1_ แล้วเอาไปไว้ที่ %YOURWWWROOT%/lists/admin โดย %YOURWWWROOT% เป็นที่อยู่ของ public_html หรือ htdocs หรือ wwwroot ของคุณ
2. แก้ไขไฟล์ %YOURWWWROOT%/lists/admin/class.phplistmailer.php
require_once dirname(__FILE__).'/accesscheck.php';

#require( dirname(__FILE__) . '/phpmailer/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.phpmailer.php');
require( dirname(__FILE__) . '/phpmailer_v2.2.1_/class.smtp.php');


3. ในไฟล์เดียวกัน แก้ฟังก์ชัน PHPlistMailer
...
if (isset($GLOBALS['phpmailer_smtpuser])...
$this->SMTPAuth=true;
$this->SMTPSecure="tls";
$this->Port=$GLOBALS['phpmailer_smtpport'];
$this->Username=$GLOBALS['phpmailer_smtpuser'];
$this->Password=$GLOBALS['phpmailer_smtppassword'];
...

4. ในไฟล์เดียวกัน ต่อจากเดิมลงมาหน่อย แก้
if (!$this->Host || $ip == $this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
# logEvent('Sending via smtp');
}

ให้เป็น
if (!$this->Host) {
$this->Mailer = "mail";
# logEvent('Sending via mail');
} else {
$this->Mailer = "smtp";
$this->IsSMTP();
# logEvent('Sending via smtp');
}


5.แก้ไฟล์ %YOURWWWROOT%/ lists/config/config.php

...
define("PHPMAILERHOST",'mail.yoursmtpdomain.com');
...
$phpmailer_smtpuser='smtp username';
$phpmailer_smtppassword='smtp password';
$phpmailer_smtpport=25;
...

เป็นอันใช้ได้

ระบบที่ทดสอบ

PHPList: 2.10.5

Web Server: Apache2.2

Database: MySQL5