<?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>St. John Johnson &#187; PHP</title>
	<atom:link href="http://www.stjohnjohnson.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.stjohnjohnson.com</link>
	<description>This is a place for me to post my ideas, projects, tutorials, and resume for all to see</description>
	<lastBuildDate>Tue, 27 Apr 2010 21:05:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Recent Work</title>
		<link>http://www.stjohnjohnson.com/blog/recent-work</link>
		<comments>http://www.stjohnjohnson.com/blog/recent-work#comments</comments>
		<pubDate>Sat, 24 Apr 2010 02:06:56 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Teaching]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/blog/recent-work</guid>
		<description><![CDATA[Sorry for the huge gaps between posts.&#160; I&#8217;m trying to find time to prepare and write up posts about my various projects.&#160; The big one, that I hope can benefit lots of people, is my MySQL Advanced Class.&#160; It&#8217;s basically a PHP class that allows static one-line access to MySQL with proper parameter binding and [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/blog/recent-work/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Math CAPTCHAs</title>
		<link>http://www.stjohnjohnson.com/blog/math-captchas</link>
		<comments>http://www.stjohnjohnson.com/blog/math-captchas#comments</comments>
		<pubDate>Sun, 11 Apr 2010 18:02:18 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[CAPTCHA]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/blog/math-captchas</guid>
		<description><![CDATA[A few years ago, when I was sitting at my moving sale, I came up with some crazy variations on the basic word/letter based CAPTCHA for my senior project, SHUGamer.com.&#160; Most of the ideas I had were either impossible to implement or difficult to answer.&#160; I eventually decided to implement a system based on a [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/blog/math-captchas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Puzzles</title>
		<link>http://www.stjohnjohnson.com/blog/facebook-puzzles</link>
		<comments>http://www.stjohnjohnson.com/blog/facebook-puzzles#comments</comments>
		<pubDate>Fri, 09 Apr 2010 19:45:30 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/blog/facebook-puzzles</guid>
		<description><![CDATA[Hey, it&#8217;s been a while since I posted last.&#160; After getting certified, I felt like I needed to push my programming skill further.&#160; That&#8217;s where the Facebook Engineering Puzzles came into play.&#160; I completed the first two training ones last August (&#34;Hoppity Hop!&#34; and &#34;Meep meep!&#34;).&#160; I also worked on the first easy puzzle, &#34;Liar, [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/blog/facebook-puzzles/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Day 27 &#8211; Advanced Streams</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-27-advanced-streams</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-27-advanced-streams#comments</comments>
		<pubDate>Sun, 17 Jan 2010 04:07:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-27-advanced-streams</guid>
		<description><![CDATA[Yesterday, I was explaining basic built-in streams.&#160; Today I&#8217;ll be covering the advanced modes.&#160; The first thing is basic network access (http, ftp, etc).&#160; Normally, you would just use fopen() or file_get_contents().&#160; Well what would happen if you wanted to provide additional parameters to that call, like user agent?&#160; Meet stream_context_create():
 


$http_options = stream_context_create(array(


&#160; &#39;http&#39; [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-27-advanced-streams/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 26 &#8211; Directory Operations</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-26-directory-operations</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-26-directory-operations#comments</comments>
		<pubDate>Sat, 16 Jan 2010 04:15:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-26-directory-operations</guid>
		<description><![CDATA[Now that we&#8217;ve talked about files, it&#8217;s time to talk about directory access.&#160; PHP has a whole variety of functions designed just for this!&#160; Here are the important ones:
 

chdir($dir): Change working directory
$dir = getcwd(): Get working directory
mkdir($dir, [$permission], [$recursive]): Create a new directory with permission model (in octal) $permission
is_dir($directory): Check if path is an [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-26-directory-operations/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 25 &#8211; File Streams (cont.)</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-25-file-streams-cont</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-25-file-streams-cont#comments</comments>
		<pubDate>Fri, 15 Jan 2010 04:05:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-25-file-streams-cont</guid>
		<description><![CDATA[Yesterday, I kind-of neglected to show you an example of how perform basic file access.&#160; Today I will remedy that!&#160; File access can be done various ways and each has its own reasons.&#160; Here is an example of a CSV read:
 


$name = &#8220;news.csv&#8221;;


&#160;


if &#40;!is_file&#40;$name&#41;&#41;


&#160; die &#40;&#34;File is missing!&#34;&#41;;


&#160;


$file = fopen&#40;$name, &#34;r&#34;&#41;;


&#160;


$news = array&#40;&#41;;


while &#40;$row [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-25-file-streams-cont/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 24 &#8211; Streams</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-24-streams</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-24-streams#comments</comments>
		<pubDate>Thu, 14 Jan 2010 03:37:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-24-streams</guid>
		<description><![CDATA[I only have one week before my certification exam!&#160; I&#8217;m shivering in my boots (if I had boots)!&#160; Well, the important part is not to worry and keep studying.&#160; Here is today&#8217;s topic (and the last chapter of the book):
The streams layer is a series of classes/methods in PHP that manage the reading and writing [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-24-streams/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 23 &#8211; Additional Security</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-23-additional-security</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-23-additional-security#comments</comments>
		<pubDate>Wed, 13 Jan 2010 04:25:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-23-additional-security</guid>
		<description><![CDATA[Okay, today should be the last day of Security topics (finally).&#160; The first one we&#8217;re going to cover is:
 
Remote Code Injection
Remote Code Injection is when a malicious user causes your PHP code to execute remote malicious code.&#160; The most obvious way is by an query string input.&#160; See this example:


require_once &#8220;{$_GET[&#39;page&#39;]}.php&#8221;;




&#160;


&#60;p&#62;If you were to [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-23-additional-security/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 22 &#8211; Database Security</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-22-database-security</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-22-database-security#comments</comments>
		<pubDate>Tue, 12 Jan 2010 04:05:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-22-database-security</guid>
		<description><![CDATA[SQL Injection &#8211; everyone talks about it, but most people fail to protect against it.&#160; This, just like most other security concerns with PHP are INCREDIBLY easy to protect against!&#160; To explain how to protect against SQL Injection, it&#8217;s best if I show you how to perform an attack first.&#160; Let us suppose your login [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-22-database-security/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Day 21 &#8211; Website Security</title>
		<link>http://www.stjohnjohnson.com/zend-php-certification/day-21-website-security</link>
		<comments>http://www.stjohnjohnson.com/zend-php-certification/day-21-website-security#comments</comments>
		<pubDate>Mon, 11 Jan 2010 03:45:00 +0000</pubDate>
		<dc:creator>St. John</dc:creator>
				<category><![CDATA[Zend PHP Certification]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stjohnjohnson.com/zend-php-certification/day-21-website-security</guid>
		<description><![CDATA[Yesterday I explained the basic #1 rule of security when building a website &#8211; &#34;Never Trust the User.&#34;&#160; Today I&#8217;m going to show you why and how a malicious user can attack your website.
 

Form Spoofing
When writing HTML, it&#8217;s normal to provide restriction on field lengths and choices:






Firstname: &#60;input type=&#34;text&#34; name=&#34;fname&#34; maxlength=&#34;100&#34; /&#62;&#60;br /&#62;


Title: &#60;select [...]]]></description>
		<wfw:commentRss>http://www.stjohnjohnson.com/zend-php-certification/day-21-website-security/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
