<?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>damonparker.org &#187; Development</title>
	<atom:link href="http://damonparker.org/blog/category/technical/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://damonparker.org</link>
	<description>code / ecommerce / life</description>
	<lastBuildDate>Mon, 14 Jun 2010 14:33:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0-RC3</generator>
		<item>
		<title>MailAnnounce Applescript Source</title>
		<link>http://damonparker.org/blog/2007/10/09/mailannounce-applescript-source/</link>
		<comments>http://damonparker.org/blog/2007/10/09/mailannounce-applescript-source/#comments</comments>
		<pubDate>Tue, 09 Oct 2007 13:49:41 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Apple / Mac]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/10/09/mailannounce-applescript-source/</guid>
		<description><![CDATA[I have received several requests for the source of my MailAnnounce script that is able to speak the subject of mails using Mail.app and Applescript. Source for version 1 of the script is now available.]]></description>
			<content:encoded><![CDATA[<p></p><p>I have received several requests for the source of my <a href="http://damonparker.org/blog/2006/04/12/mailannounce-applescript-app/">MailAnnounce</a> script that is able to speak the subject of mails using Mail.app and Applescript.</p>
<p>Source for version 1 of the script is now <a href="http://damonparker.org/source/MailAnnounce.scpt.txt">available</a>.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=382" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=382&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/10/09/mailannounce-applescript-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP gethostbyname() and DNS</title>
		<link>http://damonparker.org/blog/2007/08/23/php-gethostbyname-and-dns/</link>
		<comments>http://damonparker.org/blog/2007/08/23/php-gethostbyname-and-dns/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 19:47:03 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/08/23/php-gethostbyname-and-dns/</guid>
		<description><![CDATA[For PHP&#8217;s gethostbyname() to work properly, the server&#8217;s DNS must be properly configured with available nameservers in /etc/resolv.conf (on Linux boxes). Without a work domain name resolution kit, gethostbyname() returns the hostname supplied to the function. Make sure /etc/resolv.conf contains several nameservers to query. The format is nameserver xxx.xxx.xxx.xxx nameserver yyy.yyy.yyy.yyy Where xxx.xxx.xxx.xxx and yyy.yyy.yyy.yyy [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>For PHP&#8217;s <a href="http://www.php.net/gethostbyname" rel="external">gethostbyname()</a> to work properly, the server&#8217;s DNS must be properly configured with available nameservers in /etc/resolv.conf (on Linux boxes).  Without a work domain name resolution kit, gethostbyname() returns the hostname supplied to the function.</p>
<p>Make sure /etc/resolv.conf contains several nameservers to query.  The format is</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nameserver xxx.xxx.xxx.xxx<br />
nameserver yyy.yyy.yyy.yyy</div></div>
<p>Where xxx.xxx.xxx.xxx and yyy.yyy.yyy.yyy are the IP addresses of nameservers the host has permission to use.</p>
<p><a href="http://www.opendns.com/" rel="external">OpenDNS</a> is a free DNS service that allows public access to their nameservers at:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">208.67.222.222<br />
208.67.220.220</div></div>
<p>To use in /etc/resolv.conf use:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nameserver 208.67.222.222<br />
nameserver 208.67.222.220</div></div>
<p>Using OpenDNS&#8217;s nameservers could even boost your server&#8217;s performance.  Their goal is to provide some of the faster domain name resolvers on the internet for free.  </p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=376" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=376&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/08/23/php-gethostbyname-and-dns/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Easily View PHP Errors on Yahoo Business Hosting</title>
		<link>http://damonparker.org/blog/2007/08/06/easily-view-php-errors-on-yahoo-business-hosting/</link>
		<comments>http://damonparker.org/blog/2007/08/06/easily-view-php-errors-on-yahoo-business-hosting/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 19:39:00 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/08/06/easily-view-php-errors-on-yahoo-business-hosting/</guid>
		<description><![CDATA[I don&#8217;t often use Yahoo Business Hosting, but every once and a while I have a client who is already hosting their sites there. With all large monolithic hosting companies there are caveats to using their systems&#8230; PHP especially. Yahoo Hosting does not support .htaccess files and does not allow display of PHP error messages [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I don&#8217;t often use Yahoo Business Hosting, but every once and a while I have a client who is already hosting their sites there.  With all large monolithic hosting companies there are caveats to using their systems&#8230; PHP especially.  </p>
<p>Yahoo Hosting does not support .htaccess files and does not allow display of PHP error messages directly in the pages.  These are all well and good for the obvious security reasons.  Yahoo does allow the <a href="http://help.yahoo.com/help/us/webhosting/php/php-05.html">logging of PHP errors</a> if you follow their directions to enable it.  </p>
<p>Once you enable the scripts log, lock down the directory so you must have a password to access.  It doesn&#8217;t quite make sense to put the logs in a live web directory.  It is trivial for any script kiddie to call up the script log errors in their browser by manually keying in the URL.  Yahoo Hosting should make a bigger point of emphasizing securing this directory when it shows how to enable the scripts log.</p>
<p>Unfortunately, without console access there is no easy way to follow the log as one would normally do with <a href="http://en.wikipedia.org/wiki/Tail_%28Unix%29"><em>tail</em></a>.  Directly loading the log in a browser can return a very long page with the most important information (ie. the last error encountered) at the very bottom of the page.  I created a simple script called <a href="http://damonparker.org/files/phperrors.php">phperrors.php</a> to make following the log easier.  The script provides easy access to the errors log by refreshing automatically every 30 seconds and displaying only the last lines of the log with the newest ones on top.  The refresh time is configurable and can be disabled. The number of lines listed may be set in the refresh form.  Plus, the script is completely self-contained in a single file.</p>
<h4>Installation / Usage</h4>
<ol>
<li>Enable scripts.log as directed above from Yahoo&#8217;s support.</li>
<li>Upload this file to the root of your hosting account.</li>
<li>For security, rename this file to a long (at least 6 characters) random name<br />
that only you know.  Something like:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">zx89adsf8-phperrors.php</div></div>
<p>Don&#8217;t use my example name.  That kind of defeats the purpose. I have included code to generate a random filename to use for renaming the file.</li>
<li>Load the page in your browser.</li>
<li>Bookmark the URL so you can find it again.</li>
<li>Refresh browser as needed or select automatic refresh and hit Go.</li>
<li>To stop automatic refresh uncheck refresh box and hit Go.</li>
<li>To adjust the refresh rate adjust the $refresh_seconds variable below.</li>
<li>If you find this script useful, buy me a beer by dropping a couple of bucks in my tip jar.</li>
</ol>
<p>I realize renaming the file may be a moot point being that Yahoo allows direct access to the scripts log for anyone, but perpetuating poor security is never acceptable in my book.  Perhaps some day soon, Yahoo will better emphasize how to protect this directory from everyone but the account owner. </p>
<p><strong>Download: <a href="http://damonparker.org/files/phperrors.php">phperrors.php</a></strong></p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=373" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=373&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/08/06/easily-view-php-errors-on-yahoo-business-hosting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Stopwatch Class to Time and Log Script Execution</title>
		<link>http://damonparker.org/blog/2007/07/18/php-stopwatch-class-to-time-and-log-script-execution/</link>
		<comments>http://damonparker.org/blog/2007/07/18/php-stopwatch-class-to-time-and-log-script-execution/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 20:19:31 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/07/18/php-stopwatch-class-to-time-and-log-script-execution/</guid>
		<description><![CDATA[Timing code execution is an often overlooked debugging tool. On a current large project we are doing a lot of work interfacing with multiple SOAP implementations on multiple servers and through multiple vendors. When script execution slows down considerably (or stops responding altogether) we needed to know which SOAP calls were causing the slowdown. Using [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Timing code execution is an often overlooked debugging tool.  On a current large project we are doing a lot of work interfacing with multiple SOAP implementations on multiple servers and through multiple vendors.  When script execution slows down considerably (or stops responding altogether) we needed to know which SOAP calls were causing the slowdown.  </p>
<p>Using code and ideas from <a href="http://www.php.net/microtime" rel="external">php.net/microtime</a> I devised this PHP class to handle the timing tasks.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> StopWatch<br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; private <span style="color: #0000ff;">$round</span> &nbsp; &nbsp; &nbsp;= <span style="color: #cc66cc;">3</span>;<br />
&nbsp; &nbsp; public&nbsp; <span style="color: #0000ff;">$logfile</span>&nbsp; &nbsp; = <span style="color: #ff0000;">'time.log'</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$logfile</span> = <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">start</span> = <a href="http://www.php.net/microtime"><span style="color: #000066;">microtime</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$logfile</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>&nbsp; <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">logfile</span> = <span style="color: #0000ff;">$logfile</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">fp</span> = <a href="http://www.php.net/fopen"><span style="color: #000066;">fopen</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">logfile</span>, <span style="color: #ff0000;">'a+'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __destruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/fclose"><span style="color: #000066;">fclose</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">fp</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> now<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$start</span>&nbsp; = <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">math</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">start</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$now</span> &nbsp; &nbsp;= <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">math</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/round"><span style="color: #000066;">round</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$now</span> - <span style="color: #0000ff;">$start</span>, <span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">round</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> math<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$time</span> = <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span><span style="color: #0000ff;">$time</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #0000ff;">$time</span> = <a href="http://www.php.net/microtime"><span style="color: #000066;">microtime</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$temp</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">' '</span>, <span style="color: #0000ff;">$time</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$temp</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> + <span style="color: #0000ff;">$temp</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> write_log<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$loc</span>, <span style="color: #0000ff;">$data</span><span style="color: #66cc66;">&#41;</span> <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/fwrite"><span style="color: #000066;">fwrite</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">fp</span>, <a href="http://www.php.net/date"><span style="color: #000066;">date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Y-m-d H:i:s&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">' '</span>.<span style="color: #0000ff;">$loc</span>.<span style="color: #ff0000;">': '</span>.<span style="color: #0000ff;">$data</span>.<span style="color: #ff0000;">&quot;s <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p><a href="http://damonparker.org/files/class.StopWatch.php"><strong>Download class.StopWatch.php</strong></a></p>
<h4>Usage</h4>
<p>Include the class in your application and create a new instance at the very top of the code.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff;">$sw</span> = <span style="color: #000000; font-weight: bold;">new</span> stopwatch<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #0000ff;">$time1</span> = <span style="color: #0000ff;">$sw</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">now</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>&#8230; snip more code &#8230;</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff;">$time2</span> = <span style="color: #0000ff;">$sw</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">now</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <br />
<span style="color: #0000ff;">$sw</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">write_log</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'CODE-LOCATION'</span>, <span style="color: #0000ff;">$time2</span>-<span style="color: #0000ff;">$time1</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Substitute <em>CODE-LOCATION</em> with the function name or other identifier being timed.</p>
<p>In this case, the stopwatch class logged this data&#8230;</p>
<div class="code" style="overflow: auto;">
2007-07-18 05:00:07 GetVendor: 1.311s<br />
2007-07-18 05:01:10 GetLocationByZip: 62.439s<br />
2007-07-18 12:19:18 GeneratePin: 12.232s<br />
2007-07-18 12:19:24 GetVendor: 5.377s<br />
2007-07-18 12:20:31 GetLocationByZip: 66.779s
</div>
<p>It is now trivial to see which SOAP call is the culprit (<em>GetLocationByZip</em>) and which vendor to contact.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=371" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=371&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/07/18/php-stopwatch-class-to-time-and-log-script-execution/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Coding on a Live Site</title>
		<link>http://damonparker.org/blog/2007/06/29/coding-on-a-live-site/</link>
		<comments>http://damonparker.org/blog/2007/06/29/coding-on-a-live-site/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 11:46:43 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/06/29/coding-on-a-live-site/</guid>
		<description><![CDATA[I have written several times about debugging a live site and posted snippets for working on the themes of a live WordPress install. One trick I haven&#8217;t mentioned is using the PHP error log. PHP on any production site should be configured to not display errors. I see all too often on random sites that [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I have written several times about <a href="http://damonparker.org/blog/2005/08/22/debug-variables-in-php/">debugging a live site</a> and posted snippets for <a href="http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/">working on the themes</a> of a live WordPress install.  One trick I haven&#8217;t mentioned is using the <a href="http://www.php.net/manual/en/ref.errorfunc.php#ini.error-log" rel="external">PHP error log</a>.</p>
<p>PHP on any production site should be configured to not display errors.  I see all too often on random sites that PHP has been configured to show errors (sometimes even in Google results).  This gives away too much information about your application and server.   </p>
<p>On the servers and applications I work on all of the time, I configure PHP to log errors to <em>/var/log/php_errors</em>.  Simply tailing this file through a console will quickly show any errors caused by the edits.</p>
<p>To enable logging, check these two variables in your <strong>php.ini</strong>:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">; Log errors into a log file (server-specific log, stderr, or error_log (below))</span><br />
<span style="color: #666666; font-style: italic;">; As stated above, you're strongly advised to use error logging in place of</span><br />
<span style="color: #666666; font-style: italic;">; error displaying on production web sites.</span><br />
<span style="color: #000099;">log_errors </span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> On</span></div></div>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">; Log errors to specified file.</span><br />
<span style="color: #666666; font-style: italic;">;error_log = filename</span><br />
<span style="color: #000099;">error_log </span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> /var/log/php_errors</span></div></div>
<p>To <a href="http://www.gnu.org/software/textutils/manual/textutils/html_chapter/textutils_5.html#SEC14" rel="external">tail</a> the log file from an SSH console:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">tail -f <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>log<span style="color: #66cc66;">/</span>php_errors</div></div>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=365" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=365&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/06/29/coding-on-a-live-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Bug &#8211; Theme Reverts to Default Theme</title>
		<link>http://damonparker.org/blog/2007/06/23/wordpress-bug-theme-reverts-to-default-theme/</link>
		<comments>http://damonparker.org/blog/2007/06/23/wordpress-bug-theme-reverts-to-default-theme/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 14:53:01 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Broken]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/06/23/wordpress-bug-theme-reverts-to-default-theme/</guid>
		<description><![CDATA[I have been working on a new WordPress theme for this site and have noticed on several occasions that WordPress has reverted back to the default theme. Google turned up a few helpful pages: WordPress Theme Resetting Problem posted by Scott Burkett WordPress defect #3907 The problem boiled down to the fact that I was [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I have been working on a <a href="http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/">new WordPress theme</a> for this site and have noticed on several occasions that WordPress has reverted back to the default theme.  </p>
<p>Google turned up a few helpful pages:</p>
<ul>
<li><a href="http://www.scottburkett.com/index.php/misc/2006-11-15/wordpress-theme-resetting-problem-solved.html" rel="external">WordPress Theme Resetting Problem</a> posted by Scott Burkett</li>
<li><a href="http://trac.wordpress.org/ticket/3907" rel="external">WordPress defect #3907</a></li>
</ul>
<p>The problem boiled down to the fact that I was editing the file remotely via SFTP.  If I happened to save the file at same time as someone was trying to access a page it the file exists check would fail as there is always a split second while the file is being saved that it technically doesn&#8217;t exist.  The code suggested in the bug report above worked well for me.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=343" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=343&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/06/23/wordpress-bug-theme-reverts-to-default-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zencart Hack &#8211; Logout Customer Automatically After X Failed Payment Attempts</title>
		<link>http://damonparker.org/blog/2007/06/22/zencart-hack-logout-customer-automatically-after-x-failed-payment-attempts/</link>
		<comments>http://damonparker.org/blog/2007/06/22/zencart-hack-logout-customer-automatically-after-x-failed-payment-attempts/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 19:17:37 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Ecommerce]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/06/22/zencart-hack-logout-customer-automatically-after-x-failed-payment-attempts/</guid>
		<description><![CDATA[Credit card slamming is the practice of trying hundreds or thousands of card numbers and security code combinations to find the few in the batch that will actually work. I have discussed credit card slamming here and over at the ZenCart forums several times in the past. The code snippet below can be used in [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Credit card slamming is the practice of trying hundreds or thousands of card numbers and security code combinations to find the few in the batch that will actually work.    I have discussed <a href="http://damonparker.org/blog/2007/03/15/combating-card-fraud/">credit card slamming</a> here and over at the <a href="http://www.zen-cart.com/forum/showthread.php?t=52483&#038;page=2#17" rel="external">ZenCart forums</a> several times in the past. </p>
<p>The code snippet below can be used in <em>modules/checkout_process.php</em> to automatically log a user out after a set number (6 in the below snippet) of payment attempts.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// damonp add auto logoff after 6 attempts</span><br />
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span> <a href="http://www.php.net/isset"><span style="color: #000066;">isset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'payment_attempt'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &nbsp; <span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'payment_attempt'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #cc66cc;">0</span>;<br />
<span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'payment_attempt'</span><span style="color: #66cc66;">&#93;</span>++;<br />
<br />
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'payment_attempt'</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span>&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">// change 6 to change how many attempts to allow before logout</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// log attempt or email report &nbsp;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// the following information is useful</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// &quot;Host:\t\t&quot;.$_SESSION['customers_host_address'].</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// &quot;\nCustomer:\t&quot;.$_SESSION['customer_id'].</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// &quot;\nTotal:\t\t&quot;.$_SESSION['cart']-&gt;total,</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// destroy session to log customer out</span><br />
&nbsp; &nbsp; zen_session_destroy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// redirect to timeout page or create new page to redirect to</span><br />
&nbsp; &nbsp; zen_redirect<span style="color: #66cc66;">&#40;</span>zen_href_link<span style="color: #66cc66;">&#40;</span>FILENAME_TIME_OUT, <span style="color: #ff0000;">''</span>, <span style="color: #ff0000;">'SSL'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Place in between this code near the top of the file:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">// if the customer is not logged on, redirect them to the time out page</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'customer_id'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; zen_redirect<span style="color: #66cc66;">&#40;</span>zen_href_link<span style="color: #66cc66;">&#40;</span>FILENAME_TIME_OUT<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
INSERT AUTO LOGOUT FUNCTIONALITY HERE <br />
<br />
<span style="color: #808080; font-style: italic;">// load selected payment module</span><br />
&nbsp; <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>DIR_WS_CLASSES . <span style="color: #ff0000;">'payment.php'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; <span style="color: #0000ff;">$payment_modules</span> = <span style="color: #000000; font-weight: bold;">new</span> payment<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SESSION</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'payment'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #808080; font-style: italic;">// load the selected shipping module</span><br />
&nbsp; <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>DIR_WS_CLASSES . <span style="color: #ff0000;">'shipping.php'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>I found six attempts to work well on the sites I implemented on.  You do not want to adversely impact normal users but you do want to make it harder on abusers so that they just go away.  </p>
<h4>BE WARNED</h4>
<p>Improper use of this code could prevent anyone from checking out.  The two things that will save you when trying this out are:</p>
<ol>
<li>MAKE A BACKUP</li>
<li>FULLY TEST BEFORE CALLING IT COMPLETE</li>
</ol>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=320" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=320&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/06/22/zencart-hack-logout-customer-automatically-after-x-failed-payment-attempts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeIgniter and BambooInvoice</title>
		<link>http://damonparker.org/blog/2007/06/22/codeigniter-and-bamboo-invoice/</link>
		<comments>http://damonparker.org/blog/2007/06/22/codeigniter-and-bamboo-invoice/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 16:05:00 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/06/22/codeigniter-and-bamboo-invoice/</guid>
		<description><![CDATA[I recently started toying around with CodeIgniter on a new project where I need a simple user login and administration system. I was initially attracted to the first two features listed: You want a framework with a small footprint. You need exceptional performance. This is the first framework I have ever stayed with after a [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I recently started toying around with <a href="http://codeigniter.com" rel="external">CodeIgniter</a> on a new project where I need a simple user login and administration system.  I was initially attracted to the first two features listed:</p>
<ol>
<li><em>You want a framework with a small footprint.</em></li>
<li><em>You need exceptional performance.</em></li>
</ol>
<p>This is the first framework I have ever stayed with after a day because it didn&#8217;t feel constricting.</p>
<blockquote><p>CodeIgniter is an open source Web Application Framework that helps you write kick-ass PHP programs.</p></blockquote>
<p>While looking at the products made with CodeIgniter I found this cool invoicing application:<br />
<a href="http://www.bambooinvoice.org/">BambooInvoice: Simple, Open Source, Online Invoicing</a></p>
<p>Works very similarly to Blinksale buy you own it and can fully customize it.  If I only had time to customize it&#8230; I think for now Blinksale will work for me.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=362" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=362&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/06/22/codeigniter-and-bamboo-invoice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Hack to Debug Themes on a Live Site</title>
		<link>http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/</link>
		<comments>http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 15:50:21 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippets]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/</guid>
		<description><![CDATA[How can a WordPress them be debugged privately without showing the wizard behind the curtain to everyone else? This simple hack will use the specified theme only for one remote IP&#8230; yours. This can be used when creating a new theme by configuring WordPress to present the original theme and specifying your new theme in [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>How can a WordPress them be debugged privately without showing the wizard behind the curtain to everyone else?  This simple hack will use the specified theme only for one remote IP&#8230; yours.  This can be used when creating a new theme by configuring WordPress to present the original theme and specifying your new theme in development in place of THEME_NAME below.  Also replace YOUR_IP_ADDR with your local IP address.  THEME_NAME must be an existing theme directory in <em>wp-content/themes/</em>.</p>
<p>To debug an existing theme, copy your theme directory to a new directory under <em>/themes/</em> (maybe THEME_NAME-dev).  Leave WordPress configured to serve the original theme at THEME_NAME and configure the hack to serve THEME_NAME-dev to your IP address.</p>
<p>Edit <em>wordpress/wp-includes/theme.php</em> as below:</p>
<h4>Before</h4>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> get_template<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> apply_filters<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'template'</span>, get_option<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'template'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<h4>After</h4>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> get_template<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'REMOTE_ADDR'</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'YOUR_IP_ADDR'</span><span style="color: #66cc66;">&#41;</span> &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #ff0000;">'THEME_NAME'</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> apply_filters<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'template'</span>, get_option<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'template'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Depending on how the template links to it&#8217;s stylesheet, the get_stylesheet() function (in the same file) may need a similar hack:</p>
<h4>Before</h4>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> get_stylesheet<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> apply_filters<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'stylesheet'</span>, get_option<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'stylesheet'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<h4>After</h4>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> get_stylesheet<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_SERVER</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'REMOTE_ADDR'</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'YOUR_IP_ADDR'</span><span style="color: #66cc66;">&#41;</span> &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #ff0000;">'THEME_NAME'</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> apply_filters<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'stylesheet'</span>, get_option<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'stylesheet'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>This will not work with a private IP address like 192.168.x.x or 10.10.x.x.  The IP must be the external address of your router or firewall.  To find your external IP address use this link:<br />
<a href="http://emailurl.com/myip" rel="external">http://emailurl.com/myip</a></p>
<p>Also remember that if you change local IP addresses, you need to update the IP address configured in the snippet above.  Most DSL/cable connections use a dynamic IP address that changes every few hours or daily.</p>
<p>Once the theme is good to go, merge the changes into the live template and comment out the code to disable the hack.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=342" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=342&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/04/09/wordpress-hack-debug-themes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ZenCart Inventory Report &#8211; Updated</title>
		<link>http://damonparker.org/blog/2007/03/10/zencart-inventory-report-updated/</link>
		<comments>http://damonparker.org/blog/2007/03/10/zencart-inventory-report-updated/#comments</comments>
		<pubDate>Sat, 10 Mar 2007 14:34:26 +0000</pubDate>
		<dc:creator>damonp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ecommerce]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sites]]></category>

		<guid isPermaLink="false">http://damonparker.org/blog/2007/03/10/zencart-inventory-report-updated/</guid>
		<description><![CDATA[Thanks to Ron for posting a bug back on the Zencart forums about my Zencart Inventory Report Fixed&#8230; download&#8230; enjoy.]]></description>
			<content:encoded><![CDATA[<p></p><p>Thanks to <a href="http://www.zen-cart.com/forum/showpost.php?p=339974&#038;postcount=2" rel="external">Ron</a> for posting a bug back on the <a href="http://zencart.com/forum/">Zencart forums</a> about my <a href="http://damonparker.org/blog/2006/11/29/zencart-inventory-report/">Zencart Inventory Report</a></p>
<p>Fixed&#8230; <a href="http://damonparker.org/files/zen_inventory_report.tar.gz">download&#8230;</a> enjoy.</p>
 <img src="http://damonparker.org/wp-content/plugins/feed-statistics.php?view=1&post_id=323" width="1" height="1" style="display: none;" /><img src="http://damonparker.org/?ak_action=api_record_view&id=323&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://damonparker.org/blog/2007/03/10/zencart-inventory-report-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using xcache
Page Caching using xcache
Database Caching 18/58 queries in 0.067 seconds using xcache
Content Delivery Network via cdn.damonparker.org/q9i5a4w8/cds

Served from: damonparker.org @ 2010-07-30 13:54:37 -->