<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpaLinux.com &#187; Programming</title>
	<atom:link href="http://spalinux.com/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://spalinux.com</link>
	<description>Resources for Relaxing Linux System Administrators</description>
	<lastBuildDate>Mon, 26 Jul 2010 09:51:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>การแสดงผล Error ของ PHP</title>
		<link>http://spalinux.com/2010/02/configure_display_php_errors</link>
		<comments>http://spalinux.com/2010/02/configure_display_php_errors#comments</comments>
		<pubDate>Fri, 12 Feb 2010 08:21:45 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[php error]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1077</guid>
		<description><![CDATA[การตรวจสอบข้อผิดพลาด (error) เวลาพัฒนาโปรแกรม หรือเมื่อรันโปรแกรม ถือว่ามีความสำคัญอย่างหนึ่ง เพื่อที่จะทำให้ระบบทำงานได้อย่างถูกต้อง สำหรับการพัฒนา Web Application ด้วย PHP การตรวจสอบหรือแสดงผลข้อผิดพลาด สามารถทำได้ สองวิธีหลักๆ คือ แสดงข้อผิดพลาด (error) ผ่านหน้าเว็บ เก็บข้อผิดพลาดไว้ในไฟล์ (log file) เพื่อการตรวจสอบ วิธีแรก การแสดงผลข้อผิดพลาด ผ่านหน้าเว็บเมื่อรันโปรแกรมเลย ถือว่ามีความสะดวกสบายมาก คือเมื่อโปรแกรมเมอร์พัฒนาโปรแกรมไป รันผ่านหน้าเว็บ ก็สามารถเห็นข้อผิดพลาดที่เกิดขึ้นได้เลย ว่าเกิดปัญหาที่ไหน ไฟล์อะไร บรรทัดเท่าไร แต่จะมีข้อเสียอย่างมาก หากปล่อยให้มีการแสดงผลข้อผิดพลาดนี้ แก่ผู้ใช้งานทั่วไป เพราะอาจแสดงรายละเอียดโปรแกรมมากเกินไป ซึ่งอาจทำให้เปิดเผยช่องโหว่ของโปรแกรมได้ คำแนะนำคือ ในขณะที่กำลังพัฒนาโปรแกรม (development) หรือบนเครื่องเซิร์ฟเวอร์สำหรับทดสอบโปรแกรม เราอาจเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บเลย เพื่อสะดวกต่อโปรแกรมเมอร์ ในการตรวจสอบ แต่เมื่อไรก็ตาม ระบบเริ่มใช้งานจริง (production) แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ ให้เก็บข้อผิดพลาดไว้ในแบบที่ 2 คือเก็บไว้ในไฟล์ (log file) แล้วดูข้อผิดพลาดจากในไฟล์ ตัวอย่างข้อผิดพลาดในการเขียน [...]]]></description>
			<content:encoded><![CDATA[<p>การตรวจสอบข้อผิดพลาด (error) เวลาพัฒนาโปรแกรม หรือเมื่อรันโปรแกรม ถือว่ามีความสำคัญอย่างหนึ่ง เพื่อที่จะทำให้ระบบทำงานได้อย่างถูกต้อง</p>
<p>สำหรับการพัฒนา Web Application ด้วย PHP การตรวจสอบหรือแสดงผลข้อผิดพลาด สามารถทำได้ สองวิธีหลักๆ คือ</p>
<ol>
<li>แสดงข้อผิดพลาด (error) ผ่านหน้าเว็บ</li>
<li>เก็บข้อผิดพลาดไว้ในไฟล์ (log file) เพื่อการตรวจสอบ</li>
</ol>
<p><span id="more-1077"></span></p>
<p>วิธีแรก การแสดงผลข้อผิดพลาด ผ่านหน้าเว็บเมื่อรันโปรแกรมเลย ถือว่ามีความสะดวกสบายมาก คือเมื่อโปรแกรมเมอร์พัฒนาโปรแกรมไป รันผ่านหน้าเว็บ ก็สามารถเห็นข้อผิดพลาดที่เกิดขึ้นได้เลย ว่าเกิดปัญหาที่ไหน ไฟล์อะไร บรรทัดเท่าไร</p>
<p>แต่จะมีข้อเสียอย่างมาก หากปล่อยให้มีการแสดงผลข้อผิดพลาดนี้ แก่ผู้ใช้งานทั่วไป เพราะอาจแสดงรายละเอียดโปรแกรมมากเกินไป ซึ่งอาจทำให้เปิดเผยช่องโหว่ของโปรแกรมได้</p>
<p>คำแนะนำคือ ในขณะที่กำลังพัฒนาโปรแกรม (development) หรือบนเครื่องเซิร์ฟเวอร์สำหรับทดสอบโปรแกรม เราอาจเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บเลย เพื่อสะดวกต่อโปรแกรมเมอร์ ในการตรวจสอบ</p>
<p>แต่เมื่อไรก็ตาม ระบบเริ่มใช้งานจริง (production) แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ ให้เก็บข้อผิดพลาดไว้ในแบบที่ 2 คือเก็บไว้ในไฟล์ (log file) แล้วดูข้อผิดพลาดจากในไฟล์</p>
<p>ตัวอย่างข้อผิดพลาดในการเขียน PHP เช่น พิมพ์เครื่องหมาย : แทนที่เป็น ;</p>
<pre>$ <strong>cat /var/www/html/test.php
</strong>&lt;?php</pre>
<pre>print 'hello'<span style="color: #ff0000;"><strong>:</strong></span></pre>
<pre>?&gt;</pre>
<h4>แสดงข้อผิดพลาดผ่านหน้าเว็บ (display_errors)</h4>
<p>PHP เวอร์ชั่นหลังๆ จะปิดการแสดงข้อผิดพลาดผ่านหน้าเว็บ หากต้องการเปิดคุณสมบัตินี้ทำได้สองวิธีคือ</p>
<p>1. แก้ไฟล์ /etc/php.ini จะมีผลทั้งเซิร์ฟเวอร์</p>
<p>ออปชั่นที่ต้องแก้ไขคือ &#8220;display_errors&#8221;</p>
<ul>
<li>&#8220;On&#8221; หากต้องการเปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ เหมาะสำหรับการพัฒนาโปรแกรม (development)</li>
<li>&#8220;Off&#8221; หากไม่ต้องการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ สำหรับระบบที่ใช้งานจริงแล้ว (production)</li>
</ul>
<p>ตัวอย่างการคอนฟิกในไฟล์ /etc/php.ini</p>
<pre>...
display_errors = On
...</pre>
<p>หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล</p>
<pre># <strong>service httpd reload
</strong>Reloading httpd:                                           [  OK  ]</pre>
<p>ตัวอย่างการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ</p>
<p><a href="http://spalinux.com/wp-content/uploads/2010/02/02-display_errors_with_html_errors.png"><img title="display_errors = On" src="http://spalinux.com/wp-content/uploads/2010/02/02-display_errors_with_html_errors.png" alt="" width="595" height="272" /></a></p>
<p>2. หากไม่สามารถแก้ไขไฟล์ /etc/php.ini ได้ สามารถใช้ฟังก์ชั่น &#8220;ini_set&#8221; เพื่อเปิดคุณสมบัตินี้ได้</p>
<p>ตัวอย่างการใช้ฟังก์ชั่น &#8220;ini_set&#8221; เพื่อตั้งค่าคอนฟิก &#8220;display_errors&#8221;</p>
<pre>&lt;?php

ini_set('display_errors', TRUE);
...
?&gt;</pre>
<h4>เก็บข้อผิดพลาดไว้ในไฟล์ (error_log)</h4>
<p>เมื่อระบบใช้งานจริง (production) แล้ว แนะนำให้ปิดการแสดงผลข้อผิดพลาดผ่านหน้าเว็บ แต่ให้เก็บไว้ในไฟล์ ไว้ดูย้อนหลังได้</p>
<p>ตัวอย่างคอนฟิกให้เก็บข้อผิดพลาดของการรัน PHP ไว้ในไฟล์ /var/log/httpd/php_errors.log</p>
<pre>...
html_errors = Off
log_errors = On
error_log = /var/log/httpd/php_errors.log
...</pre>
<p>ต้องสร้างไฟล์สำหรับเก็บ และตั้งค่าเจ้าของไฟล์ (owner) เพื่อให้โปรเซสเว็บเซิร์ฟเวอร์ เช่น apache เขียนไฟล์ได้</p>
<pre># <strong>touch /var/log/httpd/php_errors.log
</strong># <strong>chown apache /var/log/httpd/php_errors.log</strong></pre>
<p>หลังจากแก้ไขไฟล์ ต้องรีโหลด Web Server เพื่อให้คอนฟิกใหม่มีผล</p>
<pre># <strong>service httpd reload
</strong>Reloading httpd:                                           [  OK  ]</pre>
<p>ตัวอย่างข้อผิดพลาดที่ถูกเก็บไว้ในไฟล์</p>
<pre># <strong>tail -f /var/log/httpd/php_errors.log
</strong>[12-Feb-2010 12:49:25] PHP Parse error:  syntax error, unexpected ':' in /var/www/html/test.php on line 3</pre>
<p>หรือถ้าต้องการเก็บไว้ใน syslog ก็แก้คอนฟิก &#8220;error_log&#8221; ให้เป็น syslog ได้</p>
<pre>...
html_errors = Off
log_errors = On
error_log = syslog
...</pre>
<p>ตัวอย่างการแสดงผลในไฟล์ /var/log/messages</p>
<pre># <strong>tail -f /var/log/messages
</strong>Feb 12 15:05:08 web httpd: PHP Parse error:  syntax error, unexpected ':' in /var/www/html/test.php on line 3</pre>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/02/configure_display_php_errors/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ทดสอบ FOREIGN KEY Constraints ใน MySQL</title>
		<link>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints</link>
		<comments>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints#comments</comments>
		<pubDate>Sat, 23 Jan 2010 10:13:04 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql constraints]]></category>
		<category><![CDATA[mysql foreign key]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1061</guid>
		<description><![CDATA[บทความนี้ต่อจาก การสร้าง FOREIGN KEY Constraints ใน MySQL เพื่อทดสอบการ เพิ่ม แก้ไข ลบ ข้อมูล โดยในเวลาเริ่มแต่ละหัวข้อจะใช้ข้อมูลนี้เป็นหลัก mysql&#62; SELECT * FROM groups; +----------+------------+ &#124; group_id &#124; group_name &#124; +----------+------------+ &#124;      101 &#124; Accounting &#124; &#124;      102 &#124; Engineer   &#124; &#124;      103 &#124; IT         &#124; &#124;      104 &#124; Manager    &#124; +----------+------------+ 4 rows in set (0.00 sec) mysql&#62; SELECT * FROM [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ต่อจาก <a href="http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints">การสร้าง FOREIGN KEY Constraints ใน MySQL</a> เพื่อทดสอบการ เพิ่ม แก้ไข ลบ ข้อมูล โดยในเวลาเริ่มแต่ละหัวข้อจะใช้ข้อมูลนี้เป็นหลัก</p>
<pre><span id="more-1061"></span>mysql&gt; <strong>SELECT * FROM groups;
</strong>+----------+------------+
| group_id | group_name |
+----------+------------+
|      101 | Accounting |
|      102 | Engineer   |
|      103 | IT         |
|      104 | Manager    |
+----------+------------+
4 rows in set (0.00 sec)</pre>
<pre>mysql&gt; <strong>SELECT * FROM users;
</strong>+---------+----------+-----------+
| user_id | group_id | user_name |
+---------+----------+-----------+
|     501 |      101 | Ms.A      |
|     502 |      102 | Ms.B      |
|     503 |      102 | Mr.C      |
|     504 |      103 | Mr.D      |
|     505 |      104 | Mr.E      |
+---------+----------+-----------+
5 rows in set (0.00 sec)</pre>
<h4>การ DELETE ข้อมูล</h4>
<p>หลังจากใส่ FOREIGN KEY ในตาราง users เรียบร้อยแล้ว ทดสอบการลบ DELETE กลุ่ม &#8216;IT&#8217; ออกจาก table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>DELETE FROM groups WHERE group_id='103';
</strong><span style="color: #ff0000;">ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<p>ข้อมูลกลุ่ม &#8216;IT&#8217; ยังอยู่ใน table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>SELECT * FROM groups;
</strong>+----------+------------+
| group_id | group_name |
+----------+------------+
|      101 | Accounting |
|      102 | Engineer   |
|      103 | IT         |
|      104 | Manager    |
+----------+------------+
4 rows in set (0.00 sec)</pre>
<p>เราไม่สามารถลบ group &#8216;IT&#8217; ได้ เนื่องจากมีการอ้างอิงจาก table &#8216;users&#8217;</p>
<p>หากต้องการจะลบ ต้องแก้ไขข้อมูลที่มีการอ้างอิงมายัง group &#8216;IT&#8217; นี้ (group_id=103) เช่นในที่นี้ต้องเปลี่ยน group_id ของ &#8216;Mr.D&#8217; ไปเป็นกลุ่มอื่น เช่นเปลี่ยนเป็น กลุ่ม &#8216;Engineer&#8217;</p>
<p>ตรวจสอบว่าใครอยู่ group &#8216;IT&#8217; บ้าง</p>
<pre>mysql&gt; <strong>SELECT * FROM users WHERE group_id=103;
</strong>+---------+----------+-----------+
| user_id | group_id | user_name |
+---------+----------+-----------+
|     504 |      103 | Mr.D      |
+---------+----------+-----------+
1 row in set (0.00 sec)</pre>
<p>เปลี่ยนกลุ่มของ &#8216;MR.D&#8217; เป็น Engineer</p>
<pre>mysql&gt; <strong>UPDATE users SET group_id=102 WHERE user_id=504;
</strong>Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0</pre>
<p>ตรวจสอบว่าใครอยู่ group &#8216;IT&#8217; อีกครั้ง</p>
<pre>mysql&gt; <strong>SELECT * FROM users WHERE group_id=103;
</strong>Empty set (0.00 sec)</pre>
<p>ทดสอบการลบกลุ่ม IT</p>
<pre>mysql&gt; <strong>DELETE FROM groups WHERE group_id=103;
</strong>Query OK, 1 row affected (0.00 sec)</pre>
<p>ครั้งนี้จะสามารถลบได้แล้ว เพราะไม่มี user คนไหนอยู่ในกลุ่มนี้แล้ว</p>
<h4>การ INSERT, UPDATE ข้อมูล</h4>
<p>จะด้วยความผิดพลาดของโปรแกรมหรือตั้งใจ สมมติเราเพิ่ม users ใหม่ แล้วตั้ง group_id=109 ซึ่งไม่มีอยู่ใน table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES (506, <span style="color: #ff0000;">109</span>, 'Mr.X');
</strong><span style="color: #ff0000;">ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<p>เราจะไม่สามารถ INSERT ข้อมูลแบบนี้ได้ ต้องไปสร้าง group_id 109 ใน table &#8216;groups&#8217; ก่อน</p>
<p>เช่นเดียวกัน เราไม่สามารถ UPDATE ข้อมูลที่ไม่ถูกต้องได้</p>
<pre>mysql&gt; <strong>UPDATE users SET group_id=109 WHERE user_id=505;
</strong><span style="color: #ff0000;">ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<h4>การ DROP TABLE</h4>
<p>หากยังมีการอ้างอิงฟิลด์ข้อมูลอยู่ เราไม่สามารถ DROP TABLE ที่ยังมีข้อมูลอ้างอิงอยู่ได้ เช่นในที่นี้เราไม่สามารถ DROP TABLE groups ได้</p>
<pre>mysql&gt; <strong>DROP TABLE groups;
</strong><span style="color: #ff0000;">ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails</span></pre>
<p>ถึงแม้ไม่มีข้อมูล rows ใดเลยใน users ก็ไม่สามารถ DROP TABLE groups ได้</p>
<pre>mysql&gt; <strong>DELETE FROM users;
</strong>Query OK, 5 rows affected (0.00 sec)</pre>
<pre>mysql&gt; <strong>DROP TABLE groups;
</strong>ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints">การสร้าง FOREIGN KEY Constraints ใน MySQL</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>การสร้าง FOREIGN KEY Constraints ใน MySQL</title>
		<link>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints</link>
		<comments>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints#comments</comments>
		<pubDate>Sat, 23 Jan 2010 09:22:39 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql constraints]]></category>
		<category><![CDATA[mysql foreign key]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1053</guid>
		<description><![CDATA[ส่วนใหญ่แล้วการออกแบบฐานข้อมูลจะมีการใช้บางฟิลด์ข้อมูล เพื่อเชื่อมโยงความสัมพันธ์ระหว่าง table ทำให้ต้องมีการคำนึงถึงเวลา เพิ่ม แก้ไข หรือ ลบฟิลด์ที่ใช้เชื่อมนั้น ไม่เช่นนั้นข้อมูลในฐานข้อมูลอาจมีปัญหาได้ MySQL สนับสนุนคุณสมบัติการใช้ FOREIGN KEY Constraints เพื่อแก้ไขปัญหานี้ได้ แต่ต้องใช้ table เป็นแบบ InnoDB ในบทความนี้ขออธิบายปัญหาที่เกิดขึ้น พร้อมยกตัวอย่างวิธีการใช้ FOREIGN KEY Constraints เพื่อป้องกันปัญหาได้ ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลสำหรับเก็บชื่อ users และแต่ละคนเป็นสมาชิกได้ 1 กลุ่มจากตาราง groups เริ่มต้นออกแบบ table ง่ายๆ ได้ดังนี้ mysql&#62; CREATE TABLE groups (  group_id     INT UNSIGNED NOT NULL,  group_name   VARCHAR(255),  PRIMARY KEY    (group_id) ); mysql&#62; CREATE TABLE [...]]]></description>
			<content:encoded><![CDATA[<p>ส่วนใหญ่แล้วการออกแบบฐานข้อมูลจะมีการใช้บางฟิลด์ข้อมูล เพื่อเชื่อมโยงความสัมพันธ์ระหว่าง table ทำให้ต้องมีการคำนึงถึงเวลา เพิ่ม แก้ไข หรือ ลบฟิลด์ที่ใช้เชื่อมนั้น ไม่เช่นนั้นข้อมูลในฐานข้อมูลอาจมีปัญหาได้</p>
<p>MySQL สนับสนุนคุณสมบัติการใช้ FOREIGN KEY Constraints เพื่อแก้ไขปัญหานี้ได้ แต่ต้องใช้ table เป็นแบบ InnoDB ในบทความนี้ขออธิบายปัญหาที่เกิดขึ้น พร้อมยกตัวอย่างวิธีการใช้ FOREIGN KEY Constraints เพื่อป้องกันปัญหาได้</p>
<p><span id="more-1053"></span></p>
<p>ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลสำหรับเก็บชื่อ users และแต่ละคนเป็นสมาชิกได้ 1 กลุ่มจากตาราง groups เริ่มต้นออกแบบ table ง่ายๆ ได้ดังนี้</p>
<pre>mysql&gt; <strong>CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
);</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id)
);</strong></pre>
<p>ใส่ข้อมูลทดสอบดังนี้</p>
<pre>mysql&gt; <strong>INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');</strong></pre>
<p>จากฐานข้อมูลตัวอย่าง เราใช้ฟิลด์ group_id ในการเชื่อมโยงความสัมพันธ์ระหว่าง groups และ users เพื่อระบุว่า แต่ละ users อยู่ใน group ใด</p>
<p>หากมีการแก้ไขข้อมูล เช่นต้องการลบ (DELETE) ข้อมูล group ที่ชื่อ &#8216;IT&#8217; ออกจากฐานข้อมูล หากไม่มีวิธีการตรวจสอบ ไปลบแค่จากตาราง &#8216;groups&#8217; จะทำให้ ข้อมูลของ &#8216;Mr.D&#8217; ในตาราง &#8216;users&#8217; มีปัญหาทันที เพราะไม่สามารถอ้างอิงกลับมายังชื่อ group ได้</p>
<p>โดยดีฟอลต์ การสร้าง table ใน MySQL หากไม่มีการระบุชนิด ในคำสั่ง &#8216;CREATE TABLE&#8217; ตารางที่สร้างได้จะเป็นแบบ MyISAM ซึ่งไม่สามารถสร้าง FOREIGN KEY ได้</p>
<p>สามารถใช้คำสั่ง &#8216;SHOW ENGINES&#8217; ใน mysql เพื่อตรวจสอบชนิดของ table ที่สร้างได้</p>
<pre>mysql&gt; <strong>SHOW ENGINES;
</strong>+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO      | Clustered, fault-tolerant tables                           | NULL         | NULL | NULL       |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| <strong><span style="color: #0000ff;">MyISAM</span>     </strong>| <strong><span style="color: #0000ff;">DEFAULT</span> </strong>| Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| <strong><span style="color: #0000ff;">InnoDB</span></strong>     | <strong><span style="color: #0000ff;">YES</span></strong>     | Supports transactions, row-level locking, and <strong><span style="color: #0000ff;">foreign keys</span></strong> | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+</pre>
<p>ถ้าจะใช้ FOREIGN KEY ได้นั้น table ที่มีการอ้างอิงกันทั้งหมด ต้องเป็นชนิด InnoDB คือต้องระบุออปชั่น ENGINE=InnoDB เวลาสร้าง table</p>
<p>เมื่อสร้างเป็น InnoDB แล้ว ระบุฟิลด์ที่ต้องการตรวจสอบ constraints ใน table ที่ใช้อ้างอิงไปยัง table อื่น</p>
<p>เช่นในที่นี้เราต้องการให้ table &#8216;users&#8217; ใช้ฟิลด์ชื่อ group_id เพื่ออ้างอิงไปยัง table &#8216;groups&#8217; เราต้องระบุ FOREIGN KEY ใน table &#8216;users&#8217;</p>
<p>วิธีการระบุการอ้างอิง FOREIGN KEY ฟิลด์ &#8216;group_id&#8217; จาก table &#8216;groups&#8217;</p>
<pre><span style="color: #0000ff;"><strong>FOREIGN KEY (group_id) REFERENCES groups(group_id)</strong></span></pre>
<p>วิธีการเปลี่ยน table จาก MyISAM ให้เป็น InnoDB และเพิ่ม FOREIGN KEY ทำได้ 2 วิธี</p>
<p> 1. ใช้คำสั่ง &#8216;ALTER TABLE&#8217; เพื่อแก้ไข<br />
 2. ใช้คำสั่ง &#8216;DROP TABLE&#8217; ทิ้งไปแล้วสร้างใหม่ แต่ข้อมูลที่มีอยู่จะหายหมด</p>
<h4>ใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิดเป็น InnoDB</h4>
<p>เราสามารถใช้คำสั่ง &#8216;ALTER TABLE&#8217; เพื่อเปลี่ยนชนิดของ table หรือแก้ไขฟิลด์ต่างๆ ได้</p>
<p>การใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิด table เป็นแบบ InnoDB</p>
<pre>mysql&gt; <strong>ALTER TABLE groups ENGINE=InnoDB;
</strong>Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0</pre>
<pre>mysql&gt; <strong>ALTER TABLE users ENGINE=InnoDB;
</strong>Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0</pre>
<p>เพิ่ม FOREIGN KEY ใน table &#8216;users&#8217;</p>
<pre>mysql&gt; <strong>ALTER TABLE `users` ADD FOREIGN KEY (group_id) REFERENCES groups(group_id);
</strong>Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0</pre>
<p>หมายเหตุ ต้องดูผลลัพธ์การใช้คำสั่ง ALTER TABLE ด้วย ว่าการเปลี่ยนแปลง table สำเร็จหรือไม่</p>
<h4>ลบแล้วสร้าง TABLE ใหม่แบบ InnoDB และใช้ FOREIGN KEY</h4>
<p>ใช้คำสั่ง DROP TABLE เพื่อลบ table &#8216;users&#8217;</p>
<pre>mysql&gt; <strong>DROP TABLE users;
</strong>mysql&gt; <strong>DROP TABLE groups;</strong></pre>
<p>ใช้คำสั่ง CREATE TABLE เพื่อสร้าง table ใหม่ แล้ว ใส่ข้อมูลลงไปเหมือนเดิม</p>
<pre>mysql&gt; <strong>CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
) <span style="color: #0000ff;">ENGINE=InnoDB</span>;</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id),
<span style="color: #0000ff;"> FOREIGN KEY (group_id) REFERENCES groups(group_id)
</span>) <span style="color: #0000ff;">ENGINE=InnoDB;</span></strong></pre>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');</strong></pre>
<p>สังเกตสิ่งที่เพิ่มขึ้น</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html" target="_blank">MySQL 5.1 Reference Manual :: 13.6.4.4 FOREIGN KEY Constraints</a></li>
<li><a href="http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints">ทดสอบ FOREIGN KEY Constraints ใน MySQL</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 2</title>
		<link>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2</link>
		<comments>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:03:57 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[MyODBC]]></category>
		<category><![CDATA[ODBC]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1018</guid>
		<description><![CDATA[หลังจาก ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1 ก่อนที่จะใช้ ODBC เพื่อดึงข้อมูลจากฐานข้อมูล MySQL ได้ ต้องมีการคอนฟิกค่าพารามิเตอร์ต่างๆ ก่อน  ในตอนที่ 2 นี้จะแสดงตัวอย่างการคอนฟิกค่า ODBC เพื่อจะเชื่อมต่อเข้ากับ Database Server และตัวอย่างการใช้โปรแกรม Excel เพื่อดึงข้อมูลมาจากฐานข้อมูล MySQL คอนฟิก ODBC การคอนฟิก ODBC บน Windows จะเป็นการสร้าง DSN (Data Source Name) ซึ่งสามารถเริ่มต้นทำได้โดยไปที่ Control Panel &#8211;&#62; Administrative Tools &#8211;&#62; Data Sources (ODBC)   เลือก driver เป็นแบบ MySQL ODBC 5.1 Driver    ใส่ค่าพารามิเตอร์สำหรับการเชื่อมต่อฐานข้อมูล Data [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจาก <a href="http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1">ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</a> ก่อนที่จะใช้ ODBC เพื่อดึงข้อมูลจากฐานข้อมูล MySQL ได้ ต้องมีการคอนฟิกค่าพารามิเตอร์ต่างๆ ก่อน </p>
<p>ในตอนที่ 2 นี้จะแสดงตัวอย่างการคอนฟิกค่า ODBC เพื่อจะเชื่อมต่อเข้ากับ Database Server และตัวอย่างการใช้โปรแกรม Excel เพื่อดึงข้อมูลมาจากฐานข้อมูล MySQL</p>
<p><span id="more-1018"></span></p>
<h4>คอนฟิก ODBC</h4>
<p>การคอนฟิก ODBC บน Windows จะเป็นการสร้าง DSN (Data Source Name) ซึ่งสามารถเริ่มต้นทำได้โดยไปที่</p>
<p>Control Panel &#8211;&gt; Administrative Tools &#8211;&gt; Data Sources (ODBC)</p>
<p><img class="alignnone size-full wp-image-1020" title="B1 User DSN" src="http://spalinux.com/wp-content/uploads/2009/12/B1_User_DSN.png" alt="B1 User DSN" width="461" height="384" /></p>
<p> </p>
<p>เลือก driver เป็นแบบ MySQL ODBC 5.1 Driver </p>
<p><img class="alignnone size-full wp-image-1021" title="B2 Create New Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/B2_Create_New_Data_Source.png" alt="B2 Create New Data Source" width="468" height="352" /></p>
<p> </p>
<p>ใส่ค่าพารามิเตอร์สำหรับการเชื่อมต่อฐานข้อมูล</p>
<p><strong>Data Source Name</strong> : ตั้งชื่อ DSN<br />
<strong>Server</strong> : ชื่อ Hostname หรือ IP Address ของ Database Server<br />
<strong>Port </strong>: พอร์ตของ MySQL ดีฟอลต์ 3306<br />
<strong>User</strong> : Username สำหรับการล็อกเข้าฐานข้อมูล<br />
<strong>Password</strong> : รหัสผ่าน<br />
<strong>Database</strong> : ชื่อ Database ที่ต้องการ </p>
<p>หากใส่ข้อมูล Server, User, Password ถูกต้อง จะสามารถเลือกชื่อ Database ในช่อง Database ได้</p>
<p><img title="B3 Connection Parameters" src="http://spalinux.com/wp-content/uploads/2009/12/B3_Connection_Parameters.png" alt="B3 Connection Parameters" width="425" height="410" /></p>
<p> </p>
<p>ตัวอย่างผลลัพธ์จากการกดปุ่ม [Test]</p>
<p><img title="B4 Test Result" src="http://spalinux.com/wp-content/uploads/2009/12/B4_Test_Result.png" alt="B4 Test Result" width="134" height="107" /></p>
<p> </p>
<p>หลังจากคอนฟิกเรียบร้อย จะมีชื่อ DSN ที่เพิ่มขึ้น</p>
<p><img title="B5 Finished" src="http://spalinux.com/wp-content/uploads/2009/12/B5_Finished.png" alt="B5 Finished" width="461" height="384" /></p>
<p> </p>
<h4> ทดลองดึงข้อมูลด้วย Excel</h4>
<p>เพื่อความง่ายในการทดสอบ จะใช้ Microsoft Excel  </p>
<p> เปิดโปรแกรม Excel</p>
<p><img title="C1 New Excel File" src="http://spalinux.com/wp-content/uploads/2009/12/C1_New_Excel_File.png" alt="C1 New Excel File" width="698" height="312" /></p>
<p> </p>
<p>เลือกเมนู Data &#8211;&gt; Import External Data &#8211;&gt; Import Data จะมีหน้าต่าง &#8220;Select Data Source&#8221; แสดงขึ้นมา</p>
<p>เลือก &#8220;+Connect to New Data Source.odc&#8221; แล้วกดปุ่ม [Open]</p>
<p><img title="C2 Select Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/C2_Select_Data_Source.png" alt="C2 Select Data Source" width="601" height="393" /></p>
<p> </p>
<p>หน้าจอ Wizard ช่วยในการคอนฟิก เลือก &#8220;ODBC DSN&#8221;</p>
<p><img title="C3 Data Connection Wizard" src="http://spalinux.com/wp-content/uploads/2009/12/C3_Data_Connection_Wizard.png" alt="C3 Data Connection Wizard" width="498" height="363" /></p>
<p> </p>
<p>เลือกชื่อ Data Source ที่คอนฟิกไว้แล้ว</p>
<p><img title="C4 Choose Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/C4_Choose_Data_Source.png" alt="C4 Choose Data Source" width="498" height="363" /></p>
<p> </p>
<p>เลือกชื่อ Database และ Table ที่ต้องการจะดึงข้อมูล</p>
<p><img title="C5 Select Database and Table" src="http://spalinux.com/wp-content/uploads/2009/12/C5_Select_Database_and_Table.png" alt="C5 Select Database and Table" width="498" height="369" /></p>
<p> </p>
<p>สามารถเซฟคอนฟิกที่สร้างไว้ เป็นไฟล์ เพื่อสะดวกในการดึงข้อมูลครั้งต่อไปได้</p>
<p><img title="C6 Save Data Connection File" src="http://spalinux.com/wp-content/uploads/2009/12/C6_Save_Data_Connection_File.png" alt="C6 Save Data Connection File" width="509" height="363" /></p>
<p> </p>
<p> เลือกช่องใส่ข้อมูลใน Excel แล้วกด [OK]</p>
<p><img title="C7 Where to put Data" src="http://spalinux.com/wp-content/uploads/2009/12/C7_Where_to_put_Data.png" alt="C7 Where to put Data" width="347" height="218" /></p>
<p> </p>
<p> ตัวอย่างผลลัพธ์การดึงข้อมูลจาก MySQL ผ่าน ODBC แล้วแสดงใน Excel</p>
<p><img title="C8 Imported Data" src="http://spalinux.com/wp-content/uploads/2009/12/C8_Imported_Data.png" alt="C8 Imported Data" width="726" height="459" /></p>
<p> </p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1">ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</title>
		<link>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1</link>
		<comments>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1#comments</comments>
		<pubDate>Fri, 04 Dec 2009 11:39:06 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[MyODBC]]></category>
		<category><![CDATA[ODBC]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1005</guid>
		<description><![CDATA[บทความนี้จะกล่าวถึงการติดตั้งโปรแกรม MySQL Connector/ODBC (หรือชื่อเดิมคือ MyODBC) บน Windows XP เพื่อให้โปรแกรมที่รันอยู่บน Windows หรือโปรแกรมที่พัฒนาขึ้นมาเอง สามารถที่จะดึงข้อมูลจาก MySQL Database ได้ ในตอนแรกจะเป็นการสร้างตัวอย่างฐานข้อมูลสำหรับการทดสอบ และการติดตั้งโปรแกรม ODBC สร้างฐานข้อมูลสำหรับทดสอบ เพื่อการทดสอบการเชื่อมต่อ ODBC เราจะสร้าง User, Password, Database และ Table สำหรับการทดสอบ บน Database Server โดยมีรายละเอียดดังนี้ Database Name:    myodbc_test User:                          myodbc Password:               password Table Name:          test01 ตัวอย่างการใช้คำสั่งเพื่อสร้างฐานข้อมูลสำหรับทดสอบ mysql&#62; CREATE DATABASE myodbc_test; mysql&#62; GRANT ALL ON myodbc_test.* TO 'myodbc' IDENTIFIED [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้จะกล่าวถึงการติดตั้งโปรแกรม MySQL Connector/ODBC (หรือชื่อเดิมคือ MyODBC) บน Windows XP เพื่อให้โปรแกรมที่รันอยู่บน Windows หรือโปรแกรมที่พัฒนาขึ้นมาเอง สามารถที่จะดึงข้อมูลจาก MySQL Database ได้</p>
<p>ในตอนแรกจะเป็นการสร้างตัวอย่างฐานข้อมูลสำหรับการทดสอบ และการติดตั้งโปรแกรม ODBC</p>
<h4><span id="more-1005"></span>สร้างฐานข้อมูลสำหรับทดสอบ</h4>
<p>เพื่อการทดสอบการเชื่อมต่อ ODBC เราจะสร้าง User, Password, Database และ Table สำหรับการทดสอบ บน Database Server โดยมีรายละเอียดดังนี้</p>
<p>Database Name:    myodbc_test<br />
User:                          myodbc<br />
Password:               password<br />
Table Name:          test01</p>
<p>ตัวอย่างการใช้คำสั่งเพื่อสร้างฐานข้อมูลสำหรับทดสอบ</p>
<pre>mysql&gt; <strong>CREATE DATABASE myodbc_test;
</strong>mysql&gt; <strong>GRANT ALL ON myodbc_test.* TO 'myodbc' IDENTIFIED BY 'password';
</strong>mysql&gt; <strong>USE myodbc_test;</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE `test01` (
  `id`      INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`    VARCHAR(255),
  `email`   VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user01', 'user01@email.com');
</strong>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user02', 'user02@email.com');
</strong>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user03', 'user03@email.com');</strong></pre>
<pre>mysql&gt; <strong>SELECT * FROM test01;
</strong>+----+--------+------------------+
| id | name   | email            |
+----+--------+------------------+
|  1 | user01 | user01@email.com |
|  2 | user02 | user02@email.com |
|  3 | user03 | user03@email.com |
+----+--------+------------------+</pre>
<h4>ดาวน์โหลดและติดตั้ง</h4>
<p>ดาวน์โหลดโปรแกรม MySQL Connector/ODBC 5.1 ได้จาก <a href="http://dev.mysql.com/downloads/connector/odbc/5.1.html">http://dev.mysql.com/downloads/connector/odbc/5.1.html</a></p>
<p>เพื่อความง่ายแนะนำให้เลือกแบบ Windows MSI Installer (x86)</p>
<p>หมายเหตุ เวอร์ชั่นล่าสุดที่เขียนบทความคือ 5.1.6 ชื่อไฟล์คือ mysql-connector-odbc-5.1.6-win32.msi</p>
<p> คลิ้กที่ไฟล์เพื่อรันติดตั้งโปรแกรม</p>
<p><img class="alignnone size-full wp-image-1006" title="A1 Welcome to Setup Wizard" src="http://spalinux.com/wp-content/uploads/2009/12/A1_Welcome_to_Setup_Wizard.png" alt="A1 Welcome to Setup Wizard" width="504" height="386" /></p>
<p> </p>
<p>เลือก Setup Type เป็นแบบ Custom</p>
<p><img title="A2 Setup Type" src="http://spalinux.com/wp-content/uploads/2009/12/A2_Setup_Type.png" alt="A2 Setup Type" width="504" height="386" /></p>
<p> </p>
<p>เลือกทุก features แล้วกด [Next]</p>
<p><img title="A3 Select the Program Features" src="http://spalinux.com/wp-content/uploads/2009/12/A3_Select_the_Program_Features.png" alt="A3 Select the Program Features" width="504" height="386" /></p>
<p> </p>
<p> กดปุ่ม [Install]</p>
<p><img title="A4 Ready to Install the Program" src="http://spalinux.com/wp-content/uploads/2009/12/A4_Ready_to_Install_the_Program.png" alt="A4 Ready to Install the Program" width="504" height="386" /></p>
<p> </p>
<p>หน้าจอแสดงกำลังติดตั้งโปรแกรม </p>
<p> <img title="A5 Installing" src="http://spalinux.com/wp-content/uploads/2009/12/A5_Installing.png" alt="A5 Installing" width="504" height="386" /></p>
<p> </p>
<p>ติดตั้งเสร็จสิ้น </p>
<p><img title="A6 Wizard Completed" src="http://spalinux.com/wp-content/uploads/2009/12/A6_Wizard_Completed.png" alt="A6 Wizard Completed" width="504" height="386" /></p>
<p> </p>
<p>ข้อมูลอ้างอิง</p>
<ul>
<li><a href="http://dev.mysql.com/downloads/connector/odbc/5.1.html" target="_blank">MySQL Connector/ODBC 5.1</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Ruby on Rails บน Fedora 11</title>
		<link>http://spalinux.com/2009/09/install_ruby_on_rails_on_fedora_11</link>
		<comments>http://spalinux.com/2009/09/install_ruby_on_rails_on_fedora_11#comments</comments>
		<pubDate>Sat, 19 Sep 2009 07:36:54 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=923</guid>
		<description><![CDATA[Ruby on Rails ช่วยทำให้การพัฒนา Web Application ด้วยภาษา Ruby ได้ง่ายขึ้น Rails เป็น web framework ประกอบด้วยส่วน (components) ต่างๆ ซึ่งสามารถนำไปสร้างเป็น Web Application ได้เลย เพียงแค่รันไม่กี่คำสั่งเท่านั้น ดาวน์โหลดไฟล์ rpm และติดตั้ง ไฟล์ RPM ที่ต้องใช้สำหรับติดตั้ง Ruby on Rails ruby-rdoc-1.8.6.287-8.fc11.x86_64.rpm rubygems-1.3.1-2.fc11.noarch.rpm rubygem-activesupport-2.3.2-1.fc11.noarch.rpm rubygem-actionpack-2.3.2-1.fc11.noarch.rpm rubygem-actionmailer-2.3.2-1.fc11.noarch.rpm rubygem-activerecord-2.3.2-1.fc11.noarch.rpm rubygem-activeresource-2.3.2-1.fc11.noarch.rpm rubygem-rake-0.8.4-1.fc11.noarch.rpm rubygem-rails-2.3.2-2.fc11.noarch.rpm rubygem-sqlite3-ruby-1.2.4-2.fc11.x86_64.rpm ใช้คำสั่ง rpm เพิ่มติดตั้ง packages ตามลำดับต่อไปนี้ [root@fc11-64a ~]# rpm -ivh ruby-rdoc-1.8.6.287-8.fc11.x86_64.rpm [root@fc11-64a ~]# rpm -ivh rubygems-1.3.1-2.fc11.noarch.rpm [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby on Rails ช่วยทำให้การพัฒนา Web Application ด้วยภาษา Ruby ได้ง่ายขึ้น</p>
<p>Rails เป็น web framework ประกอบด้วยส่วน (components) ต่างๆ ซึ่งสามารถนำไปสร้างเป็น Web Application ได้เลย เพียงแค่รันไม่กี่คำสั่งเท่านั้น</p>
<p><span id="more-923"></span></p>
<h4>ดาวน์โหลดไฟล์ rpm และติดตั้ง</h4>
<p>ไฟล์ RPM ที่ต้องใช้สำหรับติดตั้ง Ruby on Rails</p>
<pre>ruby-rdoc-1.8.6.287-8.fc11.x86_64.rpm
rubygems-1.3.1-2.fc11.noarch.rpm
rubygem-activesupport-2.3.2-1.fc11.noarch.rpm
rubygem-actionpack-2.3.2-1.fc11.noarch.rpm
rubygem-actionmailer-2.3.2-1.fc11.noarch.rpm
rubygem-activerecord-2.3.2-1.fc11.noarch.rpm
rubygem-activeresource-2.3.2-1.fc11.noarch.rpm
rubygem-rake-0.8.4-1.fc11.noarch.rpm
rubygem-rails-2.3.2-2.fc11.noarch.rpm
rubygem-sqlite3-ruby-1.2.4-2.fc11.x86_64.rpm</pre>
<p>ใช้คำสั่ง rpm เพิ่มติดตั้ง packages ตามลำดับต่อไปนี้</p>
<pre>[root@fc11-64a ~]# <strong>rpm -ivh ruby-rdoc-1.8.6.287-8.fc11.x86_64.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygems-1.3.1-2.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-activesupport-2.3.2-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-actionpack-2.3.2-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-actionmailer-2.3.2-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-activerecord-2.3.2-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-activeresource-2.3.2-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-rake-0.8.4-1.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-rails-2.3.2-2.fc11.noarch.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -ivh rubygem-sqlite3-ruby-1.2.4-2.fc11.x86_64.rpm</strong></pre>
<h4>ทดสอบสร้าง Blog ด้วย Rails</h4>
<p>ตัวอย่างต่อไปนี้ แสดงวิธีการสร้าง Web Application ด้วย Rails</p>
<p>สร้างไดเร็คทอรีสำหรับเก็บ application</p>
<pre>[root@fc11-64a ~# <strong>cd /var/www/html/
</strong>[root@fc11-64a html]# <strong>mkdir rails
</strong>[root@fc11-64a html]# <strong>cd rails/</strong></pre>
<p>ใช้คำสั่ง rails เพื่อสร้าง application ขึ้นมา ในที่นี้ตั้งชื่อว่า blog</p>
<pre>[root@fc11-64a rails]# <strong>rails blog
</strong>      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      create  config/locales
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
      create  README
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  config/locales/en.yml
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/new_rails_defaults.rb
      create  config/initializers/session_store.rb
      create  config/environment.rb
      create  config/boot.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/console
      create  script/dbconsole
      create  script/destroy
      create  script/generate
      create  script/runner
      create  script/server
      create  script/plugin
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  test/test_helper.rb
      create  test/performance/browsing_test.rb
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
No such file or directory - /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/bin/../lib/rails_generator/generators/applications/app/../../../../../html/favicon.ico</pre>
<p>คำสั่ง rails จะสร้างไดเร็คทอรีชื่อ blog สำหรับเก็บไฟล์ของ application ที่สร้างขึ้น พร้อมทั้งไดเร็คทอรีย่อยต่างๆ</p>
<pre>[root@fc11-64a rails]# <strong>ls -l
</strong>total 0
drwxr-xr-x 13 root root 156 2009-09-19 12:29 blog</pre>
<pre>[root@fc11-64a rails]# <strong>ls -l blog/
</strong>total 16
drwxr-xr-x 6 root root    63 2009-09-19 12:29 app
drwxr-xr-x 5 root root   128 2009-09-19 12:29 config
drwxr-xr-x 2 root root     6 2009-09-19 12:29 db
drwxr-xr-x 2 root root     6 2009-09-19 12:29 doc
drwxr-xr-x 3 root root    18 2009-09-19 12:29 lib
drwxr-xr-x 2 root root     6 2009-09-19 12:29 log
drwxr-xr-x 5 root root   135 2009-09-19 12:29 public
-rw-r--r-- 1 root root   307 2009-09-19 12:29 Rakefile
-rw-r--r-- 1 root root 10011 2009-09-19 12:29 README
drwxr-xr-x 3 root root   134 2009-09-19 12:29 script
drwxr-xr-x 7 root root   106 2009-09-19 12:29 test
drwxr-xr-x 6 root root    58 2009-09-19 12:29 tmp
drwxr-xr-x 3 root root    20 2009-09-19 12:29 vendor</pre>
<p>เข้าไปในไดเร็คทอรี blog แล้วรันคำสั่ง rake เพื่อสร้าง database สำหรับเก็บข้อมูลของ application blog</p>
<p>โดยดีฟอลต์จะใช้ฐานข้อมูล SQLite version 3 (sqlite3) ดูคอนฟิก database ได้ในไฟล์ &#8220;config/database.yml&#8221;</p>
<pre>[root@fc11-64a rails]# cd blog</pre>
<pre>[root@fc11-64a blog]# <strong>cat config/database.yml
</strong># SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
...</pre>
<pre>[root@fc11-64a blog]# <strong>rake db:create
</strong>(in /var/www/html/rails/blog)</pre>
<p>ไฟล์ database ของ sqlite3 ที่ถูกสร้างขึ้นจะถูกเก็บไว้ใน &#8220;db/&#8221;</p>
<pre>[root@fc11-64a blog]# <strong>ls -l db/
</strong>total 0
-rw-r--r-- 1 root root 0 2009-09-19 12:35 development.sqlite3</pre>
<p>ใช้คำสั่ง script/generate เพื่อสร้าง controller และ view ของ application</p>
<pre>[root@fc11-64a blog]# <strong>script/generate controller home index
</strong>      exists  app/controllers/
      exists  app/helpers/
      create  app/views/home
      exists  test/functional/
      create  test/unit/helpers/
      create  app/controllers/home_controller.rb
      create  test/functional/home_controller_test.rb
      create  app/helpers/home_helper.rb
      create  test/unit/helpers/home_helper_test.rb
      create  app/views/home/index.html.erb</pre>
<p> รันคำสั่ง script/server เพื่อสตาร์ตเว็บเซิร์ฟเวอร์ของ application ที่สร้างขึ้น</p>
<p>หมายเหตุ</p>
<ul>
<li>โดยดีฟอลต์ Rails จะรันเว็บเซิร์ฟเวอร์ของตัวเองที่พอร์ต 3000 ไม่ได้ใช้ Apache</li>
<li>
<pre>คำสั่งรันเซิร์ฟเวอร์นี้ หน้าจอจะค้างที่ console เพื่อแสดงเหตุการณ์ (log) ต่างๆ เมื่อมีการเรียกใช้</pre>
</li>
</ul>
<pre>[root@fc11-64a blog]# <strong>script/server
</strong>=&gt; Booting WEBrick
=&gt; Rails 2.3.2 application starting on http://0.0.0.0:3000
=&gt; Call with -d to detach
=&gt; Ctrl-C to shutdown server
[2009-09-19 13:02:23] INFO  WEBrick 1.3.1
[2009-09-19 13:02:23] INFO  ruby 1.8.6 (2008-08-11) [x86_64-linux]
[2009-09-19 13:02:23] INFO  WEBrick::HTTPServer#start: pid=2351 port=3000</pre>
<p>ทดสอบใช้ Browser เรียกเข้ามาที่เครื่อง ระบุ IP และพอร์ต 3000</p>
<p><img title="Ruby on Rails - Welcome-aboard" src="http://spalinux.com/wp-content/uploads/2009/09/01-Welcome-aboard.png" alt="Ruby on Rails - Welcome-aboard" width="768" height="737" /><br />
ตัวอย่าง log ที่แสดงออกหน้าจอ console</p>
<pre>Processing ApplicationController#index (for 10.3.3.1 at 2009-09-19 13:02:42) [GET]</pre>
<pre>ActionController::RoutingError (No route matches "/javascripts/prototype.js" with {:method=&gt;:get}):
  /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
  /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
  /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
  /usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
  /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
  /usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
  /usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
  /usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
  /usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
  /usr/lib/ruby/1.8/webrick/server.rb:82:in `start'</pre>
<pre>Rendering rescues/layout (not_found)</pre>
<p>หากต้องการยกเลิก (stop) เว็บเซิร์ฟเวอร์ ให้กดปุ่ม [Ctrl-C] ที่ Console</p>
<pre><strong><span style="color: #0000ff;">[Ctrl-C]
</span></strong>^C
[2009-09-19 13:06:18] INFO  going to shutdown ...
[2009-09-19 13:06:18] INFO  WEBrick::HTTPServer#start done.
Exiting</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/09/install_ruby_on_fedora_11">ติดตั้ง Ruby บน Fedora 11</a></li>
<li><a href="http://www.ruby-lang.org/" target="_blank">Ruby Programming Language</a></li>
<li><a href="http://guides.rubyonrails.org/getting_started.html" target="_blank">Getting Started with Rails</a></li>
<li><a href="http://mirrors.kernel.org/fedora/releases/11/Everything/x86_64/os/Packages" target="_blank">Fedora 11 Everything (x86_64)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/09/install_ruby_on_rails_on_fedora_11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Ruby บน Fedora 11</title>
		<link>http://spalinux.com/2009/09/install_ruby_on_fedora_11</link>
		<comments>http://spalinux.com/2009/09/install_ruby_on_fedora_11#comments</comments>
		<pubDate>Sat, 19 Sep 2009 07:25:24 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=918</guid>
		<description><![CDATA[ทุกวันนี้สิ่งต่างๆ เกิดขึ้นมากมาย เหตุผลหนึ่งคือเพื่อช่วยให้เรามีชีวิต หรือการทำงานได้สะดวกสบายมากขึ้น ในโลกของการเขียนโปรแกรมก็เช่นเดียวกัน มีภาษาเกิดขึ้นใหม่ๆ รวมทั้งเทคนิค วิธีการพัฒนาโปรแกรม เพื่อช่วยให้โปรแกรมเมอร์สามารถพัฒนาโปรแกรม หรือเขียนโปรแกรมได้ง่าย รวดเร็วกว่าเดิม Ruby เป็นอีกภาษาหนึ่ง ที่คนสร้างเริ่มต้น นำข้อดีของภาษาต่างๆ มารวมกัน (สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ About Ruby) ในที่นี้คงไม่อธิบายรายละเอียดของ Ruby แต่จะกล่าวถึงในแง่ของผู้ดูแลระบบ คือวิธีการติดตั้งโปรแกรมต่างๆ ที่จำเป็น เพื่อให้ผู้ใช้งานหรือโปรแกรมเมอร์สามารถพัฒนาโปรแกรมด้วย Ruby ได้ เช่นเดียวกับภาษาอื่นๆ เช่น Perl, PHP การเขียนโปรแกรมด้วย Ruby สามารถรันบน Text Console หรือจะรันผ่าน Web ก็ได้ บทความนี้ขอเริ่มด้วยวิธีการติดตั้ง ruby พื้นฐาน เพื่อรันผ่าน Console ดาวน์โหลดไฟล์ rpm และติดตั้ง Ruby แผ่นดีวีดีติดตั้ง Fedora 11 ไม่มีไฟล์ RPM สำหรับติดตั้ง ruby [...]]]></description>
			<content:encoded><![CDATA[<p>ทุกวันนี้สิ่งต่างๆ เกิดขึ้นมากมาย เหตุผลหนึ่งคือเพื่อช่วยให้เรามีชีวิต หรือการทำงานได้สะดวกสบายมากขึ้น</p>
<p>ในโลกของการเขียนโปรแกรมก็เช่นเดียวกัน มีภาษาเกิดขึ้นใหม่ๆ รวมทั้งเทคนิค วิธีการพัฒนาโปรแกรม เพื่อช่วยให้โปรแกรมเมอร์สามารถพัฒนาโปรแกรม หรือเขียนโปรแกรมได้ง่าย รวดเร็วกว่าเดิม</p>
<p>Ruby เป็นอีกภาษาหนึ่ง ที่คนสร้างเริ่มต้น นำข้อดีของภาษาต่างๆ มารวมกัน (สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ About Ruby)</p>
<p>ในที่นี้คงไม่อธิบายรายละเอียดของ Ruby แต่จะกล่าวถึงในแง่ของผู้ดูแลระบบ คือวิธีการติดตั้งโปรแกรมต่างๆ ที่จำเป็น เพื่อให้ผู้ใช้งานหรือโปรแกรมเมอร์สามารถพัฒนาโปรแกรมด้วย Ruby ได้</p>
<p><span id="more-918"></span></p>
<p>เช่นเดียวกับภาษาอื่นๆ เช่น Perl, PHP การเขียนโปรแกรมด้วย Ruby สามารถรันบน Text Console หรือจะรันผ่าน Web ก็ได้</p>
<p>บทความนี้ขอเริ่มด้วยวิธีการติดตั้ง ruby พื้นฐาน เพื่อรันผ่าน Console</p>
<h4>ดาวน์โหลดไฟล์ rpm และติดตั้ง Ruby</h4>
<p>แผ่นดีวีดีติดตั้ง Fedora 11 ไม่มีไฟล์ RPM สำหรับติดตั้ง ruby อยู่เลย ต้องดาวน์โหลดไฟล์ RPM มาจาก &#8216;Fedora 11 Everything&#8221;</p>
<p>ไฟล์ RPM ที่ต้องใช้สำหรับติดตั้ง ruby พื้นฐาน</p>
<pre>ruby-libs-1.8.6.287-8.fc11.x86_64.rpm
ruby-1.8.6.287-8.fc11.x86_64.rpm
ruby-irb-1.8.6.287-8.fc11.x86_64.rpm</pre>
<p>ใช้คำสั่ง rpm เพิ่มติดตั้ง packages</p>
<pre>[root@fc11-64a ~]# <strong>rpm -i ruby-libs-1.8.6.287-8.fc11.x86_64.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -i ruby-1.8.6.287-8.fc11.x86_64.rpm
</strong>[root@fc11-64a ~]# <strong>rpm -i ruby-irb-1.8.6.287-8.fc11.x86_64.rpm</strong></pre>
<h4>ทดสอบการเขียนภาษา ruby</h4>
<p>วิธีการทดสอบการเขียนด้วยภาษา ruby สามารถทำได้ง่ายๆ คือรันคำสั่ง ruby แล้วพิมพ์คำสั่งต่างๆ ลงไป เมื่อเขียนเสร็จต้องการรันโปรแกรม ก็กด [Ctrl-D]</p>
<p>ตัวอย่างการเขียนเพื่อเก็บข้อความลงตัวแปรและแสดงผลออกหน้าจอ</p>
<pre>[root@fc11-64a ~]# <strong>ruby</strong>
say = "I love Ruby"
puts say
<strong><span style="color: #0000ff;">[Ctrl-D]
</span></strong>I love Ruby</pre>
<p>หลังจากกด [Ctrl-D] ผลของการรันโปรแกรมก็จะแสดงออกมา<br />
หรือจะเขียนเป็นไฟล์ แล้วใช้คำสั่ง ruby รันก็ได้ผลเช่นเดียวกัน</p>
<pre>[root@fc11-64a ~]# <strong>cat test.rb
</strong>say = "I love Ruby"
puts say</pre>
<pre>[root@fc11-64a ~]# <strong>ruby test.rb
</strong>I love Ruby</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.ruby-lang.org/" target="_blank">Ruby Programming Language</a></li>
<li><a href="http://www.ruby-lang.org/en/about/" target="_blank">About Ruby</a></li>
<li><a href="http://mirrors.kernel.org/fedora/releases/11/Everything/x86_64/os/Packages" target="_blank">Fedora 11 Everything (x86_64)</a></li>
<li><a href="http://spalinux.com/2009/09/install_ruby_on_rails_on_fedora_11">ติดตั้ง Ruby on Rails บน Fedora 11</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/09/install_ruby_on_fedora_11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เขียนโปรแกรมเรียง ip address</title>
		<link>http://spalinux.com/2009/09/how_to_sort_ip_address</link>
		<comments>http://spalinux.com/2009/09/how_to_sort_ip_address#comments</comments>
		<pubDate>Sun, 13 Sep 2009 14:06:28 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[sort ip address]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=912</guid>
		<description><![CDATA[ช่วงนี้รับงานเขียนโปรแกรมเพื่อเก็บข้อมูลอุปกรณ์เน็ตเวิร์ค เพื่อตรวจสอบสถานะการใช้งาน และเก็บสถิติไว้ ข้อมูลอย่างหนึ่งที่เก็บคือ IP Address ของเครื่อง ปัญหาที่เจอคือเวลาสร้างรายชื่ออุปกรณ์ แล้วต้องการเรียง IP Address จากมากไปน้อย ผลลัพธ์ที่แสดงออกมาจะไม่ถูกต้องตามที่ต้องการ ตัวอย่างโครงสร้าง table ที่เก็บข้อมูล mysql&#62; DESCRIBE devices; +-----------+------------------+------+-----+---------+----------------+ &#124; Field     &#124; Type             &#124; Null &#124; Key &#124; Default &#124; Extra          &#124; +-----------+------------------+------+-----+---------+----------------+ &#124; device_id &#124; int(10) unsigned &#124; NO   &#124; PRI &#124; NULL    &#124; auto_increment &#124; &#124; device_ip &#124; varchar(15)      &#124; YES  &#124;     [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้รับงานเขียนโปรแกรมเพื่อเก็บข้อมูลอุปกรณ์เน็ตเวิร์ค เพื่อตรวจสอบสถานะการใช้งาน และเก็บสถิติไว้ ข้อมูลอย่างหนึ่งที่เก็บคือ IP Address ของเครื่อง</p>
<p>ปัญหาที่เจอคือเวลาสร้างรายชื่ออุปกรณ์ แล้วต้องการเรียง IP Address จากมากไปน้อย ผลลัพธ์ที่แสดงออกมาจะไม่ถูกต้องตามที่ต้องการ</p>
<p><span id="more-912"></span></p>
<p>ตัวอย่างโครงสร้าง table ที่เก็บข้อมูล</p>
<pre>mysql&gt; <strong>DESCRIBE devices;
</strong>+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| device_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| device_ip | varchar(15)      | YES  |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)</pre>
<p>ตัวอย่างข้อมูลที่เก็บ</p>
<pre>mysql&gt; <strong>SELECT * FROM devices;
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         1 | 192.168.3.9     |
|         2 | 192.168.10.20   |
|         3 | 192.168.1.1     |
|         4 | 192.168.200.254 |
|         5 | 192.168.5.132   |
+-----------+-----------------+
5 rows in set (0.00 sec)</pre>
<p>ตัวอย่างผลลัพธ์จากการเรียง IP Address โดยใช้ ORDER BY</p>
<pre>mysql&gt; <strong>SELECT * FROM devices ORDER BY device_ip;
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         3 | 192.168.1.1     |
|         2 | 192.168.10.20   |
|         4 | 192.168.200.254 |
|         1 | 192.168.3.9     |
|         5 | 192.168.5.132   |
+-----------+-----------------+
5 rows in set (0.00 sec)</pre>
<p>ผลลัพธ์ที่ได้ เนื่องจากฟิลด์ device_ip ถูกกำหนดเป็น VARCHAR ทำให้การใช้ ORDER BY จะเป็นเรียงตามตัวอักษร คือเรียง 1, 2, 3</p>
<p>เพื่อให้การผลลัพธ์การเรียงถูกต้อง จำเป็นต้องแปลง IP Address จาก VARCHAR ให้เป็น ค่าตัวเลข โดยใช้ฟังก์ชั่น INET_ATON ใน MySQL</p>
<p>ดูวิธีการใช้ฟังก์ชั่น INET_ATON ใน MySQL</p>
<pre>mysql&gt; <strong>HELP INET_ATON;
</strong>Name: 'INET_ATON'
Description:
Syntax:
INET_ATON(expr)</pre>
<pre>Given the dotted-quad representation of a network address as a string,
returns an integer that represents the numeric value of the address.
Addresses may be 4- or 8-byte addresses.</pre>
<pre>URL: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html</pre>
<pre>Examples:
mysql&gt; SELECT INET_ATON('209.207.224.40');
        -&gt; 3520061480</pre>
<p>การเรียง IP Address โดยใช้ฟังก์ชั่น INET_ATON แปลงค่า</p>
<pre>mysql&gt; <strong>SELECT * FROM devices ORDER BY INET_ATON(device_ip);
</strong>+-----------+-----------------+
| device_id | device_ip       |
+-----------+-----------------+
|         3 | 192.168.1.1     |
|         1 | 192.168.3.9     |
|         5 | 192.168.5.132   |
|         2 | 192.168.10.20   |
|         4 | 192.168.200.254 |
+-----------+-----------------+
5 rows in set (0.01 sec)</pre>
<p>ผลลัพธ์ที่ได้จะเรียงได้อย่างถูกต้อง</p>
<h4>ฟังก์ชั่น MySQL ที่เกี่ยวข้อง</h4>
<p>ฟังก์ชั่น INET_ATON แปลงจาก IP Address เป็นตัวเลข</p>
<pre>mysql&gt; <strong>SELECT INET_ATON('192.168.1.1');
</strong>+--------------------------+
| INET_ATON('192.168.1.1') |
+--------------------------+
|               3232235777 |
+--------------------------+
1 row in set (0.00 sec)</pre>
<p>ฟังก์ชั่น INET_NTOA แปลงจากตัวเลขเป็น IP Address</p>
<pre>mysql&gt; <strong>SELECT INET_NTOA('3232235777');
</strong>+-------------------------+
| INET_NTOA('3232235777') |
+-------------------------+
| 192.168.1.1             |
+-------------------------+
1 row in set (0.00 sec)</pre>
<h4>ฟังก์ชั่น PHP ที่เกี่ยวข้อง</h4>
<p>ฟังก์ชั่น ip2long แปลงจาก IP Address เป็นตัวเลข</p>
<pre><strong>print ip2long('192.168.1.1');</strong></pre>
<pre>// return
3232235777</pre>
<p>ฟังก์ชั่น long2ip แปลงจากตัวเลขเป็น IP Address</p>
<pre><strong>print long2ip('3232235777');</strong></pre>
<pre>// return
192.168.1.1</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html" target="_blank">MySQL 5.1 Reference Manual :: Miscellaneous Functions</a></li>
<li><a href="http://www.php.net/ip2long" target="_blank">PHP: ip2long &#8211; Manual</a></li>
<li><a href="http://www.php.net/long2ip" target="_blank">PHP: long2ip &#8211; Manual</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/09/how_to_sort_ip_address/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>โหลดข้อมูลเข้า MySQL ด้วย LOAD DATA INFILE</title>
		<link>http://spalinux.com/2009/08/mysql_load_data_infile</link>
		<comments>http://spalinux.com/2009/08/mysql_load_data_infile#comments</comments>
		<pubDate>Sat, 15 Aug 2009 08:08:21 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql load data]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=901</guid>
		<description><![CDATA[บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้ ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย ตัวอย่างข้อมูลที่ทดสอบ ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้ CREATE TABLE test_load (  id     INTEGER UNSIGNED AUTO_INCREMENT,  dat1   INTEGER UNSIGNED,  dat2   INTEGER UNSIGNED,  PRIMARY KEY(id) ); ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้</p>
<p>ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก</p>
<p>ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย</p>
<p><span id="more-901"></span></p>
<h4>ตัวอย่างข้อมูลที่ทดสอบ</h4>
<p>ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้</p>
<pre>CREATE TABLE test_load (
 id     INTEGER UNSIGNED AUTO_INCREMENT,
 dat1   INTEGER UNSIGNED,
 dat2   INTEGER UNSIGNED,
 PRIMARY KEY(id)
);</pre>
<p>ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; ตัวอย่างไฟล์เป็นดังนี้</p>
<pre>[user@db-server ~]$ <strong>cat data.txt
</strong>2436,156
1732,9161
3016,49
1833,963
5430,434
2092,3929
5430,444
4123,120
...</pre>
<h4>เปิดไฟล์ วนลูป แล้ว INSERT ข้อมูล</h4>
<p>ตัวอย่างโปรแกรม PHP ที่เปิดไฟล์  วนลูปทีละบรรทัด แล้ว INSERT ข้อมูลลง MySQL</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// open file
$fh = fopen($fname, "r");</pre>
<pre>while ( $fline = fgetcsv($fh, "4096", ",") ) {
    $_dat1 = $fline[0];
    $_dat2 = $fline[1];</pre>
<pre>    // loop insert data
    $db_sql = "INSERT INTO test_load ( dat1, dat2 )  VALUES ( '$_dat1', '$_dat2' );";
    $db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>}</pre>
<pre>fclose($fh);
?&gt;</pre>
<p>รันโปรแกรม และใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรัน</p>
<pre>[user@db-server ~]$ <strong>time php insert-data.php data.txt</strong></pre>
<pre><span style="color: #0000ff;"><strong>real    0m0.898s
</strong></span>user    0m0.100s
sys     0m0.564s</pre>
<h4>ใช้คำสั่ง LOAD DATA INFILE</h4>
<p>รูปแบบการใช้คำสั่ง LOAD DATA INFILE มีดังนี้</p>
<pre><strong>LOAD DATA</strong> [LOW_PRIORITY | CONCURRENT] [<strong>LOCAL</strong>] <strong>INFILE 'file_name'
</strong>    [REPLACE | IGNORE]
<strong>    INTO TABLE tbl_name
</strong>    [CHARACTER SET charset_name]
    [{<strong>FIELDS</strong> | COLUMNS}
        [<strong>TERMINATED BY 'string'</strong>]
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [<strong>(col_name_or_user_var,...)</strong>]
    [SET col_name = expr,...]</pre>
<p>คำอธิบายการใช้คำสั่งโดยย่อ</p>
<ul>
<li>INFILE &#8216;file_name&#8217; ระบุว่าโหลดจากไฟล์ไหน </li>
<li>INTO TABLE tbl_name  ระบุชื่อ table ที่จะโหลดข้อมูลลง</li>
<li>FIELDS TERMINATED BY &#8216;string&#8217;  แต่ละฟิลด์คั่นด้วยเครื่องหมายอะไร</li>
<li>(col_name_or_user_var,&#8230;) ในกรณีที่โหลดไม่ครบทุกฟิลด์ตามโครงสร้างของ table ต้องมีการระบุด้วยว่าโหลดใส่ชื่อฟิลด์อะไรบ้างตามลำดับ</li>
</ul>
<p>ตัวอย่างการเขียนโปรแกรม เพื่อโหลดข้อมูลจากไฟล์ ลง table ชื่อ test_load แต่ละฟิลด์คั่นด้วยเครื่องหมาย &#8220;,&#8221; และโหลดเฉพาะฟิลด์ที่ชื่อ dat1, dat2 ตามลำดับ</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// load data
$db_sql = "LOAD DATA LOCAL INFILE '$fname' INTO TABLE test_load
             FIELDS TERMINATED BY ',' ( dat1, dat2 );";
$db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>?&gt;</pre>
<p>รันโปรแกรมเพื่อโหลดข้อมูลลง MySQL ใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรันโปรแกรม</p>
<pre>[user@db-server ~]$ <strong>time php load-data.php data.txt</strong></pre>
<pre><strong><span style="color: #0000ff;">real    0m0.117s
</span></strong>user    0m0.054s
sys     0m0.023s</pre>
<p>สังเกตว่าเวลาที่ใช้ในการรันเพื่อโหลดข้อมูลด้วย LOAD DATA INFILE เร็วกว่าการ เปิดไฟล์และวนลูปมาก</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/load-data.html" target="_blank">MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/08/mysql_load_data_infile/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Cacti บน Fedora 11 ตอนที่ 3</title>
		<link>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3</link>
		<comments>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3#comments</comments>
		<pubDate>Sat, 18 Jul 2009 09:52:26 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[install cacti]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=874</guid>
		<description><![CDATA[ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน   เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;   หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้      การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password    เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password   หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti   เปิดการ polling การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ [...]]]></description>
			<content:encoded><![CDATA[<p>ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน</p>
<p><span id="more-874"></span></p>
<p><img title="Cacti Web Install - Step 1" src="http://spalinux.com/wp-content/uploads/2009/07/01_cacti_install_step-1.png" alt="Cacti Web Install - Step 1" width="816" height="571" /></p>
<p> </p>
<p>เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;</p>
<p><img title="Cacti Web Install - Step 2" src="http://spalinux.com/wp-content/uploads/2009/07/02_cacti_install_step-2.png" alt="Cacti Web Install - Step 2" width="816" height="571" /></p>
<p> </p>
<p>หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้ </p>
<p><img class="alignnone size-full wp-image-878" title="Cacti Web Install - Step 3" src="http://spalinux.com/wp-content/uploads/2009/07/03_cacti_install_step-3.png" alt="Cacti Web Install - Step 3" width="816" height="571" /></p>
<p> </p>
<p>  การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password </p>
<p><img title="Cacti - User Login" src="http://spalinux.com/wp-content/uploads/2009/07/04_cacti_user_login.png" alt="Cacti - User Login" width="816" height="571" /></p>
<p> </p>
<p>เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password</p>
<p><img title="Cacti Forced Password Change" src="http://spalinux.com/wp-content/uploads/2009/07/05_cacti_forced_password_change.png" alt="Cacti Forced Password Change" width="816" height="571" /></p>
<p> </p>
<p>หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti</p>
<p><img title="Cacti Web Console" src="http://spalinux.com/wp-content/uploads/2009/07/06_cacti_web_console.png" alt="Cacti Web Console" width="816" height="571" /></p>
<p> </p>
<h4>เปิดการ polling</h4>
<p>การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ โดยใส่เครื่องหมาย &#8216;#&#8217; ไว้หน้าบรรทัด</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong><span style="color: #0000ff;">#</span>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1</pre>
<p>ต้องแก้ไขไฟล์นี้โดยเอาเครื่องหมาย &#8216;#&#8217; ออก</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1 </pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 1</a></li>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
