Codeans.com – คำตอบของการเขียนเว็บไซต์

แหล่งความรู้ สอนเขียนเว็บไซต์ ด้วย HTML, PHP, Javascript, CSS, AJAX, MySQL และอื่น ๆ

การเพิ่ม rewrite rule ใน wordpress

เราจะเพิ่มเติม rewrite rule กรณีที่ต้องการให้ page บางเพจ สามารถรองรับการส่งค่าตัวแปรผ่าน QueryString 

ดังตัวอย่างนี้

สมมติว่าเราสร้าง Page => gallery ขึ้นมาและมี URL เป็น http://www.codeans.com/gallery โดยหน้านี้จะมีการแสดงผลรูปในแกลลอรี่ทั้งหมด

แต่ถ้าเราต้องการให้หน้านี้แสดงรูปในแกลเลอรี่แยกตามเดือน เราจะต้องทำการส่งค่า เดือน(และปี) ตามไปด้วย 

โดย URL ที่เราต้องการส่งค่าจะเป็น http://www.codeans.com/gallery/date/2011/10  

วิธีการทำก็คือ

- ไปที่ไฟล์ functions.php ของ theme หลัก

- ทำการเพิ่มเติม Rewrite rule ตามนี้

 

// ************* Custom gallery archive

add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );

add_filter( 'query_vars','my_insert_query_vars' );

add_action( 'wp_loaded','my_flush_rules' );

 

// flush_rules() if our rules are not yet included

function my_flush_rules(){

$rules = get_option( 'rewrite_rules' );

 

if ( ! isset( $rules['(gallery)/date/([0-9]{4})/([0-9]{1,2})/?$'] ) ) {

global $wp_rewrite;

  $wp_rewrite->flush_rules();

}

}

 

// Adding a new rule

function my_insert_rewrite_rules( $rules )

{

$newrules = array();

//$newrules['(project)/(\d*)$'] = 'index.php?pagename=$matches[1]&id=$matches[2]';

$newrules['(gallery)/date/([0-9]{4})/([0-9]{1,2})/?$'] = 'index.php?pagename=$matches[1]&year=$matches[2]&monthnum=$matches[3]';    

return $newrules + $rules;

}

 

// Adding the id var so that WP recognizes it

function my_insert_query_vars( $vars )

{

    array_push($vars, 'id');

    return $vars;

}

- หลังจากนั้น เราจะมาตรวจสอบดูว่า Rewrite rule ที่เพิ่มทำงานได้จริงหรือป่าว โดยใส่ code ด้านล่าง ในไฟล์ header.php ของ theme

 

print get_query_var("pagename");

print get_query_var("year");

print get_query_var("monthnum");

 

- ลองเรียก http://www.codeans.com/gallery/date/2011/10 ดูจะปรากฎค่าตัวแปร ที่เราต้องการ

ติดขัดตรงไหน ฝากข้อความในเว็บบอร์ด(ฟอรัม) ได้เลยครับ 

11 October 2011 at 10:53 - Comments

จัดเลย์เอาต์ของหน้าเพจและหน้าคอนเท็นต์ด้วย Multiple content blocks ใน wordpress

 

จัดเลย์เอาต์ของหน้าเพจและหน้าคอนเท็นต์ด้วย plug-in Multiple content blocks ใน wordpress. ทำได้ง่าย ๆ ตามขั้นตอนดังนี้

  1. ดาว์นโหลด plug-in ได้ที่นี่ http://wordpress.org/extend/plugins/multiple-content-blocks
  2. ติดตั้งโดย unzip ไฟล์ปลั๊กอินไปที่  

    /wp-content/plugins/multiple-content/

  3. Activate plug-in
  4. แทรกโค๊ด <?php the_block('blockname'); ?> ในเท็มเพลต ใน (Page หรือ Post) ที่ต้องการ
  5. เมื่อสร้าง/แก้ไข page หรือ post จะปรากฏบล็อกที่เราได้เพิ่มเข้าไปที่ด้านล่าง.

 

 

 

7 September 2011 at 15:00 - Comments

การตรวจสอบข้อมูลอินพุต หรือ validate ด้วย Regular expression

การกรองข้อมูลหรือ validate data เป็นขั้นตอนที่โปรแกรมเมอร์ จำเป็นต้องสร้าง อัลกอริทึมเพื่อมารองรับงานด้านนี้ ซึ่งโดยปกติสามารถทำได้ทั้งส่วนที่เป็นโค้ดดิ้งทั้งทางด้าน client side script และ server side script โดยครั้งนี้ผมจะนำเสนอ วิธีการ validate data โดยใช้ PHP script ด้วยการใช้ Regular expression

6 November 2009 at 12:53 - Comments

PHP สคริปต์สำหรับหาค่า ตัวแปร ใน Querystring ของ URL.

ปกติแล้วสำหรับการหาค่า ตัวแปร Qeurystring ของ URL (ในเพจปัจจุบัน) สามารถทำได้โดย การเรียกใช้ตัวแปร $_GET ซึ่งจะเก็บตัวแปรต่างๆ ของ Querystring ในรูปแบบของ array แต่ถ้าต้องการหาค่า Querystring ของ URL อื่น ๆ จะทำอย่างไร มาดูกันครับ

โจทย์ ให้หาค่าตัวแปร Querystring ของ URL => http://www.codeans.com/store.php?location=surat&shop=0&sales_id=86

[code]
<?php
$url =http://www.codeans.com/store.php?location=surat&shop=0&sales_id=86;
$lastUrl =parse_url($_SERVER['HTTP_REFERER']);
parse_str($lastUrl['query'], $lastGet);

// show result
print "<pre>";
print_r($lastGet);
?>
[/code]

จะเห็นว่าโปรแกรมจะคืนค่า querystring ให้ตัวแปร $lastGet ในรูปแบบของอาร์เรย์

21 September 2009 at 14:28 - Comments

วิธีแก้ปัญหาส่งอีเมลไป hotmail แล้วเข้า junk box

hotmailปกติแล้วการเขียนโปรแกรมส่งเมล สามารถส่งได้ง่าย ๆ สบาย ๆ ปิดตาเขียนก็ส่งได้แล้ว
แต่ปัจจุบัน ไม่ได้เป็นยังแต่ก่อนแล้ว ผู้ให้บริการอีเมล เช่น hotmail, gmail, yahoo mail ต่างให้ความสนใจเรื่องของ privacy และ policy ของผู้ใช้มาก จึงมีการวางมาตรการเพื่อป้องกัน อีเมลขยะและอีเมลที่เป็นมาจาก sender หมวกดำ วิธีแรกที่หลาย ๆ ที่ทำการ ทำตัวฟิลเตอร์ เพื่อกัน spam mail เหล่านี้
เจ้าตัวฟิลเตอร์นี่แหละครับ คือตัวที่ทำให้เมลที่พวกเรา ส่งไปที่ hotmail แล้วเข้า junkbox
โอเค ยังไม่ต้องตกใจครับ ถ้าเราไม่ได้ทำอะไรผิด ปัญหาก็ย่อมมีทางแก้ไขเสมอ

ผมเคยรีเซิร์ทเรื่องนี้มานานซัก 2 ปีแล้ว เพราะเมื่อก่อน ผมจะต้องส่งอีเมลที่เป็นลักษณะ directmail เพื่อส่ง โปรโมชั่นให้ลูกค้าทุกเดือน ตอนนั้นการส่งเมลไป hotmail ทุกฉบับจะเข้า inbox ของ hotmail จนกระทั่ง ประมาณต้นปี 2007 ผมได้รับจดหมายจากลูกค้าว่าทำไมอีเมลสั่งซื้อสินค้า ไปอยู่ใน junkbox ก็เลยต้องหาวิธีแก้ไข ซึ่งก็มีหลายวิธี แต่ที่จะกล่าวต่อไปเป็นวิธีที่ ดูดีมีระดับมากที่สุด (555 หมายถึงที่ฝรั่งเค้าทำกัน)

1.  ต้องเช็คก่อนว่า domain ของคุณ มี SPF/SIDF records หรือยัง
ตรวจสอบได้ที่ http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/ แต่ผมใช้วิธีบอก บอกให้ network admin ของเว็บ hosting ทำให้(โดยส่งลิ้งค์นี้ไปให้)

2. ต่อมาต้องเช็คว่า IPaddress(IPs ของ SMTP server ส่วนใหญ่เป็น IPs เดียวกับ IPs ของโมเมนของคุณ) ที่เราใช้ส่งเมล มีการทำ Reverse DNS หรือยัง?
เช็คกับ server ของ AOL ได้ที่นี่   http://postmaster.aol.com/tools/rdns.html ถ้ามีแล้วจะได้คำตอบดังนี้
DNS Server Response:
xxxxxxxxx.net
Success! It appears you have Reverse DNS.
แต่ถ้าไม่มีต้องบอกให้ network admin คนเดิมช่วยเพิ่ม Reverse DNS ให้

3. หลังจากเรามีทรัพยากรเรียบร้อยแล้ว
ที่นี้ต้องแจ้งลบ ตัวคุณออกจาก spam filter list ของ hotmail ไปที่ลิ้งค์นี้น่ะครับ
https://support.msn.com/eform.aspx?productKey=edfsjmrpp&page=support_home_options_form_byemail&ct=eformts&scrx=1

ที่หน้านี้คุณต้องกรอกข้อมูลต่าง ๆ เกี่ยวกับตัวคุณ เว็บคุณ และพฤติกรรมการส่งเมลของคุณ

โอเค ผมมีตัวอย่างให้ดูเป็นแนวทาง
Service: (ชื่อบริการ)
Junk Mail Reporting Partner Program

What type of problem do you have?
Is this a request to join the program or an update to an existing partner account? (ขอเป็นพาธเนอร์กับ hotmail)
Yes

Primary company contact name (ชื่อของคุณ ชื่อเล่นก็ได้น่ะ)
xxxxx

How would you describe your company or yourself? (ระบุเกี่ยวกับตัวคุณหรือองค์กรของคุณว่าทำไร)
Business (non-marketing) [Business (non-marketing)]

Primary company contact email address
info@xxxx.net

The home page where people sign up for your service:(ชื่อโดเมนที่ส่งอีเมล)
xxxx.net

Contact phone number: (หมายเลขติดต่อกลับ ใส่ไรก็ได้ เค้าไม่โทรมาหรอก)
+66 081555xxxx

The opt-out link for each list or a link to your organization’s Privacy Policy: (ใส่ URL หน้า Privacy or Policy ตรงนี้ฝรั่งให้ความสำคัญมาก)
http://www.xxxx.net

Sender IPs for verification: (ใส่ ipaddress ของ SMTP server)
202.000.60.xxx

Are the IP addresses registered under your company’s name or domain name? (ตรงนี้ผมไม่แน่ใจ แต่ผมใส่ yes น่ะ คือใช่ไว้ก่อน 555)
Yes [Yes]

If no, do you have exclusive sending rights from the IP via your hosting company (not shared with any other senders)? (เนื่องจาก ข้อก่อนใส่ yes ข้อนี้เลยเป็น no)
No [No]

Can you remove customers who complain from your lists, or take action against spam accounts? (ข้อนี้ก็ใส่ Yes)
Yes [Yes]

Forwarding e-mail address (where complaints should be sent): (หอร์เวิร์ดอีเมล ผมใส่อีเมลอีกอันเข้าไป)
support@xxxx.net

ทำการ submit และรอประมาณ 24-48 ชม ก็จะมี staff ของ hotmail ติดต่อกลับมา แลบอกว่าใช้ได้แล้ว
แต่ อาจจะมีบางอย่างไม่โอเคเช่น
- เนื้อหาอีเมลของคุณเสี่ยงเกินไป staff จะบอกให้คุณ ปรับแต่งอีเมลของคุณ คุณอาจเอาฟังก์ชั่นส่งเมลจากลิ้งค์นี้ไปใช้ก็ได้ครับ http://www.codeans.com/2009/02/04/%e0%b8%9f%e0%b8%b1%e0%b8%87%e0%b8%81%e0%b9%8c%e0%b8%8a%e0%b8%b1%e0%b9%88%e0%b8%99%e0%b8%aa%e0%b9%88%e0%b8%87%e0%b9%80%e0%b8%a1%e0%b8%a5-%e0%b9%82%e0%b8%94%e0%b8%a2-php-%e0%b8%aa%e0%b9%88%e0%b8%87/

แต่หากไม่ได้จริง เมลมาคุยกันครับ info@codeans.com

28 July 2009 at 12:06 - Comments

สร้างเว็บเซิร์ฟเวอร์บน Thumb drive. กัน

หลายท่าน ทั้ง PHP เว็บเดเวลลอปเปอร์มือใหม่และมือเก่า ต่างก็มี เว็บเซิร์ฟเวอร์ สำหรับทำให้คอมพิวเตอร์หรือแล็ปท็อปของคุณเป็นเว็บเซิร์ฟเวอร์จำลอง เพื่อใช้ในการพัฒนาเว็บไซต์
สำหรับชาวไทยแล้วตัวที่เป็นที่นิยมสุด คือ appserv ที่มีขั้นตอนการติดตั้งที่ง่าย แต่ในส่วนของ default extension ยังไม่ค่อยรองรับการพัฒนาเว็บไซต์ในระดับ advance ได้ เช่น ฟีเจอร์ในการ switch php4 และ php5, การจำลอง SSL.

แตวันนี้ผมขอแนะนำ Webserver suite อีกตัวนึ่ง ซึ่งผมใช้อยู่และประสิทธิภาพดีมาก ๆ คือ Xampp portable เรามาดูข้อดีข้อเสียกันดีกว่าครับ ว่ามันมีดีอาราย..

ข้อดี
- รองรับ มันสามารถติดตั้งบน thumbdrive ได้สบาย (ควรมีพื้นที่มากกว่า 2GB เพราะมันจะทำให้คุณเล่นกับมันได้เยอะ)
- มีโครงสร้างของ module ต่าง ๆ เช่น apache, php, mysql ที่ดูแล้วเข้าใจง่าย (ทำให้ง่ายต่อการปรับแต่ง)
- default module & extension ของ PHP ค่อนข้างสมบูรณ์ เช่น CURL, MBSTRING, ICONV และอื่น ๆ
- รองรับ  module อื่น ๆ ในการพัฒนา ServerSide ตัวอื่น ๆ เช่น Python, Ruby On rail, Tomcat
- สามารถ switch PHP 4 & PHP5 ได้โดยไม่ต้องจอด เอ้ย โดยการเรียกคอมมานต์ตัวเดียว

วิธีการ
- ต้องติดตั้งตัว engine หลักสำหรับการรัน Portable Apps บน Thumb drive ก่อน ดาวน์โหลดได้ที่นี่ http://portableapps.com/download และทำการติดตั้งบน thumb drive ของคุณ
- โหลดตัว xampp portable แล้วติดตั้งผ่านตัว Portable Apps เท่านี้ก็สามารถรัน เว็บเซิร์ฟเวอร์บน thumb drive ของคุณได้แล้ว

ไว้ตอนหน้า ผมจะแนะนำการรัน python ผ่าน xampp portable ครับ

12 July 2009 at 13:56 - Comments

วิธีสร้าง subdomain โดยใช้ mod rewrite ของ apache ครับ

ครับ กรณีนี้มีคนรีเควสเยอะมากมาย บางที่ก็ให้คำตอบ(แต่มักจะไม่ค่อยครบถ้วนเท่าไหร่)
เอาเป็นว่าลองอ่าน article นี้แล้วกัน
การทำ subdomain โดยใช้ mod rewrite ของ apache นั้น จุดประสงค์ก็มีหลายอย่าง
เช่น เพื่อทำให้โดเมนของ ผู้ใช้ระบบดูน่าเชื่อถือมากขึ้น, บางท่านบอกว่าทำให้ SEO ดีขึ้น

โจทย์ : จงสร้าง subdomain ให้ user “domori” ในเว็บ blogs.com (โดยปัจจุบันการอ้างถึง user
“domori” ใน blogs.com ทำโดยการเรียก http://www.blogs.com/member.php?user=domori)

วิธีการทำมีดังนี้
1. ก่อนอื่นต้องทำการสร้าง wildcard(*) ใน zone ของ blogs.com ก่อนครับ
(โดยคนที่จดโดเมนของ registrar ต่างประเทศเช่น Godaddy.com, Name.com สามารถเข้าไปแก้ไขในส่วนของ DNS management ได้เลย แต่สำหรับการจดผ่าน ผู้ให้บริการในไทย นั้นคงต้องโทรไปบอกให้เขาเพิ่มให้ครับ)
การสร้าง wildcard(*) ทำดังนี้ เพิ่ม record  ใน zone ของ blogs.com (ด้านล่างนี้เลย)
*.blogs.com IN CNAME blogs.com
หลังจากนั้น ลองทดสอบดูโดยการ ping domori.blogs.com ถ้าได้ก็จะมี result กลับมา

2. หลังจาก ทะลวงช่อง DNS ให้ domori แล้ว ต่อไปก็คือต้องมาจัดการ httpd ของ webhosting ว่าเมื่อมีการ request domori.blogs.com แล้วจะให้วิ่งไปไหน โดยการเพิ่ม alias ใน virtaul host ของ blogs.com ใน ไฟล์httpd ดังนี้
ServerAlias www.blogs.com blogs.com *.blogs.com <= เพิ่มอันนี้เข้าไป

3. เท่านี้ domori.blogs.com ก็เกือบจะใช้ได้แล้ว :) แต่ยังก่อน เราต้องมาเขียน .htaccess เพื่อจัดการ rewrite rule http://www.blogs.com/member.php?user=domori เป็น http://domori.blogs.com
โดย สร้าง .htaccess เก็บไว้ใน public_html น่ะครับ ส่วนในไฟล์ .htaccess มีเนื้อหาสาระดังนี้

Options -Indexes
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www.blogs.com
RewriteCond %{HTTP_HOST} ([^.]+).blogs.com
RewriteRule ^(.*)$ member.php?user=%1

เท่านี้ domori ก็กระโดดแซง ทั้ง member.php และ blogs.com ไปอยู่ข้างหน้า กลายเป็น domori.blogs.com ได้แล้ว ไว้เจอกันใหม่ครับ

10 July 2009 at 18:23 - Comments

ฟังก์ชั่น PHP สำหรับ ลบโฟลเดอร์ ที่มีไฟล์อยู่ภายใน (Delete not empty folder).

ปกติบน ยูนิกส์นั้น การ ลบ ไฟล์หรือโฟลเดอร์สามารถทำได้โดยใช้คอมมานต์

[code]
rm -rf {file | folder}

[/code]

แต่สำหรับการลบ โฟลเดอร์ นั้นอาจจะเป็นเรื่องที่น่าปวดหัวยิ่ง เนื่องจากฟังก์ชั่นในการลบ คือ rmdir นั้น. จะสามารถใช้ได้ก็ต่อเมื่อ โฟลเดอร์นั้นว่าง (ไม่มีไฟล์หรือโฟลเดอร์ย่อยภายใน) เอาหล่ะครับ อย่าเพิ่งถอดใจ ผมมีฟังก์ชั่นดีๆ มาเสนอทุกท่าน…. ไปดูโค๊ดกันเลย….

[code]
<?php
function rm($fileglob){
if (is_string($fileglob)) {
if (is_file($fileglob)) {
return unlink($fileglob);
} else if (is_dir($fileglob)) {
$ok = rm("$fileglob/*");
if (! $ok) {
return false;
}
return rmdir($fileglob);
} else {
$matching = glob($fileglob);
if ($matching === false) {
return false;
}
$rcs = array_map('rm', $matching);
if (in_array(false, $rcs)) {
return false;
}
}
} else if (is_array($fileglob)) {
$rcs = array_map('rm', $fileglob);
if (in_array(false, $rcs)) {
return false;
}
} else {
return false;
}
return true;

}

/* ------- Start delete folder backup folder in /home/bemore/public_html/quota/temp/ and it's not empty!! ------*/
rm('/home/bemore/public_html/quota/temp/backup');
[/code]

จากโค๊ดด้านบนเท่านี้คุณก็สามารถโฟลเดอร์่ที่มี ไฟล์หรือโฟลเดอร์ย่อย ๆ ได้โดยไม่ต้อง Recursive ให้ปวดหัวแล้วครับ

2 June 2009 at 17:04 - Comments

สมมติว่าต้องการเปลี่ยนชื่อเว็บไซต์แต่ต้องการให้ Ranking ใน Search engine เหมือนเดิม

ปกติแล้วถ้ามีการเปลี่ยนชื่อ โดเมนเนม เช่นจาก aaa.com เป็น bbb.com
มักจะทำการเปลี่ยนโดยเพิ่ม meta redirect ในส่วนของ HTML header
ซึ่งวิธีการนี้จะ่ส่งผลต่อ ranking ใน search engine อย่างแรงครับ

แต่ก็มีวิธีแก้เสมอครับ คือ search engine แนะนำว่าถ้าจะเปลี่ยนชื่อโดเมน

โดยค่า Ranking ใน search engine เหมือนเดิม สามารถทำได้โดยการ
Redirect header แบบ permanat ครับ วิธีการที่แนะนำสำหรับ webmaster ที่ใช้
PHP & HTML บน Apache web server คือ

1. เขียน PHP SCRIPT (แปะที่หัวไฟล์) ดังนี้

[code]
<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.new-url.com" );
?>

[/code]

2. โดยใช้ rewriterule ผ่าน .htaccess ดังนี้

[code]
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]
[/code]

หรือ
[code]
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^newdomain.com [nc]
rewriterule ^(.*)$ http://www.newdomain.com/$1 [r=301,nc]
[/code]

* อย่าลืมเปลี่ยนคำว่า newdomain.com เป็นชื่อโดเมนใหม่ของคุณหล่ะ

24 February 2009 at 11:46 - Comments

ฟังก์ชั่นส่งเมล โดย PHP ส่งได้ทุกภาษา รับได้ทุกเมลเลอร์

ฟังก์ชั่นนี้ ใช้สำหรับการส่งเมล ซึ่งรองรับทั้งการอ่าน แบบ เท็กซ์ และไฮเปอร์เท็กซ์
โดยใช้ PHP รับรองส่งได้ทุกภาษาไม่ว่าจะเป็น ไทย , ญี่ปุ่น, อังกฤษ, ภาษารัก (อันนี้นอกเรื่อง)
และได้ทดสอบแล้วว่ารับได้กับทุกเมลเลอร์ ไม่ว่าเป็น Gmail, Hotmail, Yahoo, Squirellmail, Outlook, Becky, Moz Thunderbird etc. ผลที่ออกมาตือ เมลไม่มีทางเพี้ยน เพราะเขียนโดยอ้างอิงมาตรฐาน RFC822 ของการส่งเมล ไปดูกันเลย

เริ่ม แรกเขียนฟังก์ชั่นตามนี้

[code lang="php"]
function sendMail($email, $frommail, $subject, $message, $cType='html',$CC="",$BCC=""){
$subject ="=?UTF-8?B?".base64_encode($subject)."?=";
$headers ="From:".$frommail."\n";
if($CC!=""){
$headers .="CC: ".$CC."\n";
}
if($BCC !=""){
$headers .="BCC: ".$BCC."\n";
}
// Start MIME Boundary
$mime_boundary="----kaomail----".md5(time());
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";

// text plain part
$messages = "--$mime_boundary\n";
$messages .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$messages .= "Content-Transfer-Encoding: base64\n\n";
$messages .= chunk_split(base64_encode(strip_tags($message)))."\n\n";

// text html part
$messages .= "--$mime_boundary\n";
$messages .= "Content-Type: text/html; charset=\"utf-8\"\n";
$messages .= "Content-Transfer-Encoding: base64\n\n";
$messages .= chunk_split(base64_encode($message))."\n\n";

// End of Boundary
$messages .= "--$mime_boundary--\n\n";

if (strlen($email) > 0 && strpos($email, "@") !== false) {
if(!mail($email, $subject, $messages , $headers)) {
return false;
}else{
return true;
}
}else{
return true;
}
}

[/code]

หลังจากนั้นก็มาถึงการเรียกใช้งาน
[code lang="php"]

$email ="xx@xxxx.com"; // <= อีเมลผู้รับ
$frommail ="sender@zzzzz.com"; // <= อีเมลผู้ส่ง
$subject = "ทดสอบการส่งเมล"; //<= หัวข้อเมล
$message ="นี่คือเนื้อหาอีเมลที่ส่ง โดยฟังก์ชั่น ฟังก์ชั่นส่งเมล โดย PHP ส่งได้ทุกภาษา รับได้ทุกเมลเลอร์ "; // <= เนื้อหาเมล
sendMail($email, $frommail, $subject, $message);

[/code]

4 February 2009 at 17:41 - Comments

วิธีการรันไฟล์คิวรี่ SQL ขนาดใหญ่ เข้าสู่ฐานข้อมูล MySQL

ปกติ ทุกคนจะเข้าใช้งาน ฐานข้อมูล MySQL ของเว็บโฮสติ้งผ่านทาง phpMyAdmin กันใช่มั้ยครับ แต่ถ้าสมมติว่าท่านต้องการนำเข้าข้อมูลลงฐานข้อมูล ข้อมูลของคุณมีขนาดใหญ่มาก ๆ เช่น 200 MB, แบบนี้วิธีการรันคิวรี่นี้ผ่าน phpMyAdmin คงไปได้ยากแน่นอน เพราะท่านคงติดปัญหา เช่น ข้อจำกัดของเว็บโฮสติ้งในการอัปโหลดไฟล์ที่มีขนาดใหญ่มาก ๆ เป็นต้น เพราะฉะนั้นเรามาหาวิธีการที่จะนำเข้าข้อมูลนี้กันให้ได้จากทรัพยากรที่เรามีเถอะ มาดู CaseStudy กันครับ ก่อนอื่น สิ่งที่ท่านจำเป็น(พื้นฐาน) ที่จำเป็นต้องมีคือ

  • เว็บโฮส์ติ้งที่ติดตั้ง Arpache + MySql
  • เนื้อที่ต้องเพียงพอที่จะรอบรับไฟล์คิวรี่ได้
  • บริการ SSH เพื่อรันคอมมานต์ในการนำเข้าข้อมูลไฟล์คิวรี่ (เป็นบริการที่อาจจะต้องขออนุญาติจากเว็บโฮสติ้ง ลองติดต่อกับผู้ให้บรการเว็บโฮสติ้งของท่านครับ)

ขั้นตอนการทำ

  • ต้องอัปโหลดไฟล์คิวรี่ที่ต้องการนำเข้าไปยัง ฐานข้อมูล MySql โดยผ่านโปรแกรม FTP สมมติว่าอัปโหลดไปยัง ไดเร็คทอรี่และไฟล์คิวรี่ชื่อ /home/codeans/public_html/filearticle2009.sql
  • เข้าใช้บริการ SSH ผ่านโปรแกรม PUTTY (ดาวน์โหลดและดูตัวอย่างได้ที่นี่) สิ่งที่ท่านต้องใส่คือ HOSTNAME , USERNAME และ PASSWORD ซึ่งเป็นค่าเดียวกับ FTP ที่เว็บโฮสติ้งให้มา หลังจาก ล็อกอินเข้าสู่ระบบเรียบร้อย ก็ใช้คอมมานต์เพื่อไปยังไดเร็คทอรี่ที่เก็บไฟล์คิวรี่ filearticle2009.sql โดยพิมพ์ค่ำสั่ง cd /home/codeans/public_html/ แล้ว enter
  • หลังจากนั้นให้ท่านพิมพ์คอมมานต์ เพื่อสั่งให้ MySQL ทำคำสั่งรันคิวรี่โดยไฟล์ ดังนี้

 mysql -u usr_codeans_article -p db_codeans_article &lt; filearticle2009.sql แล้ว enter ระบบจะถาม password

รายละเอียดของคำสั่งคือ

  • mysql คือคำสั่งเรียกใช้ mysql
  • -u usr_codeans_article คือการระบุชื่อผู้ใช้ mysql (คือชื่อผู้ใช้ของฐานข้อมูลที่ได้จากเว็บโฮสติ้ง)
  • -p คือการระบุว่าจะมีการใ่สรหัสผ่าน (คือรหัสผ่านของฐานข้อมูลที่ได้จากเว็บโฮสติ้ง)
  • คือชื่อฐานข้อมูลที่ต้องการรันคิวรี่
  • db_codeans_article < filearticle2009.sql คือ การนำเข้าจาก ไฟล์ชื่อ filearticle2009.sql ไปยัง ฐานข้อมูลชื่อ db_codeans_article (ตรงนี้มีข้อพึงระวังนิดนึงคือ พาธของไฟล์คิวรี่ต้องถูกต้อง)
  • หลังจากนั้นก็รอจนกว่าจะเสร็จ วิธีการตรวจสอบคือ ไปยัง phpMyAdmin ดูข้อมูลว่ามีการนำเข้ามาหรือยัง

หากเจอปัญหาติดต่อที่อีเมล info@codeans.com อยากให้คนไทยเขียนเว็บและหาเงินจากอินเตอร์เน็ตและเงินจากต่างประเทศได้.

22 January 2009 at 11:37 - Comments

คิวรี่ เพื่อหารายการข้อมูล จากหลาย ๆ ตารางที่มีข้อมูลต่างกัน

คิวรี่ เพื่อหารายการข้อมูล จากหลาย ๆ ตารางที่มีข้อมูลต่างชนิดกัน โดยส่วนใหญ่ มักใช้กันเพื่อการทำ data mining หรือ data warehouse คิวรี่นี้ใช้กับ mysql 5 ครับ
ตัวอย่าง

ตาราง A (product_id, product_name, price_sell)
ตาราง B (item_id, item_name, item_sell)

ถ้าเราต้องเขียนคิวรี่เพื่อทำรีพอร์ทให้ผู้บริหาร เพื่อนำเสนอรายการสินค้าทั้งหมด และมีการแบ่งหน้าด้วย (เพราะเป็นรีพอร์ทผ่านเว็บไซต์) วิธีการคือ การใช้ UNION เข้ามาช่วย ลองดูตัวอย่างเลยครับ

[code lang="SQL"]
(select product_id, product_name, price_sell as price from A) UNION (select item_id as product_id, item_name as product_name, item_sell as price from B)  limit 0, 20
[/code]

ผลลัทธ์ที่ออกมา ก็จะเป็นรายการสินค้าของทั้งสองตาราง จำนวน 20 รายการ

21 January 2009 at 17:17 - Comments

mod rewrite สำหรับ รับค่า $_GET จาก URL .html

[ENGLISH DEV]
many people ask some question, How to make rewrite rule in .htaccess with mod_rewrite in apache. the rule use to get query string from .html url, i try to make this with few time and i found how to solve this problem, follow this.
- Firstly make .htaccess file.
- For get querystring from url “http://www.codeans.com/country/6/rewrite.html?buffer=secret” and bind to “http://www.codeans.com/rewrite.php?country=6&buffer=secret” please fill below code to .htaccess

[code lang="php"]
Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^country/(.*)/.html([?].*)? rewrite.php?country=$1&%{QUERY_STRING} [L]
[/code]

Result

make file rewrite.php and put below code for display output

[code lang="php"]
print "

";
print_r($_GET);
[/code]

 :)  Enjoy Codeans!!!

[THAI DEV]
หลายท่านเคยถามคำถาม, ว่าวิธีการเขียน mod rewrite ในการหาค่า querystring($_GET) จาก URL ที่มีนามสกุล .html ผ่าน .htaccess กับ mod_rewrite ใน apache ต้องทำอย่างไร? ผมจึงพยามคิดสูตรการเขียน จึงได้คำตอบดังนี้ครับ
- สร้างไฟล์ .htaccess.
- เขียน Rule สำหรับการรับค่า querystring จาก url "http://www.codeans.com/country/6/rewrite.html?buffer=secret" และให้ rule อ้างถึง "http://www.codeans.com/rewrite.php?country=6&buffer=secret" ใน .htaccess

[code lang="php"]
Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^country/(.*)/.html([?].*)? rewrite.php?country=$1&%{QUERY_STRING} [L]
[/code]

ผลลัพท์

สร้างไฟล์ rewrite.php และเขียนโค๊ดเพื่อแสดงผลลัพท์ 

[code lang="php"]
print "
";
print_r($_GET);
[/code]

 :)  สนุกกับการเขียนโค๊ดกับ Codeans ครับ!!!
9 January 2009 at 15:23 - Comments

การตรวจสอบ ตัวอักษร 2 ไบท์ (Multi-byte validator)

บางครั้งการพัฒนาเว็บแอพพลิเคชั่น ที่ต้องเกี่ยวข้องกับ multi-byte language เช่น ภาษาญี่ปุ่น, รัสเซีย
อาจจะต้องมีการ validate จำนวนไบต์(ขนาด) ของอักขระ,, ลองเอาตัวอย่างไปลองดูครับ

[code lang="php"]
function valid_1byte($char) {
if(!is_int($char)) return false;
return ($char & 0x80) == 0x00;
}

function valid_2byte($char) {
if(!is_int($char)) return false;
return ($char & 0xE0) == 0xC0;
}
function valid_3byte($char) {
if(!is_int($char)) return false;
return ($char & 0xF0) == 0xE0;
}
function valid_4byte($char) {
if(!is_int($char)) return false;
return ($char & 0xF8) == 0xF0;
}

function valid_nextbyte($char) {
if(!is_int($char)) return false;
return ($char & 0xC0) == 0x80;
}

function valid_utf8($string) {
$len = strlen($string);
$i = 0;
while( $i < $len ) {
$char = ord(substr($string, $i++, 1));
if(valid_1byte($char)) { // continue
continue;
} else if(valid_2byte($char)) { // check 1 byte
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
} else if(valid_3byte($char)) { // check 2 bytes
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
} else if(valid_4byte($char)) { // check 3 bytes
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
if(!valid_nextbyte(ord(substr($string, $i++, 1))))
return false;
} // goto next char
}
return true; // done
}
?>
[/code]

23 December 2008 at 15:16 - Comments

Query Random Time คิวรี่สำหรับสร้างเวลาโดยการสุ่ม (สามารถตั้งเวลาได้) แบบง่าย ๆ

หลายคนมีคำถาม???? (โดยเฉพาะพวกหาเงินผ่านเน็ต) โดยการสร้างเว็บที่มี article เยอะ ๆ ) แต่อยากให้ article ที่มีอยู่ในฐานข้อมูล แสดงบนเว็บไซต์ได้ตามเวลาที่เราตั้งไว้, ผมมีคำตอบให้คุณครับ

สมมติว่าเรามี article อยู่ 30000 เรคคอร์ด อยู่ในดาต้าเบสของบล็อก และต้องการ article เหล่านี้ แสดงบนหน้าบล็อก ตามเวลาที่เรากำหนด, วิธีการคือต้องสร้างฟิลด์เพื่อใส่ค่าเวลาให้แก่ article แต่ละเรคคอร์ด หลังจากนั้นก็เขียนคิวรี่ให้บล็อกแสดง article เฉพาะที่มีเวลาเก่ากว่าเวลาปัจจุบัน.

- สมมติว่า ตารางชื่อ blog,
- ทำการสร้างฟิลด์เวลาให้ blog (โดยใช้คิวรี่) -> alter table blog add crdate datetime;
- ใช้คิวรี่เพื่อเซ็ทเวลาในฟิลด์ crdate ของ blog -> update blog set crdate =FROM_UNIXTIME(UNIX_TIMESTAMP(’2008-11-01 00:00:00′)+FLOOR(RAND()*20000000));
โดย “2008-11-01 00:00:00″ เป็นเวลาเริ่มต้น, 20000000 เป็นเวลาจบ (เป็นวินาที) น่าจะจบซักประมาณ เดือน 4 ปี 2009 คิวรี่จะอัเดทให้ฟิลด์ crdate มีค่าเวลาที่สุ่มจาก เวลาเริ่มต้นถึงเวลาจบให้
- ในคิวรี่ที่ใช้แสดง article ให้เพิ่ม condition เวลาเข้าไปด้วยเช่น -> select * from blog where crdate > NOW();

แค่นี้คุณก็จะมีเว็บไซต์ที่มี article ใหม่ ๆ ตลอดเวลาโดยไม่ต้องมานั่งซับมิทให้เมื่อย แหะ แหะ!!!!

27 November 2008 at 15:54 - Comments

ปัญหาจากการใช้ Object Files ผ่าน Form โดย PHP (error handling upload files)

พอดีมีน้องคนสวยเจอปัญหาในการเขียนเว็บไซต์ คือใช้ Object Files สำหรับส่งไฟล์ผ่านฟอร์ม แต่ตอนรับ กลับรับค่าไม่ได้เลย
โดยน้องเค้าส่งเออเรอร์ที่ดีบั๊กได้มาให้ดังนี้

Array ( [products_image] => Array ( [name] => map.jpg [type] => [tmp_name] => [error] => 6 [size] => 0 ) )

จากเออเรอร์ด้านบนจะเห็นว่าเป็นเออเรอร์ประเภทที่ 6 ซึ่งเออเรอร์ Handling files upload errors จะมีอยู่ 8 แบบคือ

  1. UPLOAD_ERR_OK (0) หมายถึงไม่พบเออเรอร์
  2. UPLOAD_ERR_INI_SIZE (1) หมายถึงเออเรอร์เกี่ยวกับขนาดไฟล์ มีขนาดไม่เป็นไปตามคุณสมบัติของเซิร์ฟเวอร์ (upload_max_filesize ใน php.ini or .htaccess)
  3. UPLOAD_ERR_FORM_SIZE (2) หมายถึงเออเรอร์เกี่ยวกับคุณสมบัติของฟอร์มที่สามารถทำได้ (MAX_FILE_SIZE ใน php.ini or .htaccess)
  4. UPLOAD_ERR_PARTIAL (3) การอัปโหลดบางส่วนไม่สมบูรณ์ (อาจจะต้องลองอัปโหลดดูอีกครั้ง)
  5. UPLOAD_ERR_NO_FILE (4) ไม่พบไฟล์ต้นฉบับที่จะทำการอัปโหลด (เช็คไฟล์ต้นฉบับที่จพอัปโหลด)
  6. UPLOAD_ERR_NO_TMP_DIR (6) โฟล์เดอร์ที่เ็ว็บเซิร์ฟเวอร์ใช้เป็นที่เก็บไฟล์ชั่วคราวมีปัญหา (ลองเช็คโดยตรวสอบสิทธิในการใช้งานของโฟลเดอร์ temporary โดยให้เช็คค่า upload_tmp_dir จาก phpinfo(); หลังจากนั้นให้ตรวจสอบสิทธิของโฟลเดอร์นั้นว่า user arpache สามารถเขียนไฟล์ในโฟลเดอร์นี้ได้หรือไม่ *ควรทำงานร่วมกับผู้ดูแลเว็บเซิร์ฟเวอร์)
  7. UPLOAD_ERR_CANT_WRITE (7) ไม่สามรถเขียนไฟล์ได้
  8. UPLOAD_ERR_EXTENSION (8) ไม่รองรับไฟล์นามสกุลนี้
18 November 2008 at 14:37 - Comments

EditInPlace AJAX แก้ไข/วิว ข้อมูลที่เดียวกัน

ตัวนี้เป็น จาวาสคริปต์คอมโปเนนท์ ครับชื่อภาษาอังกฤษคือ Edit in place ถ้าเป็นชื่อไทยคือ อีดิทอินเพลซ 5555
ตัวสคริปต์ตัวนี้เป็นการใช้งานคุณสมบัติของ จาวาสคริปต์ (Javascript) ร่วมกับ CSS & XHTML. โดยการทำงานจะทำให้เราสามารถแก้ไขข้อมูลในโหมดวิวได้เลย. คิดว่าเหมาะมากสำหรับ งานที่มีออปเจ็คฟอร์มเยอะ เช่นฟอร์มนึงมี เท็กต์บ็อกซ์ 300 อัน.
แบบตัวนี้เลย ไฟล์ตัวอย่าง

วิธีการใช้งาน

  1. ดาวน์โหลดไฟล์ editinplace-0.5.0.zip (ถ้าลิ้งก์ให้เข้าไปดาวน์โหลดเวอร์ชั่นล่าสุดได้ที่ http://editinplace.org/download/)
  2. ทำการแตกไฟล์ก็จะได้ไฟล์ที่ใช้งานได้เลย (ไฟล์ที่ให้มาต้องรันด้วย php น่ะครับ)
28 October 2008 at 10:04 - Comments

อยากได้ URL ที่สวย ๆ สำหรับ SEO ด้วย .HTACCESS

ก่อนอื่นเรามาดูกันก่อนว่าทำไปเพื่ออะไร ประเด็นสำคัญ ๆ หลักคือ มันเป็นวิธีการที่ทำให้เซิร์ทเอ็นจิ้น โดยเฉพาะกูเกิ้ลชอบ
โดยวิธีการเปลี่ยน URL โดยอาศัยความสามารถของ mod_rewrite ของ apache webserver,
โดยปกติเว็บเซิร์ฟเวอร์หรือโฮสติ้งที่เราใช้กันอยู่จะมีไฟล์อยู่ตัวหนึ่ง ชื่อ .htaccess ไฟล์นี้ทำอะไรเอ๋ย ? ไฟล์นี้ทำหน้าเป็นตัวคอนฟิกเซิร์ฟเวอร์ที่เราใช้อยู่แต่เป็นระดับ ยูสเซอร์เท่านั้นน่ะครับ (ไว้เจาะลึกกันวันหลังน่ะครับ)
มาดูสิ่งที่เราจะทำกันก่อน
สมมติเดิมที่ URL ที่เราใช้อยู่คือ

http://www.codeans.com/products.php?mainid=1&id=23&plist=1

แต่เราจะเป็น URL ใหม่เพื่อทำ SEO ให้เป็นดังนี้

http://www.codeans.com/products/mainid/1/id/23/plist/1.htm

ถามว่าจะทำอย่างไร
เริ่มที่ ทำการเปิดไฟล์ .htaccess มาเพื่อแก้ไข

[code lang="php"]

Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteRule products/mainid/(.*)/id/(.*)/plist/(.*).html products.php?mainid=$1&id=$2&plist=$3

[/code]

หลังจากนั้นทำการบันทึกไฟล์้ .htaccess ก็เป็นอันเสร็จ
สำหรับวิธีการใช้งานสมมติว่าที่กน้า โฮมเพจเราต้องการให้มีลิ้งก์ไปที่หน้า product โดยมีตัวแปร mainid =1, id=23, plist=1 เราก็สามารถสร้างลิ้งก์แบบสวย ๆ เพื่อลิ้งก์ไป product นั้นได้เลย ดูตัวอย่างละกันครับ

[code lang="php"]



Fantasy product



[/code]

14 October 2008 at 11:29 - Comments

ใช้ CURL สำหรับเปิดหรือเก็บคอนเท็นต์ของเว็บไซต์อื่น ๆ

บางครั้งหลายเว็บไซต์อาจจะมีการเขียนสคริปต์ไปดึงข้อมูลคอนเท้นต์จากเว็บไซต์อื่น ๆ โดยปกติจะมี 2-3 วิธี (ใน PHP) คือ

1. ใช้ฟังก์ชั่น file_get_contents(“http://www.livescore.com”);

2. ใช้ฟังก์ชั่น socket คือ fsockopen(“http://www.livescore.com”, “80″);

3. วิธีสุดท้ายซึ่งเป็นวิธีที่ผมคิดว่าดีที่สุด คือใช้ ฟังก์ชั่นของ CURL วิธีนี้มีการใช้กันมากในเรื่องของการใช้ web service ใน PHP4

ข้อกำหนดพื้นฐานคือเว็บเซิร์ฟเวอร์ที่ใช้ทำต้องเปิดให้ใช้งาน extension curl ซะก่อน สำหรับคนที่เช่าโฮสต์ ก็เขียนเมลบอกให้ แอ็ดมินเปิดให้ก็ได้, สำหรับคนที่จะลองกับเว็บเซิร์ฟเวอร์ในเครื่องที่บ้าน ให้ไปแก้ไขไฟล์ php.ini หาคำว่า “;extension=php_curl.dll” ให้เอา “;” ออก แล้วทำการรีสตาร์ท apache ใหม่

ต่อไปมาดูกันว่า extension curl ได้ถูกเปิดใช้หรือยัง ให้ไปไปดูไฟล์ PHPINFO จะเห็นตามรูปด้านล่างนี้

หลังจากทุกอย่างเรียบร้อยแล้ว ที่นี่เราจะมาเขียนเก็บคอนเท็นต์จาก livescore.com กัน Go Go!!

[code lang="php"]
function getWebContent( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => "",
CURLOPT_USERAGENT => "spider",
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120,
CURLOPT_MAXREDIRS => 10,
);

$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );

$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}

$referer ="http://www.livescore.com";
$content =getWebContent($referer);

print "

";
print_r($content);
?>
[/code]

ค่าที่ content ของเว็บไซต์ที่รีเทิร์นกลับมาจะอยู่ในตัวแปร $content['content'] ฟังก์ชั่นนี้ถ้านำไปประยุกต์จะมีประโยชน์มากมายครับ

8 October 2008 at 16:55 - Comments

สคริปต์ PHP สำหรับอ่าน XML แบบง่าย ๆ

สำหรับผู้ที่สนใจจะดึงข้อมูลจากพวก RSS feed. จึงอยากจะขอแนะนำสคริปต์ XML parser แบบง่าย ๆ ลองดูสคริปต์ข้างล่างน่ะครับ

* สำหรับ (PHP 5) เท่านั้นครับ

[code lang="php"]
$p ="thaihits.info";
$r =($_GET['place']!='')? $_GET['place'] : "nst";
$cur =($_GET['currency']!='')? $_GET['currency'] : "USD";
$sort =($_GET['sort']!='')? $_GET['sort'] : "L";
$src = "http://www.R24DB.com/R24xmlhotel.php?p=$p&r=$r&cur=$cur&sort=$sort";
$xml = simplexml_load_file($src);

print "

";
foreach($xml->children() as $child)
{
echo "
";
print "

";
print "

";
print "

";
echo "

";
}
print "

".$child->HNAME."".(($child->HPROMO=='YES')? " [Recommend] ":"")."
".$child->HLOCATION."
Breakfast : ".$child->HINCLABF." - 10% Service : ".$child->HINCLSVC." - 7% gov.VAT : ".$child->HINCLVAT."

".$child->HRATE."

";

?>
[/code]

3 October 2008 at 11:08 - Comments