<?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>Richard Knop&#039;s Zend Framework Blog</title>
	<atom:link href="http://blog.richardknop.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.richardknop.com</link>
	<description>Zend Framework, PHP, MySQL, jQuery, JavaScript, AJAX, SEO, E-commerce and more</description>
	<lastBuildDate>Sat, 21 Aug 2010 21:10:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Solution to &#8220;imagettfbbox() [function.imagettfbbox]: Could not find/open font&#8221;</title>
		<link>http://blog.richardknop.com/2010/08/solution-to-imagettfbbox-function-imagettfbbox-could-not-findopen-font/</link>
		<comments>http://blog.richardknop.com/2010/08/solution-to-imagettfbbox-function-imagettfbbox-could-not-findopen-font/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 21:09:41 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=613</guid>
		<description><![CDATA[If you are using the imagettfbbox() PHP function and come across this error: imagettfbbox() [function.imagettfbbox]: Could not find/open font The solution is to use neither relative nor absolute path to the font but to use a path like this: $font = './arial.ttf';]]></description>
			<content:encoded><![CDATA[<p>If you are using the <a href="http://php.net/manual/en/function.imagettfbbox.php">imagettfbbox()</a> PHP function and come across this error:</p>
<pre><strong>imagettfbbox() [function.imagettfbbox]: Could not find/open font</strong></pre>
<p>The solution is to use neither relative nor absolute path to the font but to use a path like this:</p>
<pre><strong>$font = './arial.ttf';</strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/08/solution-to-imagettfbbox-function-imagettfbbox-could-not-findopen-font/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Send email with attachment with PHP mail()</title>
		<link>http://blog.richardknop.com/2010/07/send-email-with-attachment-with-phps-mail/</link>
		<comments>http://blog.richardknop.com/2010/07/send-email-with-attachment-with-phps-mail/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 17:47:58 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP email with attachment]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=608</guid>
		<description><![CDATA[I am posting this function mainly for my own reference. I am making sure I can just copy and paste this function in the future without having to go through that silly headers mambo jumbo again. This function will correctly map a file extension to a mime type and send both plain text and html [...]]]></description>
			<content:encoded><![CDATA[<p>I am posting this function mainly for my own reference. I am making sure I can just copy and paste this function in the future without having to go through that silly headers mambo jumbo again. This function will correctly map a file extension to a mime type and send both plain text and html versions of email. Here it is:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sendEmailWithAttachment<span class="br0">&#40;</span><span class="re1">$toName</span><span class="sy0">,</span> <span class="co1">// recipient&#39;s name</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$toEmail</span><span class="sy0">,</span> <span class="co1">// recipient&#39;s email</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$fromName</span><span class="sy0">,</span> <span class="co1">// sender&#39;s name</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$fromEmail</span><span class="sy0">,</span> <span class="co1">// sender&#39;s email</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$emailText</span><span class="sy0">,</span> <span class="co1">// plain text email body</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$emailHtml</span><span class="sy0">,</span> <span class="co1">// html email body</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re1">$fileToAttach</span> <span class="coMULTI">/* path to a file you want to attach */</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$emailText</span> <span class="sy0">=</span> <span class="kw3">wordwrap</span><span class="br0">&#40;</span><span class="re1">$emailText</span><span class="sy0">,</span> <span class="nu0">70</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$headers</span> &nbsp;<span class="sy0">=</span> <span class="st0">&quot;To: $toName &lt;$toEmail&gt;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$headers</span> <span class="sy0">.=</span> <span class="st0">&quot;From: $fromName &lt;$fromEmail&gt;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$random_hash</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">&#39;r&#39;</span><span class="sy0">,</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$headers</span> <span class="sy0">.=</span> <span class="st0">&#39;Content-Type: multipart/mixed; boundary=&quot;PHP-mixed-&#39;</span> <span class="sy0">.</span> <span class="re1">$random_hash</span> <span class="sy0">.</span> <span class="st0">&#39;&quot;&#39;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$mimeTypes</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;323&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/h323&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;acx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/internet-property-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ai&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/postscript&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;aif&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-aiff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;aifc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-aiff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;aiff&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-aiff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;asf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-ms-asf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;asr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-ms-asf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;asx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-ms-asf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;au&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/basic&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;avi&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-msvideo&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;axs&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/olescript&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;bas&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/plain&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;bcpio&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-bcpio&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;bin&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;bmp&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/bmp&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;c&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/plain&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cat&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-pkiseccat&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cdf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-cdf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cer&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-x509-ca-cert&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;class&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;clp&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msclip&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cmx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-cmx&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cod&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/cis-cod&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;cpio&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-cpio&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;crd&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-mscardfile&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;crl&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/pkix-crl&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;crt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-x509-ca-cert&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;csh&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-csh&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;css&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/css&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dcr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-director&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;der&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-x509-ca-cert&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dir&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-director&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dll&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msdownload&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dms&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;doc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/msword&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dot&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/msword&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dvi&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-dvi&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;dxr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-director&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;eps&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/postscript&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;etx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/x-setext&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;evy&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/envoy&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;exe&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;fif&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/fractals&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;flr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;gif&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/gif&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;gtar&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-gtar&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;gz&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-gzip&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;h&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/plain&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;hdf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-hdf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;hlp&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/winhlp&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;hqx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/mac-binhex40&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;hta&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/hta&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;htc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/x-component&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;htm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/html&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;html&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/html&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;htt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/webviewhtml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ico&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-icon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ief&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/ief&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;iii&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-iphone&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ins&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-internet-signup&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;isp&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-internet-signup&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;jfif&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/pipeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;jpe&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/jpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;jpeg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/jpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;jpg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/jpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;js&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-javascript&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;latex&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-latex&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;lha&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;lsf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-la-asf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;lsx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-la-asf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;lzh&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/octet-stream&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;m13&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msmediaview&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;m14&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msmediaview&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;m3u&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-mpegurl&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;man&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff-man&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mdb&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msaccess&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;me&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff-me&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mht&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;message/rfc822&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mhtml&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;message/rfc822&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mid&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/mid&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mny&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msmoney&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mov&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/quicktime&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;movie&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/x-sgi-movie&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mp2&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mp3&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpa&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpe&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpeg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpp&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-project&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mpv2&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/mpeg&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ms&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff-ms&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;mvb&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msmediaview&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;nws&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;message/rfc822&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;oda&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/oda&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p10&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/pkcs10&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p12&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs12&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p7b&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-certificates&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p7c&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-mime&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p7m&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-mime&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p7r&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-certreqresp&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;p7s&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-signature&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pbm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-portable-bitmap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pdf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/pdf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pfx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs12&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pgm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-portable-graymap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pko&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/ynd.ms-pkipko&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pma&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-perfmon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pmc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-perfmon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pml&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-perfmon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pmr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-perfmon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pmw&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-perfmon&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pnm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-portable-anymap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pot&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-powerpoint&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ppm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-portable-pixmap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pps&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-powerpoint&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ppt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-powerpoint&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;prf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/pics-rules&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ps&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/postscript&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;pub&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-mspublisher&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;qt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;video/quicktime&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ra&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-pn-realaudio&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ram&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-pn-realaudio&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ras&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-cmu-raster&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;rgb&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-rgb&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;rmi&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/mid&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;roff&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;rtf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/rtf&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;rtx&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/richtext&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;scd&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msschedule&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sct&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/scriptlet&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;setpay&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/set-payment-initiation&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;setreg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/set-registration-initiation&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sh&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-sh&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;shar&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-shar&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sit&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-stuffit&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;snd&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/basic&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;spc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-pkcs7-certificates&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;spl&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/futuresplash&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;src&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-wais-source&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sst&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-pkicertstore&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;stl&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-pkistl&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;stm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/html&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;svg&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/svg+xml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sv4cpio&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-sv4cpio&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;sv4crc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-sv4crc&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;t&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tar&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-tar&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tcl&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-tcl&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tex&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-tex&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;texi&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-texinfo&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;texinfo&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-texinfo&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tgz&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-compressed&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tif&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/tiff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tiff&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/tiff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tr&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-troff&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;trm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msterminal&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;tsv&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/tab-separated-values&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;txt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/plain&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;uls&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/iuls&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;ustar&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-ustar&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;vcf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;text/x-vcard&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;vrml&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wav&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/x-wav&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wcm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-works&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wdb&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-works&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wks&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-works&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wmf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-msmetafile&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wps&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-works&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wri&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-mswrite&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wrl&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;wrz&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xaf&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xbm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-xbitmap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xla&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xlc&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xlm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xls&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xlt&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xlw&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/vnd.ms-excel&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xof&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;x-world/x-vrml&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xpm&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-xpixmap&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;xwd&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;image/x-xwindowdump&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;z&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/x-compress&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="st0">&quot;zip&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;application/zip&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$extension</span> <span class="sy0">=</span> <span class="kw3">end</span><span class="br0">&#40;</span><span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&#39;.&#39;</span><span class="sy0">,</span> <span class="re1">$fileToAttach</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$mimeType</span> <span class="sy0">=</span> <span class="re1">$mimeTypes</span><span class="br0">&#91;</span><span class="re1">$extension</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$fileName</span> <span class="sy0">=</span> <span class="kw3">end</span><span class="br0">&#40;</span><span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&#39;/&#39;</span><span class="sy0">,</span> <span class="re1">$fileToAttach</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$attachment</span> <span class="sy0">=</span> <span class="kw3">chunk_split</span><span class="br0">&#40;</span><span class="kw3">base64_encode</span><span class="br0">&#40;</span><span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="re1">$fileToAttach</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-mixed-$random_hash;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Type: multipart/alternative; boundary=&#39;PHP-alt-$random_hash&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-alt-$random_hash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Type: text/plain; charset=&#39;iso-8859-1&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Transfer-Encoding: 7bit</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">$emailText</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-alt-$random_hash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Type: text/html; charset=&#39;iso-8859-1&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Transfer-Encoding: 7bit</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">$emailHtml</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-alt-$random_hash&#8211;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-mixed-$random_hash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Type: application/$mimeType; name=$fileName</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Transfer-Encoding: base64</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Content-Disposition: attachment</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">$attachment</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#8211;PHP-mixed-$random_hash&#8211;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">mail</span><span class="br0">&#40;</span><span class="re1">$toEmail</span><span class="sy0">,</span> <span class="re1">$subject</span><span class="sy0">,</span> <span class="re1">$output</span><span class="sy0">,</span> <span class="re1">$headers</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Hope somebody will find it useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/07/send-email-with-attachment-with-phps-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework &#8211; MixedCase or ACRONYMCase Survey</title>
		<link>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/</link>
		<comments>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 21:18:31 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=606</guid>
		<description><![CDATA[So Matthew Weier O&#8217;Phinney and the rest of the Zend Framework team have started to convert all code to use ACRONYMCase casing. However, they&#8217;re not done yet and they have decided to let people decide whether to use MixedCase or ACRONYMCase. If you&#8217;d like to have your say in this matter simply visit this website [...]]]></description>
			<content:encoded><![CDATA[<p>So Matthew Weier O&#8217;Phinney and the rest of the Zend Framework team have started to convert all code to use ACRONYMCase casing. However, they&#8217;re not done yet and they have decided to let people decide whether to use MixedCase or ACRONYMCase. If you&#8217;d like to have your say in this matter simply visit <a href="http://spreadsheets.google.com/viewform?formkey=dEtsV1NxLUYtOWZKTTN1cmVibV8tbEE6MQ">this website</a> and vote in the survey.</p>
<p>The poll will probably get closed in few days so hurry.</p>
<p>Personally, I have voted for ZF classes to enforce MixedCasing. I find it much more readable than ACRONYMCasing. XmlHttpRequest is prettier and more readable than XMLHTTPRequest, don&#8217;t you think?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/07/zend-framework-mixedcase-or-acronymcase-survey/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zend Framework content negotiation plugin</title>
		<link>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/</link>
		<comments>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 17:33:41 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Content negotiation]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=601</guid>
		<description><![CDATA[Even though most designers write nice and valid XHTML it usually gets served to browser as text/html. In other words, what browser sees is a chaotic tag soup instead of XML (remember that while HTML was based on SGML, XHTML is based on XML or it is a reformulation of HTML in XML). The major [...]]]></description>
			<content:encoded><![CDATA[<p>Even though most designers write nice and valid XHTML it usually gets served to browser as text/html. In other words, what browser sees is a chaotic tag soup instead of XML (remember that while HTML was based on SGML, XHTML is based on XML or it is a reformulation of HTML in XML). The major reason why XHTML pages are getting served as text/html is infamous Internet Explorer which does not support serving XHTML the correct way (as XML). But why should your website suffer because of one browser? You can serve the tag soup to IE and serve XML to other browsers. This is called <strong>content negotiation</strong> and I&#8217;m going to show you a simple Zend Fraemwork controller plugin that will negotiate different content to different browsers:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Plugin_NegotiateContent <span class="kw2">extends</span> Zend_Controller_Plugin_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> preDispatch<span class="br0">&#40;</span>Zend_Controller_Request_Abstract <span class="re1">$request</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span> <span class="sy0">=</span> Zend_Controller_Action_HelperBroker<span class="sy0">::</span><span class="me2">getExistingHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">initView</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span> <span class="sy0">=</span> <span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// content negotiation</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Vary: Accept&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">false</span> <span class="sy0">===</span> <span class="kw3">stristr</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_ACCEPT&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st0">&#39;application/xhtml+xml&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type: text/html; charset=utf-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;HTML4_STRICT&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headMeta</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendHttpEquiv</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type&#39;</span><span class="sy0">,</span> <span class="st0">&#39;text/html; charset=UTF-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">xhtmlAllowed</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type: application/xhtml+xml; charset=utf-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;XHTML1_STRICT&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headMeta</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendHttpEquiv</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Type&#39;</span><span class="sy0">,</span> <span class="st0">&#39;application/xhtml+xml; charset=UTF-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">xhtmlAllowed</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This plugin will serve HTML 4.01 Strict as text/html to IE and XHTML 1.0 Strict as application/xhtml+xml to other browsers.</p>
<p>The only thing you need to do is to register the plugin to the front controller during bootstrapping:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$frontController</span><span class="sy0">-&gt;</span><span class="me1">registerPlugin</span><span class="br0">&#40;</span><span class="kw2">new</span> My_Controller_Plugin_NegotiateContent<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>And it will take care of content negotiation. The plugin will also set a boolean view variable $view-&gt;xhtmlAllowed so you can use different markups in layouts and views if needed (&lt;img&gt; in HTML and &lt;img /&gt; in XHTML).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/07/zend-framework-content-negotiation-plugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Head first Java development</title>
		<link>http://blog.richardknop.com/2010/05/head-first-java-development/</link>
		<comments>http://blog.richardknop.com/2010/05/head-first-java-development/#comments</comments>
		<pubDate>Thu, 20 May 2010 22:37:42 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=577</guid>
		<description><![CDATA[I&#8217;ve been learning Java lately (by reading the official Java tutorials which are fantastic) and I have decided to write a simple tutorial for others who like to jump head first to developing with Java without having to read lots of theory on its architecture, OOP principles and so on. You will need few things [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been learning Java lately (by reading the official <a href="http://java.sun.com/docs/books/tutorial/">Java tutorials</a> which are fantastic) and I have decided to write a simple tutorial for others who like to jump head first to developing with Java without having to read lots of theory on its architecture, OOP principles and so on.</p>
<p>You will need few things in order to develop Java applications:</p>
<ul>
<li>Java SE JDK (download <a href="http://java.sun.com/javase/downloads/index.jsp">here</a>)</li>
<li>IDE (I recommend <a href="http://www.eclipse.org/">Eclipse</a>)</li>
</ul>
<p>You might also need to edit your PATH and CLASSPATH environment variables but more about that later.</p>
<p>Java source code is saved in files with a *.java extension. Once you compile a java file, a compiled *.class file is created. Java compiler outputs platform-neutral Java bytecode which is a bit different than *.exe executable files you are most likely used to. To run a class file you need Java Virtual Machine (JVM) installed on your machine. You should already have that if you downloaded and installed the JDK linked above.</p>
<p>Let&#8217;s write your first Java application then.</p>
<p>Open Eclipse and go to File -&gt; New -&gt; Java Project. Call it &#8220;Hello World&#8221;, for example. Once you have created a project, right click on &#8220;src&#8221; folder in the left part of Eclipse called Navigator and select New -&gt; Class. Call it &#8220;HelloWorld&#8221; as well and write this code in the editor that appears next to the Navigator:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> HelloWorld <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Hello World&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s it. The above Java application will simple print &#8220;Hello World&#8221; and do nothing more but you have to start somewhere <img src='http://blog.richardknop.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>To compile and run the application, select Run -&gt; Run As -&gt; Java Application. The program output will appear in the bottom part of Eclipse under Console tab.</p>
<h3>PATH &amp; CLASSPATH</h3>
<p>If you want to be able to compile and run Java applications from Windows command line, you will need to add/edit PATH and CLASSPATH environment variables first. In Windows 7/Vista, right click on Computer and select Properties. Go to Advanced system settings and click on Environment Variables button in bottom left corner. A window similar to the picture bellow should appear.</p>
<p><a href="http://blog.richardknop.com/wp-content/uploads/2010/05/Untitled-1.jpg"><img class="alignnone size-full wp-image-592" title="Changing user/system variables in Windows 7" src="http://blog.richardknop.com/wp-content/uploads/2010/05/Untitled-1.jpg" alt="" width="433" height="506" /></a></p>
<p>You need to add (or change if it already exists) CLASSPATH to your user variables and PATH to both user and system variables. Set PATH variable to a bin directory of your JDK installation (i.e. C:\Program Files (x86)\Java\jdk1.6.0_20\bin) and set CLASSPATH variable to a directory where you store compiled class files of your Java applications (you can see in the picture I set it to D:\java-projects\HelloWorld\bin). You can set multiple paths separated by semicolon. You might also want to set a system variable JAVA_HOME to a JDK installation directory (i.e. C:\Program Files (x86)\Java\jdk1.6.0_20).</p>
<p>Now you should be able to compile and run Java applications from Windows command line. To compile a java file, type:</p>
<pre>javac D:\java-projects\HelloWorld\src\HelloWorld.java</pre>
<p>To run the compiled class file, type:</p>
<pre>java HelloWorld
</pre>
<p>If you haven&#8217;t set the CLASSPATH variable, you could use an optional cp parameter to specify it in cmd:</p>
<pre>java -cp D:\java-projects\HelloWorld\bin HelloWorld
</pre>
<p>You can find more about PATH and CLASSPATH variables <a href="http://java.sun.com/docs/books/tutorial/essential/environment/paths.html">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/05/head-first-java-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to register a new phpBB user with Zend Framework</title>
		<link>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/</link>
		<comments>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/#comments</comments>
		<pubDate>Thu, 20 May 2010 21:44:02 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[phpBB]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=580</guid>
		<description><![CDATA[You might need to integrate one of your future Zend Framework applications with phpBB forum software. The most important aspect of such integration is a dual sign up process. In other words, you want to avoid having users sign up at both the application and phpBB forum. The simplest solution is to have a single [...]]]></description>
			<content:encoded><![CDATA[<p>You might need to integrate one of your future Zend Framework applications with <a href="http://www.phpbb.com/">phpBB</a> forum software. The most important aspect of such integration is a dual sign up process. In other words, you want to avoid having users sign up at both the application and phpBB forum. The simplest solution is to have a single sign up form in your ZF application which upon submission will register user details in both your application and the phpBB forum. I will show you how to do that assuming both applications are on the same server.</p>
<p>The sign up form should have at least these fields:</p>
<ul>
<li>email</li>
<li>username</li>
<li>password</li>
</ul>
<div class="geshi no php">
<div class="head">// first of all, let&#39;s get the submitted form data</div>
<ol>
<li class="li1">
<div class="de1"><span class="re1">$data</span> <span class="sy0">=</span> <span class="re1">$form</span><span class="sy0">-&gt;</span><span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// here you would use the data to register user in the ZF application</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// once the user has been registered at the application level,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// let&#39;s use the same data to register him/her at the phpBB level</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$db</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;dbAdapter&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phpbbUserIp</span> <span class="sy0">=</span> <span class="st0">&#39;127.0.0.1&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// if IP is valid include it in the INSERT query</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$validator</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Validate_Ip<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$validator</span><span class="sy0">-&gt;</span><span class="me1">isValid</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;REMOTE_ADDR&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$phpbbUserIp</span> <span class="sy0">=</span> <span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;REMOTE_ADDR&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sql</span> <span class="sy0">=</span> <span class="st0">&#39;INSERT INTO phpbb_users (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_type,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;group_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_permissions,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;username,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;username_clean,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_password,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_email,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_email_hash,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_timezone,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_lang,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_ip,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_regdate,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;user_dateformat)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">2</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;username&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;username&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_helper<span class="sy0">-&gt;</span><span class="me1">PhpbbHash</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;password&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&#39;%u&#39;</span><span class="sy0">,</span> <span class="kw3">crc32</span><span class="br0">&#40;</span><span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">1.00</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;sk&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$phpbbUserIp</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;D M d, Y g:i a&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;SELECT user_id FROM phpbb_users WHERE user_email = ? LIMIT 1&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re1">$data</span><span class="br0">&#91;</span><span class="st0">&#39;email&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$userId</span> <span class="sy0">=</span> <span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">fetchColumn</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$stmt</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Statement_Pdo<span class="br0">&#40;</span><span class="re1">$db</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;INSERT INTO phpbb_user_group (</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user_id,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;group_leader,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user_pending)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VALUES (?, ?, ?, ?)&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="re1">$userId</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">7</span><span class="sy0">,</span> <span class="re1">$userId</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>There are few tiny things you will probably need to modify according to your application. I chose Slovak language (&#8216;sk&#8217;) and GMT+1 time zone (&#8217;1.00&#8242;) which is a time for central Europe. I also used a controller action helper PhpbbHash above. The helper is here:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* PhpbbHash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Just a phpbb hashing algorithm rewritten in a form of controller action helper.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* The reason for this is because we want users to be registered simultaneously</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* at both the main website and the phpbb forum so we will need to add a row to</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* phpbb_users table during registration at the main website.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @author PHPBB</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> My_Controller_Action_Helper_PhpbbHash <span class="kw2">extends</span> Zend_Controller_Action_Helper_Abstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> direct<span class="br0">&#40;</span><span class="re1">$password</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$itoa64</span> <span class="sy0">=</span> <span class="st0">&#39;./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random_state</span> <span class="sy0">=</span> <span class="st0">&#39;123456789012&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count</span> <span class="sy0">=</span> <span class="nu0">6</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re1">$fh</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw3">fopen</span><span class="br0">&#40;</span><span class="st0">&#39;/dev/urandom&#39;</span><span class="sy0">,</span> <span class="st0">&#39;rb&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="kw3">fread</span><span class="br0">&#40;</span><span class="re1">$fh</span><span class="sy0">,</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$fh</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$random</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="sy0">;</span> <span class="re1">$i</span> <span class="sy0">+=</span> <span class="nu0">16</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random_state</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="st0">&#39;123456789012&#39;</span> <span class="sy0">.</span> <span class="re1">$random_state</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">.=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$random_state</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$random</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$random</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_crypt_private<span class="br0">&#40;</span><span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_gensalt_private<span class="br0">&#40;</span><span class="re1">$random</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$hash</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="nu0">34</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$hash</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$password</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_gensalt_private<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="sy0">,</span> <span class="re1">$iteration_count_log2</span> <span class="sy0">=</span> <span class="nu0">6</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$iteration_count_log2</span> <span class="sy0">&lt;</span> <span class="nu0">4</span> <span class="sy0">||</span> <span class="re1">$iteration_count_log2</span> <span class="sy0">&gt;</span> <span class="nu0">31</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$iteration_count_log2</span> <span class="sy0">=</span> <span class="nu0">8</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;$H$&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="kw3">min</span><span class="br0">&#40;</span><span class="re1">$iteration_count_log2</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw2">PHP_VERSION</span> <span class="sy0">&gt;=</span> <span class="nu0">5</span><span class="br0">&#41;</span> ? <span class="nu0">5</span> <span class="sy0">:</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">30</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_encode64<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="nu0">6</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_encode64<span class="br0">&#40;</span><span class="re1">$input</span><span class="sy0">,</span> <span class="re1">$count</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="sy0">++</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="re1">$value</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">|=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> <span class="nu0">8</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">6</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">++</span> <span class="sy0">&gt;=</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$value</span> <span class="sy0">|=</span> <span class="kw3">ord</span><span class="br0">&#40;</span><span class="re1">$input</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> <span class="nu0">16</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">12</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span><span class="sy0">++</span> <span class="sy0">&gt;=</span> <span class="re1">$count</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$itoa64</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="re1">$value</span> <span class="sy0">&gt;&gt;</span> <span class="nu0">18</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0x3f<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> _hash_crypt_private<span class="br0">&#40;</span><span class="re1">$password</span><span class="sy0">,</span> <span class="re1">$setting</span><span class="sy0">,</span> <span class="sy0">&amp;</span><span class="re1">$itoa64</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="st0">&#39;*&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check for correct hash</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&#39;$H$&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count_log2</span> <span class="sy0">=</span> <span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re1">$itoa64</span><span class="sy0">,</span> <span class="re1">$setting</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$count_log2</span> <span class="sy0">&lt;</span> <span class="nu0">7</span> <span class="sy0">||</span> <span class="re1">$count_log2</span> <span class="sy0">&gt;</span> <span class="nu0">30</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$count</span> <span class="sy0">=</span> <span class="nu0">1</span> <span class="sy0">&lt;&lt;</span> <span class="re1">$count_log2</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$salt</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">4</span><span class="sy0">,</span> <span class="nu0">8</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$salt</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="nu0">8</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * We&#39;re kind of forced to use MD5 here since it&#39;s the only</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * cryptographic primitive available in all versions of PHP</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * currently in use.  To implement our own low-level crypto</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * in PHP would result in much worse performance and</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * consequently in lower iteration counts and hashes that are</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; * quicker to crack (by non-PHP code).</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">PHP_VERSION</span> <span class="sy0">&gt;=</span> <span class="nu0">5</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$salt</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$hash</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">&#8211;</span><span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$salt</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$hash</span> <span class="sy0">=</span> <span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re1">$hash</span> <span class="sy0">.</span> <span class="re1">$password</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">&#8211;</span><span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">=</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re1">$setting</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">12</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$output</span> <span class="sy0">.=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_hash_encode64<span class="br0">&#40;</span><span class="re1">$hash</span><span class="sy0">,</span> <span class="nu0">16</span><span class="sy0">,</span> <span class="re1">$itoa64</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Few comments:</p>
<ol>
<li>The above code is taken directly from the phpBB codebase, I only made a couple of necessary changes to make it work with Zend Framework.</li>
<li>For those of you asking why didn&#8217;t I just use phpBB API and call its native functions, there is a reason for it. The phpBB code is written to be available with PHP 4. Zend Framework requires at least PHP 5.2.4. There are lots of globals and other scary stuff in the phpBB codebase which makes it impossible for its functions to be called from ZF controllers.</li>
<li>If you think I should have done something differently or I completely forgot to do something, please let me know.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/05/how-to-register-a-new-phpbb-user-with-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to create a page in PHP?</title>
		<link>http://blog.richardknop.com/2010/03/how-to-create-a-page-in-php/</link>
		<comments>http://blog.richardknop.com/2010/03/how-to-create-a-page-in-php/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 17:41:56 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Front controller]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=565</guid>
		<description><![CDATA[One of the most common questions beginner PHP programmers ask is &#8220;How to create a page in PHP?&#8221;. What they mean by that is how can they create a website where pages have URIs like these: http://www.example.com/home http://www.example.com/about http://www.example.com/contact Instead of URIs like these: http://www.example.com/index.php?page=home http://www.example.com/index.php?page=about http://www.example.com/index.php?page=contact It&#8217;s actually a trivial problem but surprisingly people [...]]]></description>
			<content:encoded><![CDATA[<p>One of the most common questions beginner PHP programmers ask is &#8220;How to create a page in PHP?&#8221;. What they mean by that is how can they create a website where pages have URIs like these:</p>
<pre>http://www.example.com/home

http://www.example.com/about

http://www.example.com/contact</pre>
<p>Instead of URIs like these:</p>
<pre>http://www.example.com/index.php?page=home

http://www.example.com/index.php?page=about

http://www.example.com/index.php?page=contact</pre>
<p>It&#8217;s actually a trivial problem but surprisingly people still keep asking it. I guess there are not enough examples around the Web so bellow I will show you probably the most primitive front controller implementation.</p>
<p>What I have described above is called a front controller. To put it differently &#8211; a central script accepting all traffic and displaying different content based on GET parameters. Let&#8217;s get started!</p>
<p>First, I have created  a simple directory structure for my front controller:</p>
<pre>/path/to/root/
    .htaccess
    404.php
    footer.php
    header.php
    index.php
    /path/to/root/pages/
        about.phtml
        contact.phtml
        home.phtml</pre>
<h2>.htaccess</h2>
<pre>RewriteEngine on
RewriteRule ^([A-Za-z\-]+)/?$ index.php?page=$1 [L]</pre>
<p>What it does is it will redirect you from http://www.example.com/page to http://www.example.com/index.php?page=page silently. This is not necessary but URIs with index.php are ugly and have no semantic meaning.</p>
<h2>404.php</h2>
<pre>&lt;h1&gt;Error 404&lt;/h1&gt;</pre>
<p>This is just a template for a 404 Not Found page. You can put any HTML you like there.</p>
<h2>footer.php</h2>
<pre>&lt;/body&gt;
&lt;/html&gt;</pre>
<p>All pages will finish with the same HTML written down in the footer.php file.</p>
<h2>header.php</h2>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;!</span>DOCTYPE html <span class="kw2">PUBLIC</span> <span class="st0">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>html xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml<span class="sy0">:</span>lang<span class="sy0">=</span><span class="st0">&quot;en&quot;</span> lang<span class="sy0">=</span><span class="st0">&quot;en&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>head<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>meta http<span class="sy0">-</span>equiv<span class="sy0">=</span><span class="st0">&quot;Content-type&quot;</span> content<span class="sy0">=</span><span class="st0">&quot;text/html; charset=utf-8&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>meta http<span class="sy0">-</span>equiv<span class="sy0">=</span><span class="st0">&quot;Content-Language&quot;</span> content<span class="sy0">=</span><span class="st0">&quot;en-us&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>title<span class="sy0">&gt;&lt;</span>?php <span class="kw3">echo</span> <span class="re1">$title</span><span class="sy0">;</span> ?<span class="sy0">&gt;&lt;/</span>title<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>head<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>body<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>Similarly, all pages share the same header.</p>
<p>Notice the &lt;?php echo $title; ?&gt;. We will set a dynamic title based on a current page in the front controller.</p>
<h2>index.php</h2>
<p>The most important file. This is the already mentioned front controller:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// first we define the current working directory as a constant</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;BASE_PATH&#39;</span><span class="sy0">,</span> <span class="kw3">getcwd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// in case no page is defined, assume the home page</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// otherwise, urldecode the page and make it lowercase</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$page</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$_GET</span><span class="br0">&#91;</span><span class="st0">&#39;page&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ? <span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re1">$_GET</span><span class="br0">&#91;</span><span class="st0">&#39;page&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">:</span> <span class="st0">&#39;home&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// absolute path to a page template</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$path</span> <span class="sy0">=</span> BASE_PATH</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">.</span> <span class="st0">&#39;/pages/&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">.</span> <span class="re1">$page</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">.</span> <span class="st0">&#39;.phtml&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// if a page template exists in the pages directory</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">false</span> <span class="sy0">===</span> <span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re1">$path</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// send 404 Not Found HTTP status code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;HTTP/1.0 404 Not Found&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set title</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$title</span> <span class="sy0">=</span> <span class="st0">&#39;Error 404&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set template to be included</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$page</span> <span class="sy0">=</span> <span class="st0">&#39;404.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// send 200 OK HTTP status code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;HTTP/1.0 200 OK&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set title (replace &quot;-&quot; chars with &quot; &quot; and make the first char uppercase)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$title</span> <span class="sy0">=</span> <span class="kw3">ucfirst</span><span class="br0">&#40;</span><span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&#39;-&#39;</span><span class="sy0">,</span> <span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="re1">$page</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set template to be included</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$page</span> <span class="sy0">=</span> <span class="re1">$path</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// include the header template</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span> BASE_PATH <span class="sy0">.</span> <span class="st0">&#39;/header.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// include the page template</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span> <span class="re1">$page</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// and finally, include the footer template</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span> BASE_PATH <span class="sy0">.</span> <span class="st0">&#39;/footer.php&#39;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>I have added some crucial comments above so you ca understand what&#8217;s going on there.</p>
<h2>about.phtml</h2>
<pre>&lt;h1&gt;About&lt;/h1&gt;</pre>
<p>A template for http://www.example.com/about page.</p>
<h2>contact.phtml</h2>
<pre>&lt;h1&gt;Contact&lt;/h1&gt;</pre>
<p>A template for http://www.example.com/contact page.</p>
<h2>home.phtml</h2>
<pre>&lt;h1&gt;Home&lt;/h1&gt;</pre>
<p>A template for the home page: http://www.example.com/home or just http://www.example.com/.</p>
<h2>Final thoughts</h2>
<p>You can add as many new pages as you like by adding new templates to the pages directory. Just remember only alphabetical characters and the &#8220;-&#8221; character are allowed in their names.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/how-to-create-a-page-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some really large PHP websites</title>
		<link>http://blog.richardknop.com/2010/03/some-really-large-php-websites/</link>
		<comments>http://blog.richardknop.com/2010/03/some-really-large-php-websites/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 11:51:13 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=561</guid>
		<description><![CDATA[I often hear developers from another camps such as Java or ASP.NET say that PHP is good for small or medium sized websites but it&#8217;s no good for larger web applications where more professional language should be used. I&#8217;m starting to get pretty tired of it so here is  a list of some huge websites [...]]]></description>
			<content:encoded><![CDATA[<p>I often hear developers from another camps such as Java or ASP.NET say that PHP is good for small or medium sized websites but it&#8217;s no good for larger web applications where more professional language should be used. I&#8217;m starting to get pretty tired of it so here is  a list of some huge websites powered by PHP:</p>
<ol>
<li><a href="http://www.facebook.com/">Facebook</a></li>
<li><a href="http://www.wikipedia.org/">Wikipedia</a></li>
<li><a href="http://www.flickr.com/">Flickr</a></li>
<li><a href="http://answers.yahoo.com/">Yahoo! Answers</a></li>
<li><a href="http://bookmarks.yahoo.com/">Yahoo! Bookmarks</a></li>
<li><a href="http://delicious.com/">Delicious</a></li>
<li><a href="http://digg.com/">Digg</a></li>
<li><a href="http://www.friendster.com/">Friendster</a></li>
<li><a href="http://sourceforge.net/">SourceForge</a></li>
<li><a href="http://photobucket.com/">Photobucket</a></li>
</ol>
<p>There are several other big websites powered by Drupal (see <a href="http://buytaert.net/tag/drupal-sites">Drupal sites</a> link) or other PHP based scripts/content management systems. <a href="http://www.ign.com/">IGN</a> uses <a href="http://framework.zend.com/">Zend Framework</a> for some of its subdomains as well. <a href="http://www.symfony-project.org/">Symfony</a> powers <a href="http://trac.symfony-project.org/wiki/ApplicationsDevelopedWithSymfony">lots of websites</a> (some of them pretty large) as well.</p>
<p>I am not saying that PHP is the better option compared to other languages used for web development. All I wanted to prove by this post is that PHP can be successfully used for huge and scalable websites. How reliable, maintainable, secure or fast a website will be is mostly language-agnostic and depends on how much thought is put into design and whether developers adhere to best practices.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/some-really-large-php-websites/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zend Framework IE conditional stylesheets and scripts</title>
		<link>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/</link>
		<comments>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 21:27:17 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[IE conditional comments in Zend Framework]]></category>
		<category><![CDATA[Zend view helpers]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=559</guid>
		<description><![CDATA[You can append a conditional stylesheet in a controller action like this: $this-&#62;view-&#62;headLink&#40;&#41;-&#62;appendStylesheet&#40;&#39;/path/to/some/styles.css&#39;, &#39;screen&#39;, &#39;IE 8&#39;&#41;; Which would produce this markup: &#60;!--[if IE 8]&#62; &#60;link href="/path/to/some/styles.css" media="screen" rel="stylesheet" type="text/css" /&#62;&#60;![endif]--&#62; Adding a conditional JavaScript file is similar: $this-&#62;view-&#62;headScript&#40;&#41;-&#62;appendFile&#40;&#39;/path/to/some/script.js&#39;, &#39;text/javascript&#39;, array&#40;&#39;conditional&#39; =&#62; &#39;IE&#39;&#41;&#41;; And that would produce markup like this: &#60;!--[if IE]&#62; &#60;script type="text/javascript" src="/path/to/some/script.js"&#62;&#60;/script&#62;&#60;![endif]--&#62; It [...]]]></description>
			<content:encoded><![CDATA[<p>You can append a conditional stylesheet in a controller action like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">-&gt;</span><span class="me1">headLink</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendStylesheet</span><span class="br0">&#40;</span><span class="st0">&#39;/path/to/some/styles.css&#39;</span><span class="sy0">,</span> <span class="st0">&#39;screen&#39;</span><span class="sy0">,</span> <span class="st0">&#39;IE 8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Which would produce this markup:</p>
<pre>&lt;!--[if IE 8]&gt; &lt;link href="/path/to/some/styles.css" media="screen" rel="stylesheet" type="text/css" /&gt;&lt;![endif]--&gt;</pre>
<p>Adding a conditional JavaScript file is similar:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">-&gt;</span><span class="me1">headScript</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">appendFile</span><span class="br0">&#40;</span><span class="st0">&#39;/path/to/some/script.js&#39;</span><span class="sy0">,</span> <span class="st0">&#39;text/javascript&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;conditional&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;IE&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>And that would produce markup like this:</p>
<pre>&lt;!--[if IE]&gt; &lt;script type="text/javascript" src="/path/to/some/script.js"&gt;&lt;/script&gt;&lt;![endif]--&gt;</pre>
<p>It can pretty useful when you need to use IE conditional comments just for a single controller action. Otherwise, if it applies site-wide, it&#8217;s better to just put conditional stylesheets and/or scripts in a layout file.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/zend-framework-ie-conditional-stylesheets-and-scripts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Simple Search Engine Implementing Zend_Search_Lucene</title>
		<link>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/</link>
		<comments>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 15:51:36 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Search_Lucene]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=555</guid>
		<description><![CDATA[Zend_Search_Lucene is a PHP port of a popular Java search engine Apache Lucene. It is also an important part of Zend Framework. Some say that it is too sluggish to be used in robust web applications and recommend faster alternatives such as Sphinx but that is not today&#8217;s topic. In this post I will show [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://framework.zend.com/manual/en/zend.search.lucene.html">Zend_Search_Lucene</a> is a PHP port of a popular Java search engine <a href="http://lucene.apache.org/java/docs/">Apache Lucene</a>. It is also an important part of Zend Framework. Some say that it is too sluggish to be used in robust web applications and recommend faster alternatives such as <a href="http://www.sphinxsearch.com/">Sphinx</a> but that is not today&#8217;s topic. In this post I will show you a basic implementation of Zend_Search_Lucene that has worked well so far for medium websites I have worked on. There are two main tasks you will have to take care of:</p>
<ol>
<li>Creating an index and updating it regularly.</li>
<li>Searching the index with a powerful <a href="http://framework.zend.com/manual/en/zend.search.lucene.query-language.html">query language</a>.</li>
</ol>
<p>First, let&#8217;s create a fresh search index. I know it&#8217;s already tiresome but I will use a simple blog application for my example implementation. To simplify it even further, it will only be possible to search blog posts. The posts schema looks like this:</p>
<pre>CREATE TABLE posts (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
user_id INT NOT NULL,
INDEX (created_at),
INDEX (user_id),
FOREIGN KEY (user_id)
REFERENCES users(id)
ON UPDATE CASCADE
ON DELETE CASCADE,
PRIMARY KEY (id)
) ENGINE = INNODB;</pre>
<p>Creating the search index is easy:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">Zend_Search_Lucene<span class="sy0">::</span><span class="me2">setDefaultSearchField</span><span class="br0">&#40;</span><span class="st0">&#39;contents&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// create blog posts index located in /data/posts_index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// make sure the folder is writable</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span> <span class="sy0">=</span> Zend_Search_Lucene<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span><span class="st0">&#39;data/posts_index&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// $this-&gt;_getTable() is a method that returns a model</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// get() method of the model returns all posts from the database</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$posts</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_getTable<span class="br0">&#40;</span><span class="st0">&#39;Posts&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// iterate through posts and build the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$posts</span> <span class="kw1">as</span> <span class="re1">$p</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Search_Lucene_Document<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">UnIndexed</span><span class="br0">&#40;</span><span class="st0">&#39;entry_id&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">id</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">Keyword</span><span class="br0">&#40;</span><span class="st0">&#39;title&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">title</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$doc</span><span class="sy0">-&gt;</span><span class="me1">addField</span><span class="br0">&#40;</span>Zend_Search_Lucene_Field<span class="sy0">::</span><span class="me2">UnStored</span><span class="br0">&#40;</span><span class="st0">&#39;contents&#39;</span><span class="sy0">,</span> <span class="re1">$p</span><span class="sy0">-&gt;</span><span class="me1">body</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">addDocument</span><span class="br0">&#40;</span><span class="re1">$doc</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// commit the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Pretty straightforward. You can see I have used three different static methods for adding fields to the document:</p>
<ul>
<li><strong>UnIndexed</strong>: unindexed and unstored (therefor unsearchable) but they are returned with search results. Unindexed fields usually store primary keys, timestamps or file paths.</li>
<li><strong>Text</strong>: indexed, stored and tokenized. Text fields are searchable and are returned with search hits. Titles, first and last names, cities and states, post codes and street names are all good candidates for keyword fields.</li>
<li><strong>UnStored</strong>: indexed and unstored &#8211; ideal for large texts.</li>
</ul>
<p>There are more types of fields you can use (keyword, binary) but you can read about them in the documentation.</p>
<p>Next thing you need to do is update the index every once in a while so the search hits return up-to-date information. There are two ways to get around this problem. The most obvious is to update the index every time a new post is published or an existing post is edited. Another approach would be to set up a cron job to run every now and then and rebuild the index. Which way you choose depends on many variables such as expected index size (a very large index can have few GBs in size).</p>
<p>Secondly, the index is already taken care of, so let&#8217;s search it:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">Zend_Search_Lucene_Analysis_Analyzer<span class="sy0">::</span><span class="me2">setDefault</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Zend_Search_Lucene<span class="sy0">::</span><span class="me2">setResultSetLimit</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// explode the search query to individual words</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$words</span>  <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re1">$request</span><span class="sy0">-&gt;</span><span class="me1">getParam</span><span class="br0">&#40;</span><span class="st0">&#39;search_for&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// start a search query and add a term for each word to it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$query</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Search_Lucene_Search_Query_MultiTerm<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$words</span> <span class="kw1">as</span> <span class="re1">$w</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$query</span><span class="sy0">-&gt;</span><span class="me1">addTerm</span><span class="br0">&#40;</span><span class="kw2">new</span> Zend_Search_Lucene_Index_Term<span class="br0">&#40;</span><span class="re1">$w</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// open and query the index</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$index</span> <span class="sy0">=</span> Zend_Search_Lucene<span class="sy0">::</span><span class="me2">open</span><span class="br0">&#40;</span><span class="st0">&#39;data/posts_index&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$results</span> <span class="sy0">=</span> <span class="re1">$index</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="re1">$query</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// the search results</span></div>
</li>
</ol>
</div>
<p>That was possibly the simplest possible example of a Lucene search query. You can, however, create very complex queries with the powerful Lucene query language. You can either build queries manually in PHP or you can use Zend_Search_Lucene methods to build them. It&#8217;s so easy a baby could do it.</p>
<p>To search for posts with words &#8216;hello&#8217; and &#8216;word&#8217; in the contents field you would write this query:</p>
<pre>hello</pre>
<p>To search for a post that must contain &#8216;hello&#8217; and may contain &#8216;world&#8217;:</p>
<pre>+hello world</pre>
<p>To search for a post that must contain &#8216;hello&#8217; in the contents field and may contain &#8216;world&#8217; in the title field:</p>
<pre>+hello title:"world"</pre>
<p>And those were just basics. You can use boolean operators, wildcards, ranges and even perform a fuzzy search.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2010/03/a-simple-search-engine-implementing-zend_search_lucene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
