<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Natty's blog &#187; PHP</title>
	<atom:link href="http://nattyait.wordpress.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://nattyait.wordpress.com</link>
	<description>Stay hungry. Stay foolish. -- Steve Jobs</description>
	<lastBuildDate>Sun, 27 Dec 2009 12:00:21 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='nattyait.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/34cd372466ad9d5684fd7f486f9f094b?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Natty's blog &#187; PHP</title>
		<link>http://nattyait.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nattyait.wordpress.com/osd.xml" title="Natty&#8217;s blog" />
		<item>
		<title>[PHP] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memcache</title>
		<link>http://nattyait.wordpress.com/2009/06/10/php-mysql-performance/</link>
		<comments>http://nattyait.wordpress.com/2009/06/10/php-mysql-performance/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 18:07:09 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=145</guid>
		<description><![CDATA[เขียนโปรแกรมเล็กๆ ไม่ค่อยมีปัญหาอะไร แต่เมื่อไหร่ก็ตาม ที่งานของเรา ต้องทำงานกับข้อมูลเยอะๆ และ Application ขนาดใหญ่ มีหลาย module โดยเฉพาะ หากใช้ object-oriented ด้วยแล้ว แม้จะมีประโยชน์ในด้านของการออกแบบก็จริง แต่ด้านของ performance ก็มีผลกระทบในแง่ร้ายเช่นกัน ดังนั้น จึงควรที่จะเรียนรู้เกี่ยวกับการ config ค่าต่าง ๆ ทั้งในส่วนของ PHP และ MySQL ค่ะ
blog นี้จะไม่กล่าวถึงการ install ในขั้นต้นนะคะ โดยเป็น Apache Server บน linux ค่ะ

MySQL
เริ่มกันก่อนในส่วน MySQL
ปกติ หากเราลง MySQL แบบ default เราจะใช้ my.ini แบบที่กำหนดมาเป็น default แต่หากเราต้องการจะ modify ให้ใช้งานและรองรับข้อมูลจำนวนมาก ให้เราลองสังเกตใน folder MySQL ของเรา จะมีไฟล์ config [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=145&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>เขียนโปรแกรมเล็กๆ ไม่ค่อยมีปัญหาอะไร แต่เมื่อไหร่ก็ตาม ที่งานของเรา ต้องทำงานกับข้อมูลเยอะๆ และ Application ขนาดใหญ่ มีหลาย module โดยเฉพาะ หากใช้ object-oriented ด้วยแล้ว แม้จะมีประโยชน์ในด้านของการออกแบบก็จริง แต่ด้านของ performance ก็มีผลกระทบในแง่ร้ายเช่นกัน ดังนั้น จึงควรที่จะเรียนรู้เกี่ยวกับการ config ค่าต่าง ๆ ทั้งในส่วนของ PHP และ MySQL ค่ะ</p>
<p>blog นี้จะไม่กล่าวถึงการ install ในขั้นต้นนะคะ โดยเป็น Apache Server บน linux ค่ะ</p>
<p><span id="more-145"></span></p>
<p><strong>MySQL</strong></p>
<p>เริ่มกันก่อนในส่วน MySQL</p>
<p>ปกติ หากเราลง MySQL แบบ default เราจะใช้ my.ini แบบที่กำหนดมาเป็น default แต่หากเราต้องการจะ modify ให้ใช้งานและรองรับข้อมูลจำนวนมาก ให้เราลองสังเกตใน folder MySQL ของเรา จะมีไฟล์ config อีกมากมายเลย เช่น my-huge.ini, my-innodb-heavy-4G.ini, my-large.ini, my-medium.ini, my-small.ini, my-template.ini ซึ่งใน file พิเศษๆ เหล่านี้ จะมีการ set ค่าเหล่านี้ ยกตัวอย่างจาก my-huge.ini</p>
<p>key_buffer = 384M<br />
max_allowed_packet = 1M<br />
table_cache = 512<br />
sort_buffer_size = 2M<br />
read_buffer_size = 2M<br />
read_rnd_buffer_size = 8M<br />
myisam_sort_buffer_size = 64M<br />
thread_cache_size = 8<br />
query_cache_size = 32M</p>
<p>ซึ่งแต่ละ File ก็จะมีการตั้งค่าแตกต่างกันไป วิธีการเอาไปใช้งาน ก็แค่เปลี่ยนชื่อไฟล์ที่เหมาะกับเราเป็นชื่อ my.ini (back up อันเดิมไว้ด้วยก็ดีค่ะ เผื่อมีอะไรผิดพลาด)</p>
<p><strong>xDebug</strong></p>
<p><em>xDebug</em> คือ PHP profiler และช่วยจัด format PHP ให้อ่านง่ายๆ ได้ด้วย</p>
<p><img src="http://www.mikebernat.com/images/xdebug/var_dump_full.jpg" alt="" /></p>
<p>ในส่วนของ profiler จะมีการเก็บ log ของ server เกี่ยวกับเวลาในการรันของแต่ละ class แต่ละ method กันเลยทีเดียว แต่ไฟล์ที่ได้ออกมาจะเป็น text file โง่ๆ ที่อ่านยากมากๆ ต้องลงพวก GUI เป็น WinCacheGrind สำหรับ Windows และ KCacheGrind สำหรับ Linux</p>
<p>ก่อนอื่น ต้องลง xDebug ไว้ที่ server ก่อน</p>
<p>#yum install php-pear<br />
#pecl install xdebug<br />
#vim /etc/php.ini   &lt;&#8211; เพิ่มบรรทัด extension = xdebug.so ลงไป และบรรทัดต่อไปนี้</p>
<p>[xdebug]<br />
xdebug.remote_enable=On<br />
xdebug.remote_autostart=On<br />
xdebug.remote_handler=dbgp<br />
xdebug.remote_host=zero.haadthip.com<br />
xdebug.remote_port=9000<br />
xdebug.remote_mode=req<br />
xdebug.profiler_enable=1<br />
xdebug.profiler_output_dir=&#8221;/tmp/&#8221; &lt;&#8211; log เก็บที่นี่<br />
xdebug.profiler_append=On<br />
xdebug.profiler_enable_trigger=On<br />
xdebug.profiler_output_name=%s</p>
<p>ตรวจสอบให้แน่ใจว่ามี file xdebug.so อยู่ใน /usr/lib/php/modules</p>
<p>และ restart mysql + Apache ด้วยค่ะ ลอง echo phpinfo หากสำเร็จแล้วจะได้ผลดังนี้<br />
<img src="http://tech-blog.box.net/wp-content/uploads/2007/06/xdebug-in-phpinfo.jpg" alt="" /></p>
<p>จากนั้น ก็ลง <a href="http://sourceforge.net/projects/wincachegrind/">WinCacheGrind</a> ซึ่งเอา log file ได้จาก path ที่เสร็จไว้ใน php.ini (xdebug.profiler_output_dir) โหลดไฟล์เข้าไป ก็จะเอาไปแสดงในโปรแกรม ดังรูป<br />
<img src="http://www.pseudocoder.com/wp-content/uploads/2007/04/wincachegrind3.jpg" alt="" /></p>
<p>คราวนี้เราก็วัด performance ก่อน และ หลัง ได้แล้วค่ะ</p>
<p><strong>APC</strong></p>
<p>คือ Alternative PHP cache เอาไว้ cache code โดยจะ cache มันไว้ ณ compile state ทำให้ overhead ลดลง เอาเป็นว่าไม่เกี่ยวข้องกับ database นะคะ</p>
<p>ดูกระบวนการทำงานของ APC กันสักหน่อย<br />
<img src="http://www.ez.no/var/ezno/storage/images/images/community/articles/alternative_php_cache/883778-1-eng-GB/alternative_php_cache.png" alt="" /></p>
<p>ขั้นตอนการ install</p>
<p>#yum install httpd-devel</p>
<p>(php-devel ลงเพราะมันต้องการ apxs หากเราไม่มี apxs ก่อนนจะลง APC มันจะ error ว่า</p>
<p>Sorry, I was not able to successfully run APXS.  Possible reasons:</p>
<p>1.  Perl is not installed;<br />
2.  Apache was not compiled with DSO support (&#8211;enable-module=so);<br />
3.  &#8216;apxs&#8217; is not in your path.  Try to use &#8211;with-apxs=/path/to/apxs<br />
The output of apxs follows<br />
/tmp/tmpe1LwOh/APC-3.0.19/configure: line 3232: apxs: command not found<br />
configure: error: Aborting<br />
ERROR: `/tmp/tmpe1LwOh/APC-3.0.19/configure &#8211;with-apxs&#8217; failed</p>
<p>)<br />
#yum install apc<br />
#pecl install apc<br />
vim /etc/php.ini  เพิ่ม extension=apc.so และเพิ่มบรรทัดต่อไปนี้</p>
<p>[APC]<br />
apc.enabled = 1<br />
apc.shm_segments = 1<br />
apc.shm_size = 64<br />
apc.max_file_size = 10M<br />
apc.stat=1</p>
<p>ทำการ restart Apache และลองดู phpinfo.php</p>
<p><img src="http://www.howtoforge.com/images/apc_php5_lighttpd_debian_etch/3.png" alt="" /></p>
<p>และควรจะ <a href="http://pecl.php.net/apc">download package</a> ของ APC มาด้วย เพราะจะได้ดูทางหน้าเว็บได้ โดยแตกตัว folder เอาไปวางใน root directory นะคะ จะได้หน้าตาเว็บแบบนี้เอาไว้ดู resource เกี่ยวกับ APC ของ server</p>
<p><img src="http://www.rawseo.com/articles/apc_cache/apc_screen.png" alt="" /></p>
<p><strong>Memcache</strong></p>
<p>หลังจากที่มีการ cache หน้า page กันแล้ว ตรงส่วน database ก็มีความสำคัญเช่นกัน เพราะ connection database เป็นอะไรอีกอย่างที่ทำให้เกิดความช้า หากเรา query บ่อย ๆ ประกอบกับมี query ที่ซับซ้อนและมีจำนวนข้อมูลที่เป็นผลลัพธ์มาก ใช้ memcache นี่แหละค่ะ เป็นตัวช่วย</p>
<p>วิธีการติดตั้ง</p>
<p>#wget http://monkey.org/~provos/libevent-1.3e.tar.gz<br />
#tar zxpfv libevent*<br />
#cd libevent*<br />
#./configure<br />
#make install</p>
<p>#wget http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz<br />
#tar zxpfv memcached*<br />
#cd memcached*<br />
#./configure<br />
#make install</p>
<p>#adduser memcached</p>
<p>หากเกิดปัญหาเกี่ยวกับการหา file libevent ไม่เจอ แก้ไขดังนี้</p>
<p>ค่อยมาเขียน</p>
<p>จากนั้น ต้องลง php-memcache ด้วย</p>
<p>#yum install php-pecl-memcache.i386<br />
#vi /etc/php.ini เพิ่มบรรทัดดังต่อไปนี้</p>
<p>[memcache]<br />
memcache.allow_failover=1<br />
memcache.max_failover_attempts=20<br />
memcache.chunk_size=8192<br />
memcache.default_port=11211</p>
<p>ทำการ restart server แล้วตรวจสอบ phpinfo<br />
<img src="http://centoshacker.com/wp-content/uploads/2008/11/memcache_phpinfo.jpg" alt="" /></p>
<p>การใช้งาน memcache ต้อง run ให้มันทำงานอยู่ด้วย เหมือนกับ run server นั่นแหละ โดยใช้คำสั่ง<br />
memcached -vv -u memcached</p>
<p>ถ้าได้ผลแบบนี้แสดงว่า memcache server ได้ run ขึ้นมาแล้ว พร้อมใช้งานค่ะ<br />
<img src="http://4.bp.blogspot.com/_YB14YH_zSmM/SQdKmC5yZmI/AAAAAAAAAEc/3Tu_h54kWn0/s320/memcached-verbose.png" alt="" /></p>
<p>ลองทดสอบว่าสามารถ cache ได้แล้วจริงหรือไม่ โดย copy code ต่อไปนี้ รอไปรันดู</p>
<div>
<div><code><span style="color:#000000;"> <span style="color:#0000bb;">&lt;?php$memcache
<p>&nbsp;</p>
<p></span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Memcache</span><span style="color:#007700;">;<br />
</span><span style="color:#0000bb;">$memcache</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">connect</span><span style="color:#007700;">(</span><span style="color:#dd0000;">'localhost'</span><span style="color:#007700;">, </span><span style="color:#0000bb;">11211</span><span style="color:#007700;">) or die (</span><span style="color:#dd0000;">"Could not connect"</span><span style="color:#007700;">); </span><span style="color:#0000bb;">$version </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$memcache</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getVersion</span><span style="color:#007700;">();<br />
echo </span><span style="color:#dd0000;">"Server's version: "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$version</span><span style="color:#007700;">.</span><span style="color:#dd0000;">"&lt;br/&gt;\n"</span><span style="color:#007700;">; </span><span style="color:#0000bb;">$tmp_object </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">stdClass</span><span style="color:#007700;">;<br />
</span><span style="color:#0000bb;">$tmp_object</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">str_attr </span><span style="color:#007700;">= </span><span style="color:#dd0000;">'test'</span><span style="color:#007700;">;<br />
</span><span style="color:#0000bb;">$tmp_object</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">int_attr </span><span style="color:#007700;">= </span><span style="color:#0000bb;">123</span><span style="color:#007700;">; </span><span style="color:#0000bb;">$memcache</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">set</span><span style="color:#007700;">(</span><span style="color:#dd0000;">'key'</span><span style="color:#007700;">, </span><span style="color:#0000bb;">$tmp_object</span><span style="color:#007700;">, </span><span style="color:#0000bb;">false</span><span style="color:#007700;">, </span><span style="color:#0000bb;">10</span><span style="color:#007700;">) or die (</span><span style="color:#dd0000;">"Failed to save data at the server"</span><span style="color:#007700;">);<br />
echo </span><span style="color:#dd0000;">"Store data in the cache (data will expire in 10 seconds)&lt;br/&gt;\n"</span><span style="color:#007700;">; </span><span style="color:#0000bb;">$get_result </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$memcache</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">get</span><span style="color:#007700;">(</span><span style="color:#dd0000;">'key'</span><span style="color:#007700;">);<br />
echo </span><span style="color:#dd0000;">"Data from the cache:&lt;br/&gt;\n"</span><span style="color:#007700;">; </span><span style="color:#0000bb;">var_dump</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$get_result</span><span style="color:#007700;">); </span><span style="color:#0000bb;">?&gt;</span> </span> </code></div>
</div>
<p>นั่นแสดงว่า วิธีการใช้ memcache คือ เราต้อง new memcache ให้กับ query ที่เราต้องการจะ cache หากคุณมี code อยู่แล้ว และต้องการจะ cache มีทางเดียวที่ทำได้ คือ แก้ code ค่ะ ^O^ งานเข้าล่ะสิ</p>
<p>และจริงๆ memcache เอง ก็สามารถดูประสิทธิภาพทางหน้าเว็บได้เหมือน APC เลย ลอง download code จาก ลิงค์นี้ค่ะ http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/</p>
<p><img src="http://livebookmark.net/journal/wp-content/uploads/2008/05/memcache.png" alt="" /></p>
<p>เรื่องการ config แต่ละตัว อาจจะไม่ละเอียดมาก เรียกได้ว่าพอใช้งานได้แล้วกันค่ะ หากใครอยากจะ modify กันมากกว่านี้ ก็ตามไปอ่าน official website กันได้ค่ะ</p>
<p>หากมีข้อสงสัย ติชม เพิ่มเติม ก็ comment เอาไว้ได้ หากเอาไปอ้างอิง อย่าลืม credit ให้ด้วยนะคะ</p>
<p>ลิงค์น่าอ่านเพิ่มเติม</p>
<p>http://www.thaicyberpoint.com/ford/blog/id/170/</p>
<p>http://www.pantz.org/software/php/phptuningtips.html</p>
<p>http://dev.mysql.com/doc/refman/5.1/en/query-cache.html</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:6836px;width:1px;height:1px;">http://www.pantz.org/software/php/phptuningtips.html</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/145/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=145&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2009/06/10/php-mysql-performance/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>

		<media:content url="http://www.mikebernat.com/images/xdebug/var_dump_full.jpg" medium="image" />

		<media:content url="http://tech-blog.box.net/wp-content/uploads/2007/06/xdebug-in-phpinfo.jpg" medium="image" />

		<media:content url="http://www.pseudocoder.com/wp-content/uploads/2007/04/wincachegrind3.jpg" medium="image" />

		<media:content url="http://www.ez.no/var/ezno/storage/images/images/community/articles/alternative_php_cache/883778-1-eng-GB/alternative_php_cache.png" medium="image" />

		<media:content url="http://www.howtoforge.com/images/apc_php5_lighttpd_debian_etch/3.png" medium="image" />

		<media:content url="http://www.rawseo.com/articles/apc_cache/apc_screen.png" medium="image" />

		<media:content url="http://centoshacker.com/wp-content/uploads/2008/11/memcache_phpinfo.jpg" medium="image" />

		<media:content url="http://4.bp.blogspot.com/_YB14YH_zSmM/SQdKmC5yZmI/AAAAAAAAAEc/3Tu_h54kWn0/s320/memcached-verbose.png" medium="image" />

		<media:content url="http://livebookmark.net/journal/wp-content/uploads/2008/05/memcache.png" medium="image" />
	</item>
		<item>
		<title>[PHP] สิ่งหนึ่งที่ทำให้เกิด Call to a member function on a non-object</title>
		<link>http://nattyait.wordpress.com/2008/11/19/php-%e0%b8%aa%e0%b8%b4%e0%b9%88%e0%b8%87%e0%b8%ab%e0%b8%99%e0%b8%b6%e0%b9%88%e0%b8%87%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b9%80%e0%b8%81%e0%b8%b4%e0%b8%94-call/</link>
		<comments>http://nattyait.wordpress.com/2008/11/19/php-%e0%b8%aa%e0%b8%b4%e0%b9%88%e0%b8%87%e0%b8%ab%e0%b8%99%e0%b8%b6%e0%b9%88%e0%b8%87%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b9%80%e0%b8%81%e0%b8%b4%e0%b8%94-call/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 09:45:27 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=126</guid>
		<description><![CDATA[วันนี้ แก้ error โง่ๆ ไปพักหนึ่ง ด้วยความมึน ตอน run PHP แล้วเกิด คือ พยายามจะ new object แต่ว่าไม่สามารถจะ new ได้ และหลังจาก new ก็ไปใช้ method ของมัน ทำให้มันบอกว่า ใช้ function จากตัวที่ไม่เป็น object ไม่ได้ อย่างเช่น


$test = new AR(new Ds());

$test-&#62;getDS();

มันจะเรียก getDS(); ไม่ได้ เพราะ $test ยังเป็น null
มาเล่น PhotoHunt กัน ให้ดูว่า class ของ Ds ทำอะไร


var $dsStrategy;
public function _construct (iDSStrategy $dsStrategy){
$this-&#62;dsStrategy = $dsStrategy;
}
public  function getValForCreditFromCore(){
$this-&#62;dsStrategy-&#62;getValForCreditFromCore();
} [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=126&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>วันนี้ แก้ error โง่ๆ ไปพักหนึ่ง ด้วยความมึน ตอน run PHP แล้วเกิด คือ พยายามจะ new object แต่ว่าไม่สามารถจะ new ได้ และหลังจาก new ก็ไปใช้ method ของมัน ทำให้มันบอกว่า ใช้ function จากตัวที่ไม่เป็น object ไม่ได้ อย่างเช่น</p>
<pre class="brush: php;">

$test = new AR(new Ds());

$test-&gt;getDS();
</pre>
<p>มันจะเรียก getDS(); ไม่ได้ เพราะ $test ยังเป็น null</p>
<p>มาเล่น PhotoHunt กัน ให้ดูว่า class ของ Ds ทำอะไร</p>
<pre class="brush: php;">

var $dsStrategy;
public function _construct (iDSStrategy $dsStrategy){
$this-&gt;dsStrategy = $dsStrategy;
}
public  function getValForCreditFromCore(){
$this-&gt;dsStrategy-&gt;getValForCreditFromCore();
} </pre>
<p>นี่แหละ ทำให้เกิด Call to a member function on a non-object งงเลยใช่ไหมว่าทำไม</p>
<p>เหตุผลสำหรับ code นี้ เพราะที่ใส่ underscore หน้า constructor ไปอันเดียว &#8211; -&#8221;</p>
<p>ที่ถูกต้องเป็น</p>
<pre class="brush: php;">public function __construct (iDSStrategy $dsStrategy)</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=126&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/11/19/php-%e0%b8%aa%e0%b8%b4%e0%b9%88%e0%b8%87%e0%b8%ab%e0%b8%99%e0%b8%b6%e0%b9%88%e0%b8%87%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%97%e0%b8%b3%e0%b9%83%e0%b8%ab%e0%b9%89%e0%b9%80%e0%b8%81%e0%b8%b4%e0%b8%94-call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
		<item>
		<title>[PHP] Simple Test</title>
		<link>http://nattyait.wordpress.com/2008/10/22/php-simple-test/</link>
		<comments>http://nattyait.wordpress.com/2008/10/22/php-simple-test/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 10:41:22 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=118</guid>
		<description><![CDATA[เนื่องจากมีคนเรียกร้องอยากใช้งาน SimpleTest ใน PHP ขึ้นมาอย่างกระทันหัน ไม่ได้ตั้งตัว ก็เลยเอามาวางให้ที่นี่นะคะ
ก่อนอื่น ไป ดาวน์โหลดมาก่อนนะคะ
เมื่อได้มาแล้ว ก็แตกไฟล์ แล้วเอา folder ชื่อ simpletest ก็เอาไปวางใน apache ของตัวเอง สำหรับเก๋ เก๋จะวางไว้นอกสุด ก็คือใน htdocs เลย ใครจะมาเรียกใช้เมื่อไหร่ก็ได้
เก๋จะให้ตัวอย่างสำหรับการทำ SimpleTest ของ blog ตอนหนึ่ง คือ [PHP] Class สำหรับ convert DBF to MySQL
โดยเก๋จะสร้าง folder ชื่อ unittest และมีไฟล์ชื่อ TestDBFMySQL.php อยู่ การทำหน้า test เราต้องใส่ require_once(&#8216;../../simpletest/autorun.php&#8217;); เพื่อ include ไปยัง lib ของ simpletest และก็ include ไฟล์ที่เราจะ test [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=118&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>เนื่องจากมีคนเรียกร้องอยากใช้งาน SimpleTest ใน PHP ขึ้นมาอย่างกระทันหัน ไม่ได้ตั้งตัว ก็เลยเอามาวางให้ที่นี่นะคะ</p>
<p>ก่อนอื่น ไป <a href="http://simpletest.org/en/download.html">ดาวน์โหลด</a>มาก่อนนะคะ</p>
<p>เมื่อได้มาแล้ว ก็แตกไฟล์ แล้วเอา folder ชื่อ simpletest ก็เอาไปวางใน apache ของตัวเอง สำหรับเก๋ เก๋จะวางไว้นอกสุด ก็คือใน htdocs เลย ใครจะมาเรียกใช้เมื่อไหร่ก็ได้</p>
<p>เก๋จะให้ตัวอย่างสำหรับการทำ SimpleTest ของ blog ตอนหนึ่ง คือ <a href="http://nattyait.wordpress.com/2008/09/22/php-class-dbfmysql/">[PHP] Class สำหรับ convert DBF to MySQL</a></p>
<p>โดยเก๋จะสร้าง folder ชื่อ unittest และมีไฟล์ชื่อ TestDBFMySQL.php อยู่ การทำหน้า test เราต้องใส่ require_once(&#8216;../../simpletest/autorun.php&#8217;); เพื่อ include ไปยัง lib ของ simpletest และก็ include ไฟล์ที่เราจะ test ด้วย ปกติจะ new เป็น test case และ test suite ใน class อื่นได้ แต่อันนี้ไม่ได้ new ไว้ไฟล์อื่น แบบว่าเรียกไฟล์นี้โดยตรงเลย</p>
<p>การ test ก็จะ assert ในหลายกรณี อันนี้ก็แล้วแต่เราว่าจะทำยังงัย อ่านได้<a href="http://simpletest.org/en/first_test_tutorial.html">ที่นี่</a></p>
<p><span id="more-118"></span></p>
<p>โดยหน้าตาของไฟล์ตัวอย่าง เป็นดังนี้</p>
<pre class="brush: php;">

&lt;?php
//DBFMySQL/unittest/TestDBFMySQL.php

require_once('../../simpletest/autorun.php');
require_once('../DBFMySQL.php');

class TestDBFMySQL extends UnitTestCase {
        //public $fromDBF='D:\PO_McDonald\INVORHD0.DBF';
        public static $fromDBF='D:\PO_McDonald\INVORHD0.DBF';
        public static $toMySQL='INVORHD0';
        public static $myDB='db_mcdonald';
        public static $myUser='root';
        public static $myPass='root';
        public static $myHost='localhost';

    function setUp() {

    }

    function tearDown() {
        //@unlink('/temp/test.log');
    }

    function testConvertDBFToMySQL(){
        $x = DBFMySQL::convertDBFToMySQL(self::$fromDBF, self::$toMySQL, self::$myDB, self::$myUser, self::$myPass, self::$myHost);
        $this-&gt;assertTrue($x);
    }
    function testReadDBFToArray(){
        $x = DBFMySQL::readDBFToArray(self::$fromDBF);
        $this-&gt;assertNotNull($x);
    }
    function testPersistToMySQL(){
        $arrTable = DBFMySQL::readDBFToArray(self::$fromDBF);
        $x = DBFMySQL::persistToMySQL($arrTable, self::$toMySQL, self::$myDB, self::$myUser, self::$myPass, self::$myHost);
        $this-&gt;assertTrue($x);
    }
}
?&gt;
</pre>
<p>ลองเข้าไปที่ http://localhost/DBFMySQL/unittest/TestDBFMySQL.php นะคะ (เครื่องเก๋นะคะ ยกตัวอย่างให้ดู)</p>
<p>หากว่า Test ผ่าน จะได้ผลดังนี้ค่ะ</p>
<p><a href="http://www.uppicth.com/show.php?filex=f5d56b431af3adad44a45affe177d058.png"><img src="http://www.uppicth.com/pics/f5d56b431af3adad44a45affe177d058.png" alt="Image hosting by UpPicth.com" /></a></p>
<p>ถ้า fail</p>
<p><a href="http://www.uppicth.com/show.php?filex=7ac2edf2e22d503b15e20017b25be03d.png"><img src="http://www.uppicth.com/pics/7ac2edf2e22d503b15e20017b25be03d.png" alt="Image hosting by UpPicth.com" /></a></p>
<p>ถ้า connect db ไม่ผ่าน<br />
<a href="http://www.uppicth.com/show.php?filex=0e21a434df77bf0c2d7d6131fbdbba79.png"><img src="http://www.uppicth.com/pics/0e21a434df77bf0c2d7d6131fbdbba79.png" alt="Image hosting by UpPicth.com" /></a></p>
<p>สงสัยก็ comment ถามมาได้ค่ะ จะตอบให้</p>
<p>ดาวน์โหลดตัวอย่าง code ได้<a href="http://www.uploadd.com/download.aspx?pku=3377AD325DHT3BWA2U32ARX9GTBH4G">ที่น</a>ี่ค่ะ ก่อนอื่นควรไปอ่าน <a href="http://nattyait.wordpress.com/2008/09/22/php-class-dbfmysql/">[PHP] Class สำหรับ convert DBF to MySQL</a> ด้วยนะคะ เผื่อรันไม่ผ่าน</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=118&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/10/22/php-simple-test/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>

		<media:content url="http://www.uppicth.com/pics/f5d56b431af3adad44a45affe177d058.png" medium="image">
			<media:title type="html">Image hosting by UpPicth.com</media:title>
		</media:content>

		<media:content url="http://www.uppicth.com/pics/7ac2edf2e22d503b15e20017b25be03d.png" medium="image">
			<media:title type="html">Image hosting by UpPicth.com</media:title>
		</media:content>

		<media:content url="http://www.uppicth.com/pics/0e21a434df77bf0c2d7d6131fbdbba79.png" medium="image">
			<media:title type="html">Image hosting by UpPicth.com</media:title>
		</media:content>
	</item>
		<item>
		<title>[Resin] PHP in Java: Natty &amp; Juacompe discussion</title>
		<link>http://nattyait.wordpress.com/2008/09/24/resin-php-in-java-natty-juacompe-discussion/</link>
		<comments>http://nattyait.wordpress.com/2008/09/24/resin-php-in-java-natty-juacompe-discussion/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 13:25:07 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=97</guid>
		<description><![CDATA[เนื่องมาจาก natty ที่พอจะมีความรู้เรื่อง resin เท่าหางอึ่ง + PHP อยู่บ้าง บวกกับ juacompe ที่อัดแน่นไปด้วยความรู้เกี่ยวกับ server ที่ใช้ run java ทำให้วันนี้ก็เกิดความเข้าใจมากขึ้นกับ PHP in Java ใน resin
หากเราต้องการทำให้ java ของเราถูกเรียกโดย PHP ได้ ต้องทำให้ class นั้น extends AbstractQuercusModule และมี method ที่รับ parameter env ซึ่งเป็น quercus environment resources หรือไม่ก็ต้องสร้าง class ไว้แล้วให้มาสร้าง instant อยู่ใน class นี้

code ด้านล่างเป็นเป็น code ที่สร้าง method ขึ้นมาเพื่อให้ถูกเรียกจาก PHP ได้ ชื่อ method [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=97&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>เนื่องมาจาก natty ที่พอจะมีความรู้เรื่อง resin เท่าหางอึ่ง + PHP อยู่บ้าง บวกกับ juacompe ที่อัดแน่นไปด้วยความรู้เกี่ยวกับ server ที่ใช้ run java ทำให้วันนี้ก็เกิดความเข้าใจมากขึ้นกับ PHP in Java ใน resin</p>
<p>หากเราต้องการทำให้ java ของเราถูกเรียกโดย PHP ได้ ต้องทำให้ class นั้น extends AbstractQuercusModule และมี method ที่รับ parameter env ซึ่งเป็น quercus environment resources หรือไม่ก็ต้องสร้าง class ไว้แล้วให้มาสร้าง instant อยู่ใน class นี้</p>
<p><span id="more-97"></span></p>
<p>code ด้านล่างเป็นเป็น code ที่สร้าง method ขึ้นมาเพื่อให้ถูกเรียกจาก PHP ได้ ชื่อ method ว่า hello_test โดยจะเห็นว่ามันจะรับตัวแปร env ด้วย โดย class นี้อยู่ใน package example</p>
<pre class="brush: java;"> package example;

import com.caucho.quercus.env.Env;
import com.caucho.quercus.module.AbstractQuercusModule;

public class HelloModule extends AbstractQuercusModule {
/*
** Notice the careful use of the naming
** convention hello_test.  This is done
** in order to prevent name collisions
** among different libraries.
**
** @param env provides access to Quercus environment resources
** @param name
*/
public String hello_test(Env env, String name)
{
env.println(&quot;inside HelloModule  hello_test()&quot;);
return &quot;Hello, &quot; + name;
}
} </pre>
<p>สิ่งที่สำคัญคือ ต้องสร้างไฟล์ชื่อ com.caucho.quercus.QuercusModule ไว้ที่ classes/META-INF/services โดยใส่ชื่อ package.class เอาไว้</p>
<pre class="brush: java;"> example.HelloModule </pre>
<p>ตอนหน้าค่อยต่ออีก&#8230;.นี่เป็นเพียง study ยังไม่ได้ทดสอบเลยว่าทำต่างจากนี้แล้วจะพังป่าว</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/97/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/97/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/97/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=97&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/09/24/resin-php-in-java-natty-juacompe-discussion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
		<item>
		<title>[PHP] Class สำหรับ convert DBF to MySQL</title>
		<link>http://nattyait.wordpress.com/2008/09/22/php-class-dbfmysql/</link>
		<comments>http://nattyait.wordpress.com/2008/09/22/php-class-dbfmysql/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 12:05:27 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[Foxpro]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=85</guid>
		<description><![CDATA[เนื่องจากมีโปรเจคหนึ่งที่ต้องทำส่วนหนึ่ง คือส่วนของการ convert DBF to MySQL เลยเอามาฝากกัน ที่ทำเพราะว่า ระบบนี้จะเป็นต้องอ่าน DBF file ใหม่ๆ ทุกวันเพื่อนำมาใช้ในระบบ แต่ developer อยากใช้กับ MySQL database ดังนั้นเก๋จึงทำ class ที่อ่าน dbf file มาลง mysql ให้เค้า โดยทำเป็นตารางที่หน้าตาเหมือนกันใน MySQL ให้
ระบบนี้มี table ชื่อเดิม แต่ต้องอัพเดทข้อมูลตาม dbf file ทุกวัน ดังนั้นเก๋จึงไม่ได้ทำ function ที่ให้สร้าง MySQL table หน้าตาเหมือนๆ กัน ทำแค่ให้ insert ข้อมูลลงไปใน MySQL ได้ นั่นหมายความว่า หากต้องการนำ class นี้ไปใช้ ต้องสร้าง table ที่หน้าตาเหมือนกับ dbf [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=85&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>เนื่องจากมีโปรเจคหนึ่งที่ต้องทำส่วนหนึ่ง คือส่วนของการ convert DBF to MySQL เลยเอามาฝากกัน ที่ทำเพราะว่า ระบบนี้จะเป็นต้องอ่าน DBF file ใหม่ๆ ทุกวันเพื่อนำมาใช้ในระบบ แต่ developer อยากใช้กับ MySQL database ดังนั้นเก๋จึงทำ class ที่อ่าน dbf file มาลง mysql ให้เค้า โดยทำเป็นตารางที่หน้าตาเหมือนกันใน MySQL ให้</p>
<p>ระบบนี้มี table ชื่อเดิม แต่ต้องอัพเดทข้อมูลตาม dbf file ทุกวัน ดังนั้นเก๋จึงไม่ได้ทำ function ที่ให้สร้าง MySQL table หน้าตาเหมือนๆ กัน ทำแค่ให้ insert ข้อมูลลงไปใน MySQL ได้ นั่นหมายความว่า หากต้องการนำ class นี้ไปใช้ ต้องสร้าง table ที่หน้าตาเหมือนกับ dbf file ไว้ก่อน แล้วค่อยเอา class นี้ไปช่วยในการ insert ข้อมูลให้</p>
<p><span id="more-85"></span></p>
<p>ใจจริง อยากทำ function ที่ให้ create table เหมือนกัน แต่ติดที่ว่า วิธีการอ่าน dbf file คือเก๋ใช้ dbase function ซึ่งเป็นการ read wirte dbf file แต่ไม่ใช่การ query ด้วยคำสั่ง SQL ดังนั้นจึงคิดวิธีการ get property ของ field ไม่ออก ว่าต้องทำยังงัย ก็เลยคิดว่า หากวันนึงอยากใช้ create table function ขึ้นมาจริงๆ คงต้องใช้ ODBC เข้าช่วย เพราะคำสั่ง SQL สามารถ get property ได้</p>
<p>มีไฟล์ที่เกี่ยวข้อง 3 ไฟล์ คือ DBFMySQL.php, iDBFMySQL.php และ test.php</p>
<p>เก๋กำหนดให้มี interface เอาไว้ จะเห็นว่า createTable โดน comment ไว้ แสดงว่ามันจะ coming soon ฮ่าๆ</p>
<pre class="brush: php;">

&lt;?php

/*created by Nattanicha Rittammanart
* Created date: Sep 22, 2008 */

interface iDBFMySQL{
/*
fromDBF: dbf with the right path
toMySQL: define table name in MySQL
myDB: MySQL database to put MySQL table
myUser: MySQL username
myPass: MySQL password
myHost: MySQL Host

*/

/**/
public static function convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost);
public static function readDBFToArray($fromDBF);
public static function persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
//public static function createMySQLTable($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
}
</pre>
<p>function convertDBFToMySQL เป็นฟังก์ชั่นที่ให้ผู้ใช้เรียกใช้เพื่อ convert dbf to mysql โดยตรง โดยฟังก์ชั่นอื่น เป็นฟังก์ชั่นที่ใช้งานร่วมกับมันเท่านั้น ก็คือใส่ parameters ให้ครบ มันก็จะให้สิ่งที่ต้องการออกมา ฟังก์ชั่นนี้ เรียก readDBFToArray และ persistToMySQL มาใช้งาน</p>
<pre class="brush: php;">

public static function convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost){
$arrTable = array();
$arrTable = DBFMySQL::readDBFToArray($fromDBF);
DBFMySQL::persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost);
}
</pre>
<p>function readDBFToArray รับ path ของ dbf file เพื่อเอามาใส่ลง array โดยจะ return เป็น array 2 ชุดใหญ่ คือ ชุด column name กับชุดของ data โดยชุดของ data ก็จะเก็บเป็น array ย่อยลงไปอีก โดย array นี้จะ prepare เอาไว้ให้ function persistToMySQL เป็นคนเรียก</p>
<pre class="brush: php;">

public static function readDBFToArray($fromDBF){
		// open in read-only mode
		$db = dbase_open($fromDBF, 0);
		$records = array();

		if ($db) {
		// read some data ..
			$record_numbers = dbase_numrecords($db);
			$field_numbers = dbase_numfields($db);
			for ($i = 1; $i &lt;= $record_numbers; $i++) {
				$row = dbase_get_record_with_names($db, $i);
				array_push($records,array_values($row));
			}
			$columnHeader = array_keys($row);
			$arrTable = array($columnHeader,$records);
			dbase_close($db);
		}
		return $arrTable;
	}
</pre>
<p>function persistToMySQL รับ array มาจาก readDBFToArray เพื่อนำมาลง MySQL table ใน field ที่ถูกต้อง</p>
<pre class="brush: php;">
public static function persistToMySQL($arrTable, $toMySQL, $myDB, $myUser, $myPass, $myHost){

		$connect = mysql_connect($myHost, $myUser, $myPass) or die(&quot;cannot connect to database&quot;);
		mysql_select_db($myDB, $connect);

		$columnHeader = $arrTable[0];
		$records = $arrTable[1];

		for($i=0;$i&lt;sizeof($columnHeader)-1;$i++){
				$temp = $columnHeader[$i].&quot;,&quot;;
				$prepareFields=$prepareFields.$temp;
		}

		$prepareFields = substr($prepareFields, 0, -1);

		for($j=0;$j&lt;sizeof($records);$j++){
			$prepareRecords='';
			for($i=0;$i&lt;sizeof($records[$j])-1;$i++){
				$temp = &quot;'&quot;.trim($records[$j][$i]).&quot;'&quot;.&quot;,&quot;;
				$prepareRecords=$prepareRecords.$temp;
			}
			$prepareRecords = substr($prepareRecords, 0, -1);
			$sql = &quot;INSERT INTO $toMySQL ($prepareFields) VALUES ($prepareRecords)&quot;;
			$test = mysql_query($sql);
		}
	}
</pre>
<p>วิธีการใช้งานก็ง่ายมากๆ เลย ทำแบบนี้</p>
<pre class="brush: php;">
&lt;?php

/*created by Nattanicha Rittammanart
* Created date: Sep 22, 2008 */

include 'DBFMySQL.php';

$fromDBF='D:\PO_McDonald\INVORDD0.DBF';
$toMySQL='INVORDD0';
$myDB='db_mcdonald';
$myUser='root';
$myPass='root';
$myHost='localhost';

DBFMySQL::convertDBFToMySQL($fromDBF, $toMySQL, $myDB, $myUser, $myPass, $myHost);

?&gt; </pre>
<p>ในอนาคตอาจจะมีการเพิ่มเติมฟังก์ชั่นเข้าไปอีกค่ะ หากเป็นประโยชน์ก็ช่วยบอกด้วยนะคะ</p>
<p>ดาวน์โหลด sourcecode <a href="http://sprite.haadthip.com/it/natty/code/DBFMySQL.zip">ได้ที่นี่</a> ค่ะ</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=85&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/09/22/php-class-dbfmysql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
		<item>
		<title>[PHP] Enable DBase function</title>
		<link>http://nattyait.wordpress.com/2008/09/22/php-enable-dbase-function/</link>
		<comments>http://nattyait.wordpress.com/2008/09/22/php-enable-dbase-function/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 04:54:40 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=81</guid>
		<description><![CDATA[พอดีกำลังจะทำ class สำหรับ DBF MySQL ประมาณว่า convert กันไปกันมา เลยจะอ่าน DBase file แต่พอดีตะกี้ใช้แล้ว มัน error แบบนี้
Fatal error: Call to undefined function dbase_open() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\DBFMySQL\DBFMySQL.php on line 27
พอไป search หาวิธีแก้ ตามลิงค์นี้ เค้าก็บอกว่า ต้องไปแก้ใน php.ini ให้มัน enable dbase dll ก่อน
extension=php_dbase.dll
เท่านี้แหละที่อยากบอก  
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=81&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>พอดีกำลังจะทำ class สำหรับ DBF MySQL ประมาณว่า convert กันไปกันมา เลยจะอ่าน DBase file แต่พอดีตะกี้ใช้แล้ว มัน error แบบนี้</p>
<p><span style="color:#800000;">Fatal error: Call to undefined function dbase_open() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\DBFMySQL\DBFMySQL.php on line 27</span></p>
<p>พอไป search หาวิธีแก้ ตาม<a href="http://www.apachefriends.org/f/viewtopic.php?t=5059&amp;highlight=&amp;sid=7f1d771626c1e2d2e4ea52938b5969d3">ลิงค์นี้ </a>เค้าก็บอกว่า ต้องไปแก้ใน php.ini ให้มัน enable dbase dll ก่อน</p>
<p><span style="color:#800000;">extension=php_dbase.dll</span></p>
<p>เท่านี้แหละที่อยากบอก <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=81&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/09/22/php-enable-dbase-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
		<item>
		<title>PHP+Foxpro: การ query date</title>
		<link>http://nattyait.wordpress.com/2008/09/17/phpfoxpro-%e0%b8%81%e0%b8%b2%e0%b8%a3-query-date/</link>
		<comments>http://nattyait.wordpress.com/2008/09/17/phpfoxpro-%e0%b8%81%e0%b8%b2%e0%b8%a3-query-date/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 06:08:48 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[Foxpro]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=42</guid>
		<description><![CDATA[จากตอนที่แล้ว เรื่องของ Apache + PHP + GD lib + Foxpro + JPGraph ก็มาดูกันต่อในเรื่องการ query date ของ foxpro
จะยกตัวอย่างฟิลด์ date ที่เก็บเป็น yyyy/mm/dd
สมมติว่าเรา query date ขึ้นมา


$sql = &#34;SELECT data_date FROM tablename;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit(&#34;Error in SQL&#34;);}
while (odbc_fetch_row($rs))
{
$data_date = odbc_result($rs,&#34;data_date&#34;);
}


หากเราต้องการนำข้อมูล date ดังกล่าวไป query ต่อ สิ่งที่ต้องทำคือ ต้องเปลี่ยน format ของ date นั้นเป็น mm/dd/yyyy เนื่องจากเรากำลังจะใช้คำสั่งในการ query date ของ foxpro คือคำสั่ง ctod (character to date) ซึ่งโดยปกติหากเราต้องการใช้ [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=42&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>จากตอนที่แล้ว เรื่องของ<a rel="bookmark" href="../2008/09/12/apache-php-gd-lib-foxpro-jpgraph/"> Apache + PHP + GD lib + Foxpro + JPGraph </a>ก็มาดูกันต่อในเรื่องการ query date ของ foxpro</p>
<p>จะยกตัวอย่างฟิลด์ date ที่เก็บเป็น yyyy/mm/dd</p>
<p>สมมติว่าเรา query date ขึ้นมา</p>
<pre class="brush: php;">

$sql = &quot;SELECT data_date FROM tablename;
$rs=odbc_exec($conn,$sql);
if (!$rs)
{exit(&quot;Error in SQL&quot;);}
while (odbc_fetch_row($rs))
{
$data_date = odbc_result($rs,&quot;data_date&quot;);
}
</pre>
<p><span id="more-42"></span><br />
หากเราต้องการนำข้อมูล date ดังกล่าวไป query ต่อ สิ่งที่ต้องทำคือ ต้องเปลี่ยน format ของ date นั้นเป็น mm/dd/yyyy เนื่องจากเรากำลังจะใช้คำสั่งในการ query date ของ foxpro คือคำสั่ง <a href="http://msdn.microsoft.com/en-us/library/23944tfs(VS.80).aspx">ctod </a>(character to date) ซึ่งโดยปกติหากเราต้องการใช้ format ของวันที่ยังคงเป็น yyyy/mm/dd เราจะมีการใช้คำสั่ง set century on ก่อน แต่เนื่องจากเราไม่ได้ใช้คำสั่งนี้ใน PHP เราเลยต้อง parse date ดังกล่าวออกมาเป็น character เพื่อประกอบกับไปให้ได้ตาม mm/dd/yyyy และใช้คำสั่ง ctod ได้</p>
<p>&nbsp;</p>
<p>(*หมายเหตุ ใน foxpro มีคำสั่งที่คล้าย <a href="http://msdn.microsoft.com/en-us/library/23944tfs(VS.80).aspx">ctod </a>คือ <a href="http://msdn.microsoft.com/en-us/library/h7dayzd0(VS.80).aspx">dtoc </a>(date to character))</p>
<p>สิ่งที่เราจะได้จาก $data_date คือข้อมูล date โดยที่เราสามารถ parse ออกมาได้ดังนี้</p>
<pre class="brush: php;">

$dateparse = date_parse($data_date);
$month = $dateparse [&quot;month&quot;];
$day = $dateparse [&quot;day&quot;];
$year = $dateparse [&quot;year&quot;];
</pre>
<p>หากเราต้องการนำข้อมูล date ดังกล่าวไป query ต่อแบบไม่ใช้ set century on ทำได้ดังนี้</p>
<p>&nbsp;</p>
<pre class="brush: php;">

$sql = &quot;SELECT * FROM tablename WHERE data_date &gt;= ctod('&quot; .$month. &quot;/&quot; .$day. &quot;/&quot; .$year. &quot;')&quot;;
</pre>
<p>เพียงเท่านี้เราก็จะหมดปัญหาการ query date ของ foxpro</p>
<p>&nbsp;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nattyait.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nattyait.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=42&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/09/17/phpfoxpro-%e0%b8%81%e0%b8%b2%e0%b8%a3-query-date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
		<item>
		<title>Apache + PHP + GD lib + Foxpro + JPGraph</title>
		<link>http://nattyait.wordpress.com/2008/09/12/apache-php-gd-lib-foxpro-jpgraph/</link>
		<comments>http://nattyait.wordpress.com/2008/09/12/apache-php-gd-lib-foxpro-jpgraph/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 10:37:44 +0000</pubDate>
		<dc:creator>natty</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://nattyait.wordpress.com/?p=5</guid>
		<description><![CDATA[เริ่ม blog แรกด้วยเรื่องง่ายๆ ที่เกือบจะลืมไปแล้ว แอบทำช้านิดนึงด้วยเพราะว่าลืม และไม่เคยจะจดไว้เลย จดไว้นี่ก่อนแล้วกัน
วันนี้ลง Apache + PHP + GD Lib + Foxpro บน Windows เพราะว่าจะทำกราฟที่ดึงจาก Foxpro โดยใช้ PHP ซึ่งต้องทำงานผ่าน ODBC เลยต้องลงบน Windows
การติดตั้ง Apache + PHP
1. download and install Apache
2. download PHP และแตกไฟล์ลงใน path ที่ต้องการ ตัวนี้เป็น package เพราะเราต้องการตัว php_gd2.dll ด้วย
3. set system path to PHP (ถ้าไม่ set มันจะขึ้นหน้า page เวลาเข้า PHP ว่า You don&#8217;t [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=5&subd=nattyait&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>เริ่ม blog แรกด้วยเรื่องง่ายๆ ที่เกือบจะลืมไปแล้ว แอบทำช้านิดนึงด้วยเพราะว่าลืม และไม่เคยจะจดไว้เลย จดไว้นี่ก่อนแล้วกัน</p>
<p>วันนี้ลง Apache + PHP + GD Lib + Foxpro บน Windows เพราะว่าจะทำกราฟที่ดึงจาก Foxpro โดยใช้ PHP ซึ่งต้องทำงานผ่าน ODBC เลยต้องลงบน Windows</p>
<p><strong>การติดตั้ง Apache + PHP</strong><br />
1. download and install <a title="Apache for Windows" href="http://mirrors.issp.co.th/apache/httpd/binaries/win32/apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi" target="_blank">Apache<br />
</a>2. download <a href="http://www.php.net/get/php-5.2.6-Win32.zip/from/a/mirror">PHP </a>และแตกไฟล์ลงใน path ที่ต้องการ ตัวนี้เป็น package เพราะเราต้องการตัว php_gd2.dll ด้วย<br />
3. set system path to PHP (ถ้าไม่ set มันจะขึ้นหน้า page เวลาเข้า PHP ว่า You don&#8217;t have permission to access /php/php-cgi.exe)<br />
3. เปิดไฟล์ httpd.conf เพื่อตั้งค่าให้ Apache สามารถ compile PHP ได้ โดยเพิ่มบรรทัดต่อไปนี้ลงไป</p>
<p># ตำแหน่งที่เก็บ PHP Interpreter</p>
<pre class="brush: php;">
ScriptAlias /php/ &quot;c:/Program Files/PHP/&quot;
AddType application/x-httpd-php .php </pre>
<p>#สำหรับ PHP version 5 ใช้ บรรทัดล่างนี้</p>
<pre class="brush: php;">
Action application/x-httpd-php &quot;/php/php-cgi.exe&quot; </pre>
<p>4. ลองสร้างไฟล์ php ขึ้นมา แล้วปรินท์ phpinfo(); restart apache แล้วลองเข้า http://localhost/ชื่อไฟล์.php ถ้ามันแสดง phpinfo ให้ก็แสดงว่าเรา config สำเร็จแล้ว</p>
<p>5. เนื่องจากเราต้องใช้งาน php_gd2.dll ด้วย หากเราดูใน PHP/ext เราจะเห็น php_gd2.dll ซึ่งเราจะสามารถใช้งานได้โดยต้องเข้าไปที่ php.ini (ซึ่งอยู่ใน PHP package แต่เป็นชื่อ php-dist.ini เราต้องเปลี่ยนชื่อให้เป็น php.ini) แล้วเอา ; ออกที่บรรทัดชื่อว่า ;extension=php_gd2.dll</p>
<p>และอย่าลืมแก้ในไฟล์ php.ini ตรง extension_dir ให้ชี้ไปที่ ext เช่น extension_dir = &#8220;C:\Program Files\PHP\ext&#8221;</p>
<p>แล้วทำการ restart apache ใหม่</p>
<p>ใช้ code ต่อไปนี้เพื่อ test gd สิ่งทีจะได้คือ ข้อความสีชมพูเขียนว่า A simple Text String</p>
<pre class="brush: php;">

$im = @ ImageCreate ( 150, 100)
or die ( “Cannot create a new GD image.”);
$background_color = ImageColorAllocate ($im, 255, 255, 255);
$text_color = ImageColorAllocate ($im, 233, 14, 91);
ImageString ($im, 1, 5, 5, “A Simple Text String”, $text_color );
header (“Content-type: image/png”);
ImagePng ($im); </pre>
<p>และ code ต่อไปนี้เพื่อ test gd2 สิ่งที่จะได้คือ กรอบสีเหลี่ยมสีดำกับขาว</p>
<pre class="brush: php;">
$im =  imagecreatetruecolor ( 300, 200);
$black = imagecolorallocate ($im, 0, 0, 0 );
$white = imagecolorallocate ($im, 255, 255, 255 );

imagefilledrectangle ($im,0, 0,399,99 ,$white);
imagerectangle ($im,20, 20,250,190 ,$black);

header (“Content-type: image/png” );
imagepng ($im);
</pre>
<p>หากรันไม่ได้ มี error เหมือนกับว่ายังไม่มี jpgraph ให้เข้าไปดูที่ คำสั่ง extension_dir ใน php.ini ว่าชี้ไปยัง path ที่เป็น PHP/ext แล้วหรือยัง</p>
<p><strong>การติดตั้ง jpgraph</strong></p>
<p>jpgraph เป็น graph library ที่ใช้ได้กับ PHP โดยสามารถดาวน์โหลดได้จาก <a href="http://www.aditus.nu/jpgraph/jpdownload.php" target="_blank">ที่นี่ </a>โดยหากใช้กับ PHP5 ควรดาวน์โหลด version 2.xx แตกไฟล์ลง htdoc</p>
<p><strong>การใช้งาน PHP ร่วมกับ Foxpro</strong></p>
<p>1. set system ODBC (ย้ำ system นะ) โดยเลือก driver เป็น Microsoft Visual Foxpro Driver แล้วใส่ชื่อ datasource name (dsn) ที่ต้องการ เลือก database type เป็น free table และ browse ไปยัง path ที่ DBF ของเราวางอยู่</p>
<p>2. ลอง test ว่า php ของเราสามารถติดต่อกับ dbf ได้หรือยัง โดยใช้ code ต่อไปนี้ ซึ่งจะทำให้แสดงข้อมูลพร้อมหัวคอลัมน์ออกมา</p>
<pre class="brush: php;">
&lt;?php
$id = odbc_connect( “yourdsnname”,”&quot;,”&quot;);
if ( $id != 0 )   {
echo “DSN qc2004 connected
”;
echo “ID = “, $id, “
”;
$sql = “SELECT * from yourtable”;
$rs = odbc_exec( $id, $sql );
$odbc_result_all($rs);
} else  {
echo “Error connecting to qc2004 webdata”;
}
odbc_close_all();
?&gt;
</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/nattyait.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/nattyait.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nattyait.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nattyait.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nattyait.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nattyait.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nattyait.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nattyait.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nattyait.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nattyait.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nattyait.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nattyait.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nattyait.wordpress.com&blog=4817581&post=5&subd=nattyait&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://nattyait.wordpress.com/2008/09/12/apache-php-gd-lib-foxpro-jpgraph/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">natty</media:title>
		</media:content>
	</item>
	</channel>
</rss>