<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title><![CDATA[PHP Freaks Tutorials]]></title>
    <link>http://www.phpfreaks.com/feed/tutorials</link>
    <description />
    <pubDate>Sat, 04 Jul 2009 03:35:06 +0000</pubDate>
    <webMaster>contact@phpfreaks.com</webMaster>
    <generator>Zend_Feed</generator>
    <language>en-US</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/phpfreaks/tutorials" type="application/rss+xml" /><item>
      <title><![CDATA[Simple SQL Search]]></title>
      <link>http://feedproxy.google.com/~r/phpfreaks/tutorials/~3/CIAbmpKW5PI/simple-sql-search</link>
      <guid isPermaLink="false">http://www.phpfreaks.com/tutorial/simple-sql-search</guid>
      <description>&lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;
Often I see many posts about how to do a simple SQL search. Well I finally caved in and decided to write a tutorial just for that. I will try and explain everything in as much detail as I can without being over wordy. This is a basic search, nothing more. If you want a more advanced search I would suggest using Google or hiring someone to code it for you. &lt;/p&gt;
&lt;p&gt;The aim of this tutorial is to provide users with a basic layout and the logic behind creating a multiple field search in MySQL. As often time users tend to over do the search and add a lot of unnecessary code. By following and understanding this tutorial you should be able to implement this search into your own site and provide a nice and simple SQL Search of your own database.  So roll up your sleeves and be prepared to get dirty.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Setting Up&lt;/b&gt;&lt;br /&gt;
First I will assume that you have a valid installation of PHP, Apache (or IIS) and MySQL installed and already working on your system. I will also expect you to know how to create the table structure provided and add the data to it in MySQL. I will not go through the trouble of how to do that, you can find yourself a basic MySQL/PHP Tutorial and follow that. &lt;/p&gt;
&lt;p&gt;And now for the SQL test data:&lt;br /&gt;
&lt;b&gt;Table Structure:&lt;/b&gt;&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;Create&amp;nbsp;table&amp;nbsp;simple_search&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sid&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;auto_increment,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;stitle&amp;nbsp;VARCHAR(50)&amp;nbsp;NOT&amp;nbsp;NULL,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdescription&amp;nbsp;VARCHAR(255)&amp;nbsp;NOT&amp;nbsp;NULL,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sbody&amp;nbsp;text&amp;nbsp;NOT&amp;nbsp;NULL,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;primary&amp;nbsp;key&amp;nbsp;(`sid`),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INDEX&amp;nbsp;(`stitle`),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;INDEX(`sdescription`)&lt;/li&gt;&lt;li&gt;);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;Test Data:&lt;/b&gt;&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;INSERT&amp;nbsp;INTO&amp;nbsp;simple_search&amp;nbsp;(`stitle`,&amp;nbsp;`sdescription`,&amp;nbsp;`sbody`)&amp;nbsp;VALUES&amp;nbsp;('Test&amp;nbsp;Simple&amp;nbsp;Search&amp;nbsp;1',&amp;nbsp;'This&amp;nbsp;is&amp;nbsp;a&amp;nbsp;test&amp;nbsp;result&amp;nbsp;for&amp;nbsp;our&amp;nbsp;MySQL&amp;nbsp;simple&amp;nbsp;search&amp;nbsp;tutorial.',&amp;nbsp;'MySQL&amp;nbsp;searching&amp;nbsp;is&amp;nbsp;a&amp;nbsp;valueable&amp;nbsp;item&amp;nbsp;to&amp;nbsp;be&amp;nbsp;used&amp;nbsp;in&amp;nbsp;coordination&amp;nbsp;with&amp;nbsp;PHP.&amp;nbsp;The&amp;nbsp;data&amp;nbsp;provided&amp;nbsp;here&amp;nbsp;will&amp;nbsp;be&amp;nbsp;easily&amp;nbsp;searchable&amp;nbsp;to&amp;nbsp;users.&amp;nbsp;Granted&amp;nbsp;it&amp;nbsp;will&amp;nbsp;only&amp;nbsp;provide&amp;nbsp;the&amp;nbsp;users&amp;nbsp;with&amp;nbsp;the&amp;nbsp;basic,&amp;nbsp;hence&amp;nbsp;simple,&amp;nbsp;search.'),&lt;/li&gt;&lt;li&gt;('Searching&amp;nbsp;Made&amp;nbsp;Easy&amp;nbsp;101',&amp;nbsp;'Searching&amp;nbsp;through&amp;nbsp;MySQL&amp;nbsp;sets&amp;nbsp;is&amp;nbsp;made&amp;nbsp;easy&amp;nbsp;in&amp;nbsp;PHP',&amp;nbsp;'PHP&amp;nbsp;provides&amp;nbsp;us&amp;nbsp;with&amp;nbsp;a&amp;nbsp;means&amp;nbsp;to&amp;nbsp;access&amp;nbsp;Relational&amp;nbsp;databases&amp;nbsp;with&amp;nbsp;ease.&amp;nbsp;Through&amp;nbsp;the&amp;nbsp;functions&amp;nbsp;that&amp;nbsp;are&amp;nbsp;provided&amp;nbsp;a&amp;nbsp;user&amp;nbsp;is&amp;nbsp;able&amp;nbsp;to&amp;nbsp;create&amp;nbsp;a&amp;nbsp;form&amp;nbsp;and&amp;nbsp;allow&amp;nbsp;their&amp;nbsp;clients&amp;nbsp;to&amp;nbsp;browse&amp;nbsp;through&amp;nbsp;postings&amp;nbsp;that&amp;nbsp;other\'s&amp;nbsp;have&amp;nbsp;posted&amp;nbsp;and&amp;nbsp;find&amp;nbsp;relevant&amp;nbsp;articles&amp;nbsp;to&amp;nbsp;their&amp;nbsp;searches.&amp;nbsp;Because&amp;nbsp;this&amp;nbsp;is&amp;nbsp;a&amp;nbsp;search&amp;nbsp;made&amp;nbsp;easy&amp;nbsp;it&amp;nbsp;will&amp;nbsp;not&amp;nbsp;be&amp;nbsp;exact&amp;nbsp;or&amp;nbsp;concise&amp;nbsp;instead&amp;nbsp;pull&amp;nbsp;up&amp;nbsp;a&amp;nbsp;catch&amp;nbsp;all&amp;nbsp;to&amp;nbsp;the&amp;nbsp;terms&amp;nbsp;searched.'),&lt;/li&gt;&lt;li&gt;('Gateway&amp;nbsp;to&amp;nbsp;Information',&amp;nbsp;'The&amp;nbsp;web&amp;nbsp;provides&amp;nbsp;us&amp;nbsp;with&amp;nbsp;many&amp;nbsp;tools&amp;nbsp;to&amp;nbsp;access&amp;nbsp;loads&amp;nbsp;of&amp;nbsp;information&amp;nbsp;that&amp;nbsp;are&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;a&amp;nbsp;database&amp;nbsp;on&amp;nbsp;our&amp;nbsp;server.',&amp;nbsp;'Storing&amp;nbsp;information&amp;nbsp;on&amp;nbsp;your&amp;nbsp;server&amp;nbsp;is&amp;nbsp;a&amp;nbsp;great&amp;nbsp;way&amp;nbsp;to&amp;nbsp;provide&amp;nbsp;clients&amp;nbsp;with&amp;nbsp;different&amp;nbsp;information.&amp;nbsp;A&amp;nbsp;client&amp;nbsp;can&amp;nbsp;now&amp;nbsp;find&amp;nbsp;information&amp;nbsp;they&amp;nbsp;were&amp;nbsp;looking&amp;nbsp;for&amp;nbsp;all&amp;nbsp;In&amp;nbsp;one&amp;nbsp;place.&amp;nbsp;Utilizing&amp;nbsp;a&amp;nbsp;scripting&amp;nbsp;language&amp;nbsp;often&amp;nbsp;makes&amp;nbsp;access&amp;nbsp;to&amp;nbsp;this&amp;nbsp;data&amp;nbsp;easier&amp;nbsp;and&amp;nbsp;provides&amp;nbsp;the&amp;nbsp;server&amp;nbsp;owner&amp;nbsp;with&amp;nbsp;a&amp;nbsp;means&amp;nbsp;to&amp;nbsp;backup&amp;nbsp;extreme&amp;nbsp;amounts&amp;nbsp;of&amp;nbsp;data&amp;nbsp;with&amp;nbsp;ease.&amp;nbsp;Not&amp;nbsp;to&amp;nbsp;mention&amp;nbsp;access&amp;nbsp;that&amp;nbsp;data.'),&lt;/li&gt;&lt;li&gt;('The&amp;nbsp;Gaming&amp;nbsp;World&amp;nbsp;as&amp;nbsp;we&amp;nbsp;Know&amp;nbsp;it',&amp;nbsp;'The&amp;nbsp;gaming&amp;nbsp;world&amp;nbsp;as&amp;nbsp;we&amp;nbsp;know&amp;nbsp;it&amp;nbsp;has&amp;nbsp;undergone&amp;nbsp;many&amp;nbsp;changes&amp;nbsp;in&amp;nbsp;the&amp;nbsp;past.&amp;nbsp;But&amp;nbsp;what&amp;nbsp;changes&amp;nbsp;lay&amp;nbsp;in&amp;nbsp;the&amp;nbsp;future?',&amp;nbsp;'Some&amp;nbsp;say&amp;nbsp;the&amp;nbsp;future&amp;nbsp;of&amp;nbsp;gaming&amp;nbsp;on&amp;nbsp;computers&amp;nbsp;relies&amp;nbsp;in&amp;nbsp;a&amp;nbsp;virtual&amp;nbsp;reality,&amp;nbsp;but&amp;nbsp;not&amp;nbsp;like&amp;nbsp;the&amp;nbsp;80\'s&amp;nbsp;virtual&amp;nbsp;reality.&amp;nbsp;This&amp;nbsp;new&amp;nbsp;virtual&amp;nbsp;reality&amp;nbsp;allows&amp;nbsp;the&amp;nbsp;user&amp;nbsp;to&amp;nbsp;use&amp;nbsp;their&amp;nbsp;mind&amp;nbsp;to&amp;nbsp;control&amp;nbsp;elements&amp;nbsp;of&amp;nbsp;a&amp;nbsp;video&amp;nbsp;game,&amp;nbsp;vs&amp;nbsp;using&amp;nbsp;a&amp;nbsp;controller.&amp;nbsp;This&amp;nbsp;new&amp;nbsp;aspect&amp;nbsp;of&amp;nbsp;gaming&amp;nbsp;will&amp;nbsp;put&amp;nbsp;the&amp;nbsp;user&amp;nbsp;right&amp;nbsp;in&amp;nbsp;to&amp;nbsp;the&amp;nbsp;game&amp;nbsp;by&amp;nbsp;providing&amp;nbsp;a&amp;nbsp;more&amp;nbsp;efficient&amp;nbsp;way&amp;nbsp;of&amp;nbsp;controlling&amp;nbsp;their&amp;nbsp;character.&amp;nbsp;How&amp;nbsp;long&amp;nbsp;before&amp;nbsp;this&amp;nbsp;technology&amp;nbsp;is&amp;nbsp;readily&amp;nbsp;available,&amp;nbsp;no&amp;nbsp;body&amp;nbsp;knows.&amp;nbsp;But&amp;nbsp;the&amp;nbsp;gaming&amp;nbsp;world&amp;nbsp;as&amp;nbsp;we&amp;nbsp;know&amp;nbsp;it&amp;nbsp;is&amp;nbsp;changing&amp;nbsp;rapidly&amp;nbsp;and&amp;nbsp;only&amp;nbsp;time&amp;nbsp;will&amp;nbsp;tell&amp;nbsp;when&amp;nbsp;this&amp;nbsp;great&amp;nbsp;feature&amp;nbsp;will&amp;nbsp;be&amp;nbsp;added&amp;nbsp;to&amp;nbsp;the&amp;nbsp;next&amp;nbsp;gaming&amp;nbsp;console.'),&lt;/li&gt;&lt;li&gt;('Hundreds&amp;nbsp;of&amp;nbsp;Ants&amp;nbsp;Attacking',&amp;nbsp;'Hundreds,&amp;nbsp;if&amp;nbsp;not&amp;nbsp;thousands&amp;nbsp;of&amp;nbsp;Ants&amp;nbsp;are&amp;nbsp;starting&amp;nbsp;to&amp;nbsp;rage&amp;nbsp;war&amp;nbsp;against&amp;nbsp;the&amp;nbsp;human&amp;nbsp;race.&amp;nbsp;Can&amp;nbsp;we&amp;nbsp;stop&amp;nbsp;it?',&amp;nbsp;'In&amp;nbsp;recent&amp;nbsp;news,&amp;nbsp;Ants&amp;nbsp;have&amp;nbsp;been&amp;nbsp;found&amp;nbsp;to&amp;nbsp;attack&amp;nbsp;random&amp;nbsp;people.&amp;nbsp;A&amp;nbsp;mom&amp;nbsp;in&amp;nbsp;Brazil&amp;nbsp;reported&amp;nbsp;that&amp;nbsp;her&amp;nbsp;child&amp;nbsp;was&amp;nbsp;just&amp;nbsp;playing&amp;nbsp;nicely&amp;nbsp;outside&amp;nbsp;when&amp;nbsp;an&amp;nbsp;Ant&amp;nbsp;decided&amp;nbsp;to&amp;nbsp;go&amp;nbsp;and&amp;nbsp;bite&amp;nbsp;her.&amp;nbsp;The&amp;nbsp;mom&amp;nbsp;reported&amp;nbsp;this&amp;nbsp;incident&amp;nbsp;to&amp;nbsp;the&amp;nbsp;police&amp;nbsp;immediately,&amp;nbsp;but&amp;nbsp;as&amp;nbsp;was&amp;nbsp;told,&amp;nbsp;the&amp;nbsp;police&amp;nbsp;were&amp;nbsp;busy&amp;nbsp;with&amp;nbsp;nearly&amp;nbsp;two&amp;nbsp;dozen&amp;nbsp;other&amp;nbsp;Ant&amp;nbsp;related&amp;nbsp;reports.&amp;nbsp;&amp;quot;I&amp;nbsp;was&amp;nbsp;scared&amp;nbsp;for&amp;nbsp;my&amp;nbsp;childs&amp;nbsp;life&amp;quot;&amp;nbsp;report&amp;nbsp;Janet&amp;nbsp;Marget&amp;nbsp;from&amp;nbsp;Pawtucket,&amp;nbsp;IL.&amp;nbsp;&amp;quot;The&amp;nbsp;ant&amp;nbsp;just&amp;nbsp;came&amp;nbsp;running&amp;nbsp;out&amp;nbsp;of&amp;nbsp;the&amp;nbsp;bushes&amp;nbsp;and&amp;nbsp;charged&amp;nbsp;me,&amp;nbsp;I&amp;nbsp;nearly&amp;nbsp;escaped&amp;nbsp;by&amp;nbsp;stamping&amp;nbsp;hard&amp;nbsp;on&amp;nbsp;the&amp;nbsp;ground&amp;nbsp;and&amp;nbsp;crushing&amp;nbsp;the&amp;nbsp;ant.&amp;quot;&amp;nbsp;While&amp;nbsp;some&amp;nbsp;are&amp;nbsp;over&amp;nbsp;come&amp;nbsp;by&amp;nbsp;fear,&amp;nbsp;others&amp;nbsp;are&amp;nbsp;embracing&amp;nbsp;the&amp;nbsp;new&amp;nbsp;&amp;quot;regime&amp;quot;&amp;nbsp;as&amp;nbsp;it&amp;nbsp;is&amp;nbsp;being&amp;nbsp;called.&amp;nbsp;Jack&amp;nbsp;Oldswell&amp;nbsp;said,&amp;nbsp;&amp;quot;I&amp;nbsp;welcome&amp;nbsp;the&amp;nbsp;ants&amp;nbsp;to&amp;nbsp;take&amp;nbsp;over.&amp;nbsp;I&amp;nbsp;mean&amp;nbsp;come&amp;nbsp;on,&amp;nbsp;with&amp;nbsp;ants&amp;nbsp;out&amp;nbsp;numbering&amp;nbsp;humans,&amp;nbsp;millions&amp;nbsp;if&amp;nbsp;not&amp;nbsp;billions&amp;nbsp;to&amp;nbsp;one,&amp;nbsp;they&amp;nbsp;have&amp;nbsp;the&amp;nbsp;numbers.&amp;quot;.&amp;nbsp;This&amp;nbsp;pandemic&amp;nbsp;has&amp;nbsp;caused&amp;nbsp;quite&amp;nbsp;a&amp;nbsp;stir&amp;nbsp;in&amp;nbsp;the&amp;nbsp;government&amp;nbsp;agencies&amp;nbsp;who&amp;nbsp;have&amp;nbsp;set&amp;nbsp;up&amp;nbsp;a&amp;nbsp;task&amp;nbsp;force&amp;nbsp;to&amp;nbsp;go&amp;nbsp;and&amp;nbsp;do&amp;nbsp;recon&amp;nbsp;on&amp;nbsp;Ant&amp;nbsp;colonies.&amp;nbsp;Unfortunately,&amp;nbsp;in&amp;nbsp;this&amp;nbsp;line&amp;nbsp;of&amp;nbsp;work,&amp;nbsp;every&amp;nbsp;employee&amp;nbsp;has&amp;nbsp;been&amp;nbsp;bitten&amp;nbsp;by&amp;nbsp;multiple&amp;nbsp;ants&amp;nbsp;and&amp;nbsp;this&amp;nbsp;line&amp;nbsp;of&amp;nbsp;work&amp;nbsp;is&amp;nbsp;highly&amp;nbsp;dangerous.&amp;nbsp;As&amp;nbsp;such&amp;nbsp;the&amp;nbsp;government&amp;nbsp;raised&amp;nbsp;the&amp;nbsp;employees&amp;nbsp;salary&amp;nbsp;to&amp;nbsp;three&amp;nbsp;times&amp;nbsp;the&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;a&amp;nbsp;normal&amp;nbsp;persons&amp;nbsp;salary.&amp;nbsp;As&amp;nbsp;for&amp;nbsp;this&amp;nbsp;lowly&amp;nbsp;reporter,&amp;nbsp;I&amp;nbsp;welcome&amp;nbsp;the&amp;nbsp;ants&amp;nbsp;and&amp;nbsp;offer&amp;nbsp;them&amp;nbsp;this&amp;nbsp;statement&amp;nbsp;so&amp;nbsp;that&amp;nbsp;they&amp;nbsp;might&amp;nbsp;spare&amp;nbsp;me&amp;nbsp;and&amp;nbsp;save&amp;nbsp;my&amp;nbsp;life&amp;nbsp;when&amp;nbsp;they&amp;nbsp;rule&amp;nbsp;the&amp;nbsp;planet.');&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;Database Connection&lt;/b&gt;&lt;br /&gt;
Now that we have our data entered into MySQL and made sure our PHP Server works it is time to start writing code. I would recommend a decent PHP Editor, Notepad++ for a simple project like this, or for a major project I would choose NetBeans IDE. Those are just the editors I recommend, feel free to choose whichever editor you are comfortable with. Now onto the code.&lt;/p&gt;
&lt;p&gt;First up, we have to make a connection to the database. Since MySQLi is not on servers with a PHP version &amp;lt; 5 I will use MySQL to write out the database connections. &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;$dbHost&amp;nbsp;=&amp;nbsp;'localhost';&amp;nbsp;//&amp;nbsp;localhost&amp;nbsp;will&amp;nbsp;be&amp;nbsp;used&amp;nbsp;in&amp;nbsp;most&amp;nbsp;cases&lt;/li&gt;&lt;li&gt;//&amp;nbsp;set&amp;nbsp;these&amp;nbsp;to&amp;nbsp;your&amp;nbsp;mysql&amp;nbsp;database&amp;nbsp;username&amp;nbsp;and&amp;nbsp;password.&lt;/li&gt;&lt;li&gt;$dbUser&amp;nbsp;=&amp;nbsp;'searchuser';&amp;nbsp;&lt;/li&gt;&lt;li&gt;$dbPass&amp;nbsp;=&amp;nbsp;'searchpass';&lt;/li&gt;&lt;li&gt;$dbDatabase&amp;nbsp;=&amp;nbsp;'searchdb';&amp;nbsp;//&amp;nbsp;the&amp;nbsp;database&amp;nbsp;you&amp;nbsp;put&amp;nbsp;the&amp;nbsp;table&amp;nbsp;into.&lt;/li&gt;&lt;li&gt;$con&amp;nbsp;=&amp;nbsp;mysql_connect($dbHost,&amp;nbsp;$dbUser,&amp;nbsp;$dbPass)&amp;nbsp;or&amp;nbsp;die(&amp;quot;Failed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;MySQL&amp;nbsp;Server.&amp;nbsp;Error:&amp;nbsp;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error());&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;mysql_select_db($dbDatabase)&amp;nbsp;or&amp;nbsp;die(&amp;quot;Failed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;database&amp;nbsp;{$dbDatabase}.&amp;nbsp;Error:&amp;nbsp;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error());&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Remember to change the $dbUser, $dbPass, $dbDatabase and $dbHost to the values of your database. If you do not the script will error out and tell you what is wrong. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Search Form&lt;/b&gt;&lt;br /&gt;
Now we have the database connection setup we need to setup our actual form code:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;html&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;My&amp;nbsp;Simple&amp;nbsp;Search&amp;nbsp;Form&amp;lt;/title&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style&amp;nbsp;type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#error&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;red;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;(count($error)&amp;nbsp;&amp;gt;&amp;nbsp;0)?&amp;quot;The&amp;nbsp;following&amp;nbsp;had&amp;nbsp;errors:&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;span&amp;nbsp;id=\&amp;quot;error\&amp;quot;&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;implode(&amp;quot;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;,&amp;nbsp;$error)&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;:&amp;quot;&amp;quot;;&amp;nbsp;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form&amp;nbsp;method=&amp;quot;GET&amp;quot;&amp;nbsp;action=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;$_SERVER['PHP_SELF'];?&amp;gt;&amp;quot;&amp;nbsp;name=&amp;quot;searchForm&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Search&amp;nbsp;For:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;text&amp;quot;&amp;nbsp;name=&amp;quot;search&amp;quot;&amp;nbsp;value=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($searchTerms)?$searchTerms:'';&amp;nbsp;?&amp;gt;&amp;quot;&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Search&amp;nbsp;In:&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Body:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;body&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['body'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;nbsp;|&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Title:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;title&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['title'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;nbsp;|&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Description:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;desc&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['desc'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Match&amp;nbsp;All&amp;nbsp;Selected&amp;nbsp;Fields?&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;matchall&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['matchall'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;submit&amp;quot;&amp;nbsp;name=&amp;quot;submit&amp;quot;&amp;nbsp;value=&amp;quot;Search!&amp;quot;&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;(count($results)&amp;nbsp;&amp;gt;&amp;nbsp;0)?&amp;quot;Your&amp;nbsp;search&amp;nbsp;term:&amp;nbsp;{$searchTerms}&amp;nbsp;returned:&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;implode(&amp;quot;&amp;quot;,&amp;nbsp;$results):&amp;quot;&amp;quot;;&amp;nbsp;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You will notice that this is a simple form, no formatting. The PHP is mixed in with it. If you do not know, the ? and : are &lt;a href="http://www.php.net/ternary"&gt;ternary operators&lt;/a&gt; which act like a short If/else statement. &lt;/p&gt;
&lt;p&gt;Example: &lt;tt&gt;(condition is true/false) (then ?) do this (else : ) do that.&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;If you want to read more on HTML Forms, &lt;a href="http://www.google.com/search?q=HTML+Forms"&gt;google&lt;/a&gt; it. What we are doing with the form code is checking different variables. First off, we see if there was an error by counting the error array. (This part of the code comes later). If there was an error, show the error to the users so they can fix it. Next we have different variables being echo'd. The first simply points the form to the search page for submission. The next are items that were previously on the form if they contain values. Should be pretty straight forward.&lt;/p&gt;
&lt;p&gt;Finally we check to see if the $results &lt;a href="http://php.net/array"&gt;array&lt;/a&gt; has any items. If the results array does, then we will display those results to the user along with the search terms that were used to grab these results. So now you hopefully understand the form and why the code is how it is. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Search Code&lt;/b&gt;&lt;br /&gt;
Next step is the actual PHP code for the search:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;our&amp;nbsp;error&amp;nbsp;check&amp;nbsp;and&amp;nbsp;result&amp;nbsp;check&amp;nbsp;array&lt;/li&gt;&lt;li&gt;$error&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;$results&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;First&amp;nbsp;check&amp;nbsp;if&amp;nbsp;a&amp;nbsp;form&amp;nbsp;was&amp;nbsp;submitted.&amp;nbsp;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Since&amp;nbsp;this&amp;nbsp;is&amp;nbsp;a&amp;nbsp;search&amp;nbsp;we&amp;nbsp;will&amp;nbsp;use&amp;nbsp;$_GET&lt;/li&gt;&lt;li&gt;if&amp;nbsp;(isset($_GET['search']))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTerms&amp;nbsp;=&amp;nbsp;trim($_GET['search']);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTerms&amp;nbsp;=&amp;nbsp;strip_tags($searchTerms);&amp;nbsp;//&amp;nbsp;remove&amp;nbsp;any&amp;nbsp;html/javascript.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strlen($searchTerms)&amp;nbsp;&amp;lt;&amp;nbsp;3)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$error[]&amp;nbsp;=&amp;nbsp;&amp;quot;Search&amp;nbsp;terms&amp;nbsp;must&amp;nbsp;be&amp;nbsp;longer&amp;nbsp;than&amp;nbsp;3&amp;nbsp;characters.&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTermDB&amp;nbsp;=&amp;nbsp;mysql_real_escape_string($searchTerms);&amp;nbsp;//&amp;nbsp;prevent&amp;nbsp;sql&amp;nbsp;injection.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;If&amp;nbsp;there&amp;nbsp;are&amp;nbsp;no&amp;nbsp;errors,&amp;nbsp;lets&amp;nbsp;get&amp;nbsp;the&amp;nbsp;search&amp;nbsp;going.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(count($error)&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchSQL&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;sid,&amp;nbsp;sbody,&amp;nbsp;stitle,&amp;nbsp;sdescription&amp;nbsp;FROM&amp;nbsp;simple_search&amp;nbsp;WHERE&amp;nbsp;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;grab&amp;nbsp;the&amp;nbsp;search&amp;nbsp;types.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['body'])?&amp;quot;`sbody`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['title'])?&amp;quot;`stitle`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['desc'])?&amp;quot;`sdescription`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types&amp;nbsp;=&amp;nbsp;array_filter($types,&amp;nbsp;&amp;quot;removeEmpty&amp;quot;);&amp;nbsp;//&amp;nbsp;removes&amp;nbsp;any&amp;nbsp;item&amp;nbsp;that&amp;nbsp;was&amp;nbsp;empty&amp;nbsp;(not&amp;nbsp;checked)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(count($types)&amp;nbsp;&amp;lt;&amp;nbsp;1)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;&amp;quot;`sbody`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;;&amp;nbsp;//&amp;nbsp;use&amp;nbsp;the&amp;nbsp;body&amp;nbsp;as&amp;nbsp;a&amp;nbsp;default&amp;nbsp;search&amp;nbsp;if&amp;nbsp;none&amp;nbsp;are&amp;nbsp;checked&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$andOr&amp;nbsp;=&amp;nbsp;isset($_GET['matchall'])?'AND':'OR';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchSQL&amp;nbsp;.=&amp;nbsp;implode(&amp;quot;&amp;nbsp;{$andOr}&amp;nbsp;&amp;quot;,&amp;nbsp;$types)&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;`stitle`&amp;quot;;&amp;nbsp;//&amp;nbsp;order&amp;nbsp;by&amp;nbsp;title.&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchResult&amp;nbsp;=&amp;nbsp;mysql_query($searchSQL)&amp;nbsp;or&amp;nbsp;die(&amp;quot;There&amp;nbsp;was&amp;nbsp;an&amp;nbsp;error.&amp;lt;br/&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error()&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;lt;br&amp;nbsp;/&amp;gt;SQL&amp;nbsp;Was:&amp;nbsp;{$searchSQL}&amp;quot;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mysql_num_rows($searchResult)&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$error[]&amp;nbsp;=&amp;nbsp;&amp;quot;The&amp;nbsp;search&amp;nbsp;term&amp;nbsp;provided&amp;nbsp;{$searchTerms}&amp;nbsp;yielded&amp;nbsp;no&amp;nbsp;results.&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$results&amp;nbsp;=&amp;nbsp;array();&amp;nbsp;//&amp;nbsp;the&amp;nbsp;result&amp;nbsp;array&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$i&amp;nbsp;=&amp;nbsp;1;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;($row&amp;nbsp;=&amp;nbsp;mysql_fetch_assoc($searchResult))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$results[]&amp;nbsp;=&amp;nbsp;&amp;quot;{$i}:&amp;nbsp;{$row['stitle']}&amp;lt;br&amp;nbsp;/&amp;gt;{$row['sdescription']}&amp;lt;br&amp;nbsp;/&amp;gt;{$row['sbody']}&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$i++;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;function&amp;nbsp;removeEmpty($var)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(!empty($var));&amp;nbsp;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Although the code may look &amp;quot;complex&amp;quot; it really is not. First we start off by defining our arrays for errors and results. This will prevent any errors from coming of error or results not being an array, because we defined them as an array already. &lt;/p&gt;
&lt;p&gt;Next we test to see if the form was submitted by checking to see if &amp;quot;search&amp;quot; was populated. This will prevent issues from occurring in case this is the first page load. &lt;a href="http://www.php.net/trim"&gt;Trimming&lt;/a&gt; the value of the form search will gurantee that it will not search for white spaces at the beginning or end of the terms. &lt;a href="http://www.php.net/strip_tags"&gt;Stripping the tags&lt;/a&gt; will remove any HTML code present (you may want to omit this, it depends on what your need is). Finally we do some validation checks to make sure that some terms were actually passed through and that they contained &lt;a href="http://www.php.net/strlen"&gt;enough characters&lt;/a&gt; to not return everything.&lt;/p&gt;
&lt;p&gt;Once we are passed the validation it is time to take a precautionary measure by sanitizing our data with &lt;a href="http://www.php.net/mysql_real_escape_string"&gt;mysql_real_escape_string&lt;/a&gt; for database input to prevent &lt;a href="http://en.wikipedia.org/wiki/Sql_injection"&gt;SQL Injection&lt;/a&gt; from occurring.  Next we will setup our SQL statement. We start out by defining the statement. Next we setup an array for types, this is because the search can be done on multiple fields. By setting up the search this way you just need the user to select a checkbox and those fields will be included in the search. Once we have populated the types array we want to remove any of the types that were not populated. This is being done by the function removeEmpty() which is custom defined. The removeEmpty function in use with &lt;a href="http://www.php.net/array_filter"&gt;array_filter&lt;/a&gt; will go through each item in the array and test if that item has a value using &lt;a href="http://www.php.net/empty"&gt;empty&lt;/a&gt;. If not it removes it from the array, which makes less code and work for us. The filtering of the array is to prevent a whitespace being used as a condition and returning everything. &lt;/p&gt;
&lt;p&gt;Now if the types contained more than 1 item in the array, we can do our search. &lt;a href="http://www.php.net/implode"&gt;Imploding&lt;/a&gt; the array types will allow us to use our checkbox to see what the user wants matched. To do this we define a dynamic variable $andOr which changes depending on what the user selects. If that want it any one of the fields we use &amp;quot; OR &amp;quot; if they want it in all of the fields we use &amp;quot; AND &amp;quot; which ensures that we get the results the users want.  Finally we run the query and grab our results, populate the results array and viola. We have our search results!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The End Result&lt;/b&gt;&lt;br /&gt;
Put the script together and it will look something like this:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;/*****************************&lt;/li&gt;&lt;li&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;Simple&amp;nbsp;SQL&amp;nbsp;Search&amp;nbsp;Tutorial&amp;nbsp;by&amp;nbsp;premiso&lt;/li&gt;&lt;li&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved&amp;nbsp;to&amp;nbsp;PHPFreaks.&lt;/li&gt;&lt;li&gt;&amp;nbsp;******************************/&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;$dbHost&amp;nbsp;=&amp;nbsp;'localhost';&amp;nbsp;//&amp;nbsp;localhost&amp;nbsp;will&amp;nbsp;be&amp;nbsp;used&amp;nbsp;in&amp;nbsp;most&amp;nbsp;cases&lt;/li&gt;&lt;li&gt;//&amp;nbsp;set&amp;nbsp;these&amp;nbsp;to&amp;nbsp;your&amp;nbsp;mysql&amp;nbsp;database&amp;nbsp;username&amp;nbsp;and&amp;nbsp;password.&lt;/li&gt;&lt;li&gt;$dbUser&amp;nbsp;=&amp;nbsp;'searchuser';&amp;nbsp;&lt;/li&gt;&lt;li&gt;$dbPass&amp;nbsp;=&amp;nbsp;'searchpass';&lt;/li&gt;&lt;li&gt;$dbDatabase&amp;nbsp;=&amp;nbsp;'searchdb';&amp;nbsp;//&amp;nbsp;the&amp;nbsp;database&amp;nbsp;you&amp;nbsp;put&amp;nbsp;the&amp;nbsp;table&amp;nbsp;into.&lt;/li&gt;&lt;li&gt;$con&amp;nbsp;=&amp;nbsp;mysql_connect($dbHost,&amp;nbsp;$dbUser,&amp;nbsp;$dbPass)&amp;nbsp;or&amp;nbsp;die(&amp;quot;Failed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;MySQL&amp;nbsp;Server.&amp;nbsp;Error:&amp;nbsp;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error());&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;mysql_select_db($dbDatabase)&amp;nbsp;or&amp;nbsp;die(&amp;quot;Failed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;database&amp;nbsp;{$dbDatabase}.&amp;nbsp;Error:&amp;nbsp;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error());&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;our&amp;nbsp;error&amp;nbsp;check&amp;nbsp;and&amp;nbsp;result&amp;nbsp;check&amp;nbsp;array&lt;/li&gt;&lt;li&gt;$error&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;$results&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;First&amp;nbsp;check&amp;nbsp;if&amp;nbsp;a&amp;nbsp;form&amp;nbsp;was&amp;nbsp;submitted.&amp;nbsp;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Since&amp;nbsp;this&amp;nbsp;is&amp;nbsp;a&amp;nbsp;search&amp;nbsp;we&amp;nbsp;will&amp;nbsp;use&amp;nbsp;$_GET&lt;/li&gt;&lt;li&gt;if&amp;nbsp;(isset($_GET['search']))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTerms&amp;nbsp;=&amp;nbsp;trim($_GET['search']);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTerms&amp;nbsp;=&amp;nbsp;strip_tags($searchTerms);&amp;nbsp;//&amp;nbsp;remove&amp;nbsp;any&amp;nbsp;html/javascript.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(strlen($searchTerms)&amp;nbsp;&amp;lt;&amp;nbsp;3)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$error[]&amp;nbsp;=&amp;nbsp;&amp;quot;Search&amp;nbsp;terms&amp;nbsp;must&amp;nbsp;be&amp;nbsp;longer&amp;nbsp;than&amp;nbsp;3&amp;nbsp;characters.&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchTermDB&amp;nbsp;=&amp;nbsp;mysql_real_escape_string($searchTerms);&amp;nbsp;//&amp;nbsp;prevent&amp;nbsp;sql&amp;nbsp;injection.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;If&amp;nbsp;there&amp;nbsp;are&amp;nbsp;no&amp;nbsp;errors,&amp;nbsp;lets&amp;nbsp;get&amp;nbsp;the&amp;nbsp;search&amp;nbsp;going.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(count($error)&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchSQL&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;sid,&amp;nbsp;sbody,&amp;nbsp;stitle,&amp;nbsp;sdescription&amp;nbsp;FROM&amp;nbsp;simple_search&amp;nbsp;WHERE&amp;nbsp;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;grab&amp;nbsp;the&amp;nbsp;search&amp;nbsp;types.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types&amp;nbsp;=&amp;nbsp;array();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['body'])?&amp;quot;`sbody`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['title'])?&amp;quot;`stitle`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;isset($_GET['desc'])?&amp;quot;`sdescription`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;:'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types&amp;nbsp;=&amp;nbsp;array_filter($types,&amp;nbsp;&amp;quot;removeEmpty&amp;quot;);&amp;nbsp;//&amp;nbsp;removes&amp;nbsp;any&amp;nbsp;item&amp;nbsp;that&amp;nbsp;was&amp;nbsp;empty&amp;nbsp;(not&amp;nbsp;checked)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(count($types)&amp;nbsp;&amp;lt;&amp;nbsp;1)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$types[]&amp;nbsp;=&amp;nbsp;&amp;quot;`sbody`&amp;nbsp;LIKE&amp;nbsp;'%{$searchTermDB}%'&amp;quot;;&amp;nbsp;//&amp;nbsp;use&amp;nbsp;the&amp;nbsp;body&amp;nbsp;as&amp;nbsp;a&amp;nbsp;default&amp;nbsp;search&amp;nbsp;if&amp;nbsp;none&amp;nbsp;are&amp;nbsp;checked&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$andOr&amp;nbsp;=&amp;nbsp;isset($_GET['matchall'])?'AND':'OR';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchSQL&amp;nbsp;.=&amp;nbsp;implode(&amp;quot;&amp;nbsp;{$andOr}&amp;nbsp;&amp;quot;,&amp;nbsp;$types)&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;`stitle`&amp;quot;;&amp;nbsp;//&amp;nbsp;order&amp;nbsp;by&amp;nbsp;title.&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchResult&amp;nbsp;=&amp;nbsp;mysql_query($searchSQL)&amp;nbsp;or&amp;nbsp;die(&amp;quot;There&amp;nbsp;was&amp;nbsp;an&amp;nbsp;error.&amp;lt;br/&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;mysql_error()&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;lt;br&amp;nbsp;/&amp;gt;SQL&amp;nbsp;Was:&amp;nbsp;{$searchSQL}&amp;quot;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mysql_num_rows($searchResult)&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$error[]&amp;nbsp;=&amp;nbsp;&amp;quot;The&amp;nbsp;search&amp;nbsp;term&amp;nbsp;provided&amp;nbsp;{$searchTerms}&amp;nbsp;yielded&amp;nbsp;no&amp;nbsp;results.&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$results&amp;nbsp;=&amp;nbsp;array();&amp;nbsp;//&amp;nbsp;the&amp;nbsp;result&amp;nbsp;array&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$i&amp;nbsp;=&amp;nbsp;1;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;($row&amp;nbsp;=&amp;nbsp;mysql_fetch_assoc($searchResult))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$results[]&amp;nbsp;=&amp;nbsp;&amp;quot;{$i}:&amp;nbsp;{$row['stitle']}&amp;lt;br&amp;nbsp;/&amp;gt;{$row['sdescription']}&amp;lt;br&amp;nbsp;/&amp;gt;{$row['sbody']}&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$i++;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;function&amp;nbsp;removeEmpty($var)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(!empty($var));&amp;nbsp;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;html&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;My&amp;nbsp;Simple&amp;nbsp;Search&amp;nbsp;Form&amp;lt;/title&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style&amp;nbsp;type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#error&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;red;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;(count($error)&amp;nbsp;&amp;gt;&amp;nbsp;0)?&amp;quot;The&amp;nbsp;following&amp;nbsp;had&amp;nbsp;errors:&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;span&amp;nbsp;id=\&amp;quot;error\&amp;quot;&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;implode(&amp;quot;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;,&amp;nbsp;$error)&amp;nbsp;.&amp;nbsp;&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;:&amp;quot;&amp;quot;;&amp;nbsp;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form&amp;nbsp;method=&amp;quot;GET&amp;quot;&amp;nbsp;action=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;$_SERVER['PHP_SELF'];?&amp;gt;&amp;quot;&amp;nbsp;name=&amp;quot;searchForm&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Search&amp;nbsp;For:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;text&amp;quot;&amp;nbsp;name=&amp;quot;search&amp;quot;&amp;nbsp;value=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($searchTerms)?$searchTerms:'';&amp;nbsp;?&amp;gt;&amp;quot;&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Search&amp;nbsp;In:&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Body:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;body&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['body'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;nbsp;|&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Title:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;title&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['title'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;nbsp;|&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Description:&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;desc&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['desc'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Match&amp;nbsp;All&amp;nbsp;Selected&amp;nbsp;Fields?&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;matchall&amp;quot;&amp;nbsp;value=&amp;quot;on&amp;quot;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;isset($_GET['matchall'])?&amp;quot;checked&amp;quot;:'';&amp;nbsp;?&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type=&amp;quot;submit&amp;quot;&amp;nbsp;name=&amp;quot;submit&amp;quot;&amp;nbsp;value=&amp;quot;Search!&amp;quot;&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;(count($results)&amp;nbsp;&amp;gt;&amp;nbsp;0)?&amp;quot;Your&amp;nbsp;search&amp;nbsp;term:&amp;nbsp;{$searchTerms}&amp;nbsp;returned:&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;quot;&amp;nbsp;.&amp;nbsp;implode(&amp;quot;&amp;quot;,&amp;nbsp;$results):&amp;quot;&amp;quot;;&amp;nbsp;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And now we run the script and see the search results work their magic! Enjoy.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=CIAbmpKW5PI:LZCqA1hwOM0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=CIAbmpKW5PI:LZCqA1hwOM0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=CIAbmpKW5PI:LZCqA1hwOM0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=CIAbmpKW5PI:LZCqA1hwOM0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=CIAbmpKW5PI:LZCqA1hwOM0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=CIAbmpKW5PI:LZCqA1hwOM0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=CIAbmpKW5PI:LZCqA1hwOM0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=CIAbmpKW5PI:LZCqA1hwOM0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpfreaks/tutorials/~4/CIAbmpKW5PI" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 06 May 2009 21:50:36 +0000</pubDate>
      <comments>http://www.phpfreaks.com/tutorial/simple-sql-search#comments</comments>
    <feedburner:origLink>http://www.phpfreaks.com/tutorial/simple-sql-search</feedburner:origLink></item>
    <item>
      <title><![CDATA[PHP Add Text To Image]]></title>
      <link>http://feedproxy.google.com/~r/phpfreaks/tutorials/~3/jYYNg43afug/php-add-text-to-image</link>
      <guid isPermaLink="false">http://www.phpfreaks.com/tutorial/php-add-text-to-image</guid>
      <description>&lt;h1&gt;Dynamic Image Generation&lt;/h1&gt;&lt;h3&gt;Long and boring back-story....&lt;/h3&gt;&lt;p&gt;
One of the standard features of a message board is allowing members to have a signature, which is appended to the bottom of each post they make.  Posters can put whatever they want into the signature (within forum settings).  Putting quotes in one's signature is one of the more popular things to do.  &lt;/p&gt;
&lt;p&gt;A lot of people put in some motto they live by, some funny quote by some famous person, whatever.  Some people like to quote things other posters on the board have said.  I am one of those people.   I think it's fun and promotes a sense of belonging to the community.  &lt;/p&gt;
&lt;p&gt;I've been a member of the phpfreaks forum for a number of years now, and over the years, I have posted and come across quotes that were (to me, anyways) worth collecting.  But  having a bunch of quotes in a sig isn't very convenient.   &lt;/p&gt;
&lt;p&gt;So one day I got the bright idea to pick a random quote from my list and just display that.  Well most message boards (or websites in general, for that matter) will not let you just post script and parse it willy nilly for you.  Something to do with security or whatever blahblahblah translation: sites are uptight.&lt;/p&gt;
&lt;p&gt;But what most sites &lt;i&gt;will&lt;/i&gt; let you do, is post images.  One of the great things about php is that it comes with something called the GD library that lets you manipulate images in all sorts of ways.  And it will even let you output it as an image to a browser, so you can load a php file as if it were an actual image. &lt;/p&gt;
&lt;p&gt;Problem solved!  I decided to put the quotes I've collected into a database and write a script that picks a random one and creates an image out of it, tell the browser the content is an image and output the image, and blam! I get to post a random quote in my sig!&lt;/p&gt;
&lt;h3&gt;I weep for the future....&lt;/h3&gt;&lt;p&gt;
Soon afterwards, I started receiving messages on a fairly regular basis asking me &amp;quot;What kind of sorcery is this?? How do I do that??&amp;quot; You know, I think it's kind of funny people should ask, because this is really nothing new.  Remember back in the day when people made those stupid sig images that show &amp;quot;personal&amp;quot; info?&lt;/p&gt;
&lt;pre class="bbcode"&gt;************************************
*     Your IP is xxx.xxx.xx.xx     *
*       Your Host is blahblah      *
*        Your OS is windoze        *
* Your &amp;quot;Shoe Size&amp;quot; is 4 1/2 inches *
*      You &amp;quot;Bat&amp;quot; left handed       *
************************************&lt;/pre&gt;&lt;p&gt;On top of that,  this is pretty much the same principle as captcha verification on forms, which has been around for years now, and surely you all know what that is, right? And yet, here I am, writing a tutorial about it, because people are asking, so whatever.  &lt;/p&gt;
&lt;p&gt;This tutorial will not detail how to put quotes (or text in general) into a database or retrieve a random one.  You can learn all about basic database interaction in my basic database interaction tutorial.  Instead, I'm just going to hard-code a couple of random quotes into an array and pick a random one. &lt;/p&gt;
&lt;p&gt;Also, this tutorial is not going to show you how to do anything fancy, like wavy text, frilly borders, or get into distorting methods used in captcha images, etc...; we're going to make a gray background so you can see the image boundaries, and plain old run of the mill white text (to contrast the gray background).  I'm here to show you how to start.  Where you go from there is up to you. &lt;/p&gt;
&lt;p&gt;Code is that way ----------------&amp;gt;&lt;/p&gt;
&lt;h3&gt;Payment, Up Front&lt;/h3&gt;&lt;p&gt;Here is the complete script.  Copy and paste it.  Run it.  Be amazed.  My next trick will be to pull a quarter out of your ear.  &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Path&amp;nbsp;to&amp;nbsp;our&amp;nbsp;font&amp;nbsp;file&lt;/li&gt;&lt;li&gt;$font&amp;nbsp;=&amp;nbsp;'arial.ttf';&lt;/li&gt;&lt;li&gt;$fontsize&amp;nbsp;=&amp;nbsp;10;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;array&amp;nbsp;of&amp;nbsp;random&amp;nbsp;quotes&lt;/li&gt;&lt;li&gt;$quotes&amp;nbsp;=&amp;nbsp;array(&lt;/li&gt;&lt;li&gt;&amp;quot;Did&amp;nbsp;you&amp;nbsp;hear&amp;nbsp;about&amp;nbsp;the&amp;nbsp;guy&amp;nbsp;whose&amp;nbsp;whole&amp;nbsp;left&amp;nbsp;side&amp;nbsp;was&amp;nbsp;cut&amp;nbsp;off?&amp;nbsp;He's&amp;nbsp;all&amp;nbsp;right&amp;nbsp;now.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;There&amp;nbsp;was&amp;nbsp;a&amp;nbsp;sign&amp;nbsp;on&amp;nbsp;the&amp;nbsp;lawn&amp;nbsp;at&amp;nbsp;a&amp;nbsp;drug&amp;nbsp;re-hab&amp;nbsp;center&amp;nbsp;that&amp;nbsp;said&amp;nbsp;'Keep&amp;nbsp;off&amp;nbsp;the&amp;nbsp;Grass'.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Police&amp;nbsp;were&amp;nbsp;called&amp;nbsp;to&amp;nbsp;a&amp;nbsp;daycare&amp;nbsp;where&amp;nbsp;a&amp;nbsp;three-year-old&amp;nbsp;was&amp;nbsp;resisting&amp;nbsp;a&amp;nbsp;rest.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;A&amp;nbsp;hole&amp;nbsp;has&amp;nbsp;been&amp;nbsp;found&amp;nbsp;in&amp;nbsp;the&amp;nbsp;nudist&amp;nbsp;camp&amp;nbsp;wall.&amp;nbsp;The&amp;nbsp;police&amp;nbsp;are&amp;nbsp;looking&amp;nbsp;into&amp;nbsp;it.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;When&amp;nbsp;a&amp;nbsp;clock&amp;nbsp;is&amp;nbsp;hungry&amp;nbsp;it&amp;nbsp;goes&amp;nbsp;back&amp;nbsp;four&amp;nbsp;seconds.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Time&amp;nbsp;flies&amp;nbsp;like&amp;nbsp;an&amp;nbsp;arrow.&amp;nbsp;Fruit&amp;nbsp;flies&amp;nbsp;like&amp;nbsp;a&amp;nbsp;banana.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Local&amp;nbsp;Area&amp;nbsp;Network&amp;nbsp;in&amp;nbsp;Australia:&amp;nbsp;the&amp;nbsp;LAN&amp;nbsp;down&amp;nbsp;under.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Alcohol&amp;nbsp;and&amp;nbsp;calculus&amp;nbsp;don't&amp;nbsp;mix&amp;nbsp;so&amp;nbsp;don't&amp;nbsp;drink&amp;nbsp;and&amp;nbsp;derive.&amp;quot;);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;generate&amp;nbsp;a&amp;nbsp;random&amp;nbsp;number&amp;nbsp;with&amp;nbsp;range&amp;nbsp;of&amp;nbsp;#&amp;nbsp;of&amp;nbsp;array&amp;nbsp;elements&lt;/li&gt;&lt;li&gt;$pos&amp;nbsp;=&amp;nbsp;rand(0,count($quotes)-1);&lt;/li&gt;&lt;li&gt;//&amp;nbsp;get&amp;nbsp;the&amp;nbsp;quote&amp;nbsp;and&amp;nbsp;word&amp;nbsp;wrap&amp;nbsp;it&lt;/li&gt;&lt;li&gt;$quote&amp;nbsp;=&amp;nbsp;wordwrap($quotes[$pos],20);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;create&amp;nbsp;a&amp;nbsp;bounding&amp;nbsp;box&amp;nbsp;for&amp;nbsp;the&amp;nbsp;text&lt;/li&gt;&lt;li&gt;$dims&amp;nbsp;=&amp;nbsp;imagettfbbox($fontsize,&amp;nbsp;0,&amp;nbsp;$font,&amp;nbsp;$quote);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;make&amp;nbsp;some&amp;nbsp;easy&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;dimension&amp;nbsp;vars&amp;nbsp;from&amp;nbsp;the&amp;nbsp;results&amp;nbsp;of&amp;nbsp;imagettfbbox&lt;/li&gt;&lt;li&gt;//&amp;nbsp;since&amp;nbsp;positions&amp;nbsp;aren't&amp;nbsp;measures&amp;nbsp;in&amp;nbsp;1&amp;nbsp;to&amp;nbsp;whatever,&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&lt;/li&gt;&lt;li&gt;//&amp;nbsp;do&amp;nbsp;some&amp;nbsp;math&amp;nbsp;to&amp;nbsp;find&amp;nbsp;out&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;width&amp;nbsp;and&amp;nbsp;height&lt;/li&gt;&lt;li&gt;$width&amp;nbsp;=&amp;nbsp;$dims[4]&amp;nbsp;-&amp;nbsp;$dims[6];&amp;nbsp;//&amp;nbsp;upper-right&amp;nbsp;x&amp;nbsp;minus&amp;nbsp;upper-left&amp;nbsp;x&amp;nbsp;&lt;/li&gt;&lt;li&gt;$height&amp;nbsp;=&amp;nbsp;$dims[3]&amp;nbsp;-&amp;nbsp;$dims[5];&amp;nbsp;//&amp;nbsp;lower-right&amp;nbsp;y&amp;nbsp;minus&amp;nbsp;upper-right&amp;nbsp;y&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;Create&amp;nbsp;image&lt;/li&gt;&lt;li&gt;$image&amp;nbsp;=&amp;nbsp;imagecreatetruecolor($width,$height);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;pick&amp;nbsp;color&amp;nbsp;for&amp;nbsp;the&amp;nbsp;background&lt;/li&gt;&lt;li&gt;$bgcolor&amp;nbsp;=&amp;nbsp;imagecolorallocate($image,&amp;nbsp;100,&amp;nbsp;100,&amp;nbsp;100);&lt;/li&gt;&lt;li&gt;//&amp;nbsp;pick&amp;nbsp;color&amp;nbsp;for&amp;nbsp;the&amp;nbsp;text&lt;/li&gt;&lt;li&gt;$fontcolor&amp;nbsp;=&amp;nbsp;imagecolorallocate($image,&amp;nbsp;255,&amp;nbsp;255,&amp;nbsp;255);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;fill&amp;nbsp;in&amp;nbsp;the&amp;nbsp;background&amp;nbsp;with&amp;nbsp;the&amp;nbsp;background&amp;nbsp;color&lt;/li&gt;&lt;li&gt;imagefilledrectangle($image,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;$width,&amp;nbsp;$height,&amp;nbsp;$bgcolor);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;x,y&amp;nbsp;coords&amp;nbsp;for&amp;nbsp;imagettftext&amp;nbsp;defines&amp;nbsp;the&amp;nbsp;baseline&amp;nbsp;of&amp;nbsp;the&amp;nbsp;text:&amp;nbsp;the&amp;nbsp;lower-left&amp;nbsp;corner&lt;/li&gt;&lt;li&gt;//&amp;nbsp;so&amp;nbsp;the&amp;nbsp;x&amp;nbsp;coord&amp;nbsp;can&amp;nbsp;stay&amp;nbsp;as&amp;nbsp;0&amp;nbsp;but&amp;nbsp;you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;add&amp;nbsp;the&amp;nbsp;font&amp;nbsp;size&amp;nbsp;to&amp;nbsp;the&amp;nbsp;y&amp;nbsp;to&amp;nbsp;simulate&lt;/li&gt;&lt;li&gt;//&amp;nbsp;top&amp;nbsp;left&amp;nbsp;boundary&amp;nbsp;so&amp;nbsp;we&amp;nbsp;can&amp;nbsp;write&amp;nbsp;the&amp;nbsp;text&amp;nbsp;within&amp;nbsp;the&amp;nbsp;boundary&amp;nbsp;of&amp;nbsp;the&amp;nbsp;image&lt;/li&gt;&lt;li&gt;$x&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;/li&gt;&lt;li&gt;$y&amp;nbsp;=&amp;nbsp;$fontsize;&lt;/li&gt;&lt;li&gt;imagettftext($image,&amp;nbsp;$fontsize,&amp;nbsp;0,&amp;nbsp;$x,&amp;nbsp;$y,&amp;nbsp;$fontcolor,&amp;nbsp;$font,&amp;nbsp;$quote);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;tell&amp;nbsp;the&amp;nbsp;browser&amp;nbsp;that&amp;nbsp;the&amp;nbsp;content&amp;nbsp;is&amp;nbsp;an&amp;nbsp;image&lt;/li&gt;&lt;li&gt;header('Content-type:&amp;nbsp;image/png');&lt;/li&gt;&lt;li&gt;//&amp;nbsp;output&amp;nbsp;image&amp;nbsp;to&amp;nbsp;the&amp;nbsp;browser&lt;/li&gt;&lt;li&gt;imagepng($image);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;delete&amp;nbsp;the&amp;nbsp;image&amp;nbsp;resource&amp;nbsp;&lt;/li&gt;&lt;li&gt;imagedestroy($image);&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And to apply it, you would use a standard img tag (or img bbcode on a forum), pointing to the file as the source, like so:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;img&amp;nbsp;src='http://www.yoursite.com/yourscript.php'&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Hey...you said size doesn't matter!&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;Path&amp;nbsp;to&amp;nbsp;our&amp;nbsp;font&amp;nbsp;file&lt;/li&gt;&lt;li&gt;$font&amp;nbsp;=&amp;nbsp;'arial.ttf';&lt;/li&gt;&lt;li&gt;$fontsize&amp;nbsp;=&amp;nbsp;10;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;First we will decide what font to use and the font size.  How you do this will vary from setup to setup.  You may have to include a path/to/fontfile for fonts your server may or may not have installed (most hosts have a bunch of fonts pre-installed in some path or other).  It's up to you to figure out where that file is, and if the font you use is installed.  &lt;/p&gt;
&lt;p&gt;If you want to skip all that for now, the easiest hassle free thing to do is to upload your font into the same directory as your script, and the script will start by looking for it there.  You will have to do that for any font your host doesn't have, anyways, so may as well cut to the chase.  &lt;/p&gt;
&lt;p&gt;I chose plain old arial font, and a font size of 10, measured in inches..er...pixels. &lt;/p&gt;
&lt;h3&gt;..And the next randumb number is...&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;array&amp;nbsp;of&amp;nbsp;random&amp;nbsp;quotes&lt;/li&gt;&lt;li&gt;$quotes&amp;nbsp;=&amp;nbsp;array(&lt;/li&gt;&lt;li&gt;&amp;quot;Did&amp;nbsp;you&amp;nbsp;hear&amp;nbsp;about&amp;nbsp;the&amp;nbsp;guy&amp;nbsp;whose&amp;nbsp;whole&amp;nbsp;left&amp;nbsp;side&amp;nbsp;was&amp;nbsp;cut&amp;nbsp;off?&amp;nbsp;He's&amp;nbsp;all&amp;nbsp;right&amp;nbsp;now.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;There&amp;nbsp;was&amp;nbsp;a&amp;nbsp;sign&amp;nbsp;on&amp;nbsp;the&amp;nbsp;lawn&amp;nbsp;at&amp;nbsp;a&amp;nbsp;drug&amp;nbsp;re-hab&amp;nbsp;center&amp;nbsp;that&amp;nbsp;said&amp;nbsp;'Keep&amp;nbsp;off&amp;nbsp;the&amp;nbsp;Grass'.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Police&amp;nbsp;were&amp;nbsp;called&amp;nbsp;to&amp;nbsp;a&amp;nbsp;daycare&amp;nbsp;where&amp;nbsp;a&amp;nbsp;three-year-old&amp;nbsp;was&amp;nbsp;resisting&amp;nbsp;a&amp;nbsp;rest.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;A&amp;nbsp;hole&amp;nbsp;has&amp;nbsp;been&amp;nbsp;found&amp;nbsp;in&amp;nbsp;the&amp;nbsp;nudist&amp;nbsp;camp&amp;nbsp;wall.&amp;nbsp;The&amp;nbsp;police&amp;nbsp;are&amp;nbsp;looking&amp;nbsp;into&amp;nbsp;it.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;When&amp;nbsp;a&amp;nbsp;clock&amp;nbsp;is&amp;nbsp;hungry&amp;nbsp;it&amp;nbsp;goes&amp;nbsp;back&amp;nbsp;four&amp;nbsp;seconds.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Time&amp;nbsp;flies&amp;nbsp;like&amp;nbsp;an&amp;nbsp;arrow.&amp;nbsp;Fruit&amp;nbsp;flies&amp;nbsp;like&amp;nbsp;a&amp;nbsp;banana.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Local&amp;nbsp;Area&amp;nbsp;Network&amp;nbsp;in&amp;nbsp;Australia:&amp;nbsp;the&amp;nbsp;LAN&amp;nbsp;down&amp;nbsp;under.&amp;quot;,&lt;/li&gt;&lt;li&gt;&amp;quot;Alcohol&amp;nbsp;and&amp;nbsp;calculus&amp;nbsp;don't&amp;nbsp;mix&amp;nbsp;so&amp;nbsp;don't&amp;nbsp;drink&amp;nbsp;and&amp;nbsp;derive.&amp;quot;);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;$quotes is our array of random quotes.  Each position of the array is a string value containing a quote that has personal significance to me.  Okay not really.  But I love puns.  Who doesn't?   &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;generate&amp;nbsp;a&amp;nbsp;random&amp;nbsp;number&amp;nbsp;with&amp;nbsp;range&amp;nbsp;of&amp;nbsp;#&amp;nbsp;of&amp;nbsp;array&amp;nbsp;elements&lt;/li&gt;&lt;li&gt;$pos&amp;nbsp;=&amp;nbsp;rand(0,count($quotes)-1);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We need to pick a random quote from our list of quotes.  We can do this by finding out how many elements there are in the $quotes array, and pick a random number between 0 and that number - 1.   By default, array positions start at 0, so if there are (in this case) eight quotes, the array keys will be numbered from 0 to 7.  &lt;/p&gt;
&lt;p&gt;Since count($quotes) returns 8, since there are 8 quotes, we need to subtract 1 from it, so that we pick a random number between 0 and 7. &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;get&amp;nbsp;the&amp;nbsp;quote&amp;nbsp;and&amp;nbsp;word&amp;nbsp;wrap&amp;nbsp;it&lt;/li&gt;&lt;li&gt;$quote&amp;nbsp;=&amp;nbsp;wordwrap($quotes[$pos],20);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We then take that number and assign $quotes[$pos] to $quote.  So for instance, if $pos was assigned 5, $quote would be assigned:&lt;/p&gt;
&lt;p&gt;&amp;quot;Time flies like an arrow. Fruit flies like a banana.&amp;quot;&lt;/p&gt;
&lt;p&gt;So what's that wordwrap thing?  wordwrap() is not strictly necessary for this script.  You can remove it and the text will all be on one line.  The reason I included it here is because I know that someone will eventually ask how to break up the text so it doesn't make one long image, so I'm making a preemptive strike.  I learned it by watching my president.  &lt;/p&gt;
&lt;p&gt;wordwrap() accepts several arguments.  Only the first two are required, and conveniently, that's all we need in this situation, so that's all that's used.  The first argument is the string we want to break up, and the 2nd argument is how many characters we want to have on the line before we make a new line.  &lt;/p&gt;
&lt;p&gt;wordwrap() by default will not make a new line in the middle of a word.  If the character length reaches the cutoff and we're in the middle of the word, the entire word is put to the next line.  You can force wordwrap() to cut it off at exactly the cutoff point no matter what, by setting the optional 4th argument to true.  &lt;/p&gt;
&lt;p&gt;Also, by default, wordwrap() &amp;quot;breaks up&amp;quot; the string into new lines by inserting a '\n' after the cutoff point.  You can specify what is actually inserted at those points in the optional 3rd argument.  There are all kinds of crazy things you can use wordwrap() for that involve taking advantage of being able to specify what is inserted at the cut-off points, but that's a whole other topic of discussion.&lt;/p&gt;
&lt;h3&gt;One size fits all...?&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;create&amp;nbsp;our&amp;nbsp;bounding&amp;nbsp;box&amp;nbsp;for&amp;nbsp;the&amp;nbsp;first&amp;nbsp;text&lt;/li&gt;&lt;li&gt;$dims&amp;nbsp;=&amp;nbsp;imagettfbbox($fontsize,&amp;nbsp;0,&amp;nbsp;$font,&amp;nbsp;$quote);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In order to create an image, we need to create an image resource.  In order to do that, we need to tell php what size we want the image to be.  For the purposes of this tutorial, we want the image to be the same size as the text block we just created.  The GD Library provides a convenient way to figure out what the &amp;quot;borders&amp;quot; of our text block is: imagettfbbox(). &lt;/p&gt;
&lt;p&gt;imagettfbbox() calculates the boundaries of the text by making a bunch of weird and archaic calculations based off of things like the text's font size, the angle of the text (like, if we were to want the text to slant at some slope, instead of horizontal, as text is normally read), the font itself, and the text in question.  I think it just kind of eyeballs it, but it seems to work, so I'm not complaining.  &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;make&amp;nbsp;some&amp;nbsp;easy&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;dimension&amp;nbsp;vars&amp;nbsp;from&amp;nbsp;the&amp;nbsp;results&amp;nbsp;of&amp;nbsp;imagettfbbox&lt;/li&gt;&lt;li&gt;//&amp;nbsp;since&amp;nbsp;positions&amp;nbsp;aren't&amp;nbsp;measures&amp;nbsp;in&amp;nbsp;1&amp;nbsp;to&amp;nbsp;whatever,&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&lt;/li&gt;&lt;li&gt;//&amp;nbsp;do&amp;nbsp;some&amp;nbsp;math&amp;nbsp;to&amp;nbsp;find&amp;nbsp;out&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;width&amp;nbsp;and&amp;nbsp;height&lt;/li&gt;&lt;li&gt;$width&amp;nbsp;=&amp;nbsp;$dims[4]&amp;nbsp;-&amp;nbsp;$dims[6];&amp;nbsp;//&amp;nbsp;upper-right&amp;nbsp;x&amp;nbsp;minus&amp;nbsp;upper-left&amp;nbsp;x&amp;nbsp;&lt;/li&gt;&lt;li&gt;$height&amp;nbsp;=&amp;nbsp;$dims[3]&amp;nbsp;-&amp;nbsp;$dims[5];&amp;nbsp;//&amp;nbsp;lower-right&amp;nbsp;y&amp;nbsp;minus&amp;nbsp;upper-right&amp;nbsp;y&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Unfortunately, imagettfbbox() doesn't just tell you &amp;quot;Hey, this is the width and this is the height,&amp;quot; so we need to figure that out on our own.  imagettfbbox() returns an array of different numbers.  8 numbers, to be exact.  Each one represents an x,y coordinate for the corners of the text 'boundary'.  You can refer to the manual for which array elements refer to which coords.  I commented the ones I used, here.&lt;/p&gt;
&lt;p&gt;Ideally, all we should need is the bottom left corner, but for some reason the numbers don't quite work out that way.  Lower boundaries come back as 0's or -1's, upper boundaries come back a few pixels short; who knows why.  Who cares (I'm sure someone does, and I'm sure they'll eventually post a comment about it, and to that person, I say thanks for clearing that up! &amp;lt;coughnerdcoughcough&amp;gt;).  &lt;/p&gt;
&lt;p&gt;Fortunately, we can nonetheless work with those numbers.  We just need to subtract a left x from a right x, and a top y from a bottom y.  We'll assign the results in easy to use variables $width and $height, and we're good to go. &lt;/p&gt;
&lt;h3&gt;A picture is worth a thousand words...&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;Create&amp;nbsp;image&lt;/li&gt;&lt;li&gt;$image&amp;nbsp;=&amp;nbsp;imagecreatetruecolor($width,$height);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Okay now we need to create an image resource.  It's basically like a canvas: something to paint the picture on, so to speak.  Think of it as opening up your favorite paint program, telling it that you want to create a new picture of x,y size.  You start it up, paint little stick figures, and eventually save it to a file.  Well, the image resource is basically what your masterpiece is, before you save it; the thing in memory the computer messes around with every time you make a change to the picture.  &lt;/p&gt;
&lt;p&gt;imagecreatetruecolor basically tells php that we want to work with a canvas x width and y height big.  We use the width and height of our text boundary we figured out earlier.  &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;pick&amp;nbsp;color&amp;nbsp;for&amp;nbsp;the&amp;nbsp;background&lt;/li&gt;&lt;li&gt;$bgcolor&amp;nbsp;=&amp;nbsp;imagecolorallocate($image,&amp;nbsp;100,&amp;nbsp;100,&amp;nbsp;100);&lt;/li&gt;&lt;li&gt;//&amp;nbsp;pick&amp;nbsp;color&amp;nbsp;for&amp;nbsp;the&amp;nbsp;text&lt;/li&gt;&lt;li&gt;$fontcolor&amp;nbsp;=&amp;nbsp;imagecolorallocate($image,&amp;nbsp;255,&amp;nbsp;255,&amp;nbsp;255);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The next thing we want to do is select what colors we want to use.  It's like when you are in your paint program, and you choose the color you want to use.  You aren't actually using it yet, you're just selecting it.  That's what we are doing here, except we are storing our choices in variables.  We want one color for our background, and one for our font color.  &lt;/p&gt;
&lt;p&gt;The first argument for imagecolorallocate is the image resource we just created.  The next 3 arguments is the red, green, and blue (rgb) values of the color, specified as a 0 to 255 integer (for each one).  0,0,0 means no color intensity, which is a fancy way of saying black.  255,255,255 is full color intensity, or white.  100,100,100 is some random intensity level I chose; an even mix of all 3 colors (or gray).  &lt;/p&gt;
&lt;h3&gt;Hold that pose!&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;fill&amp;nbsp;in&amp;nbsp;the&amp;nbsp;background&amp;nbsp;with&amp;nbsp;the&amp;nbsp;background&amp;nbsp;color&lt;/li&gt;&lt;li&gt;imagefilledrectangle($image,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;$width,&amp;nbsp;$height,&amp;nbsp;$bgcolor);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now we get down to business and start painting the picture, so to speak.  First, we set the background color of the image.  We do this by making a filled rectangle, because our image is a rectangle, and making a filled rectangle the same size of our rectangle is pretty convenient for our purposes.  &lt;/p&gt;
&lt;p&gt;imagefilledrectangle() takes 6 arguments: the image resource, the top left x,y coordinates, the bottom right x,y coordinates, and the fill color.  We fill in the blanks with the appropriate variables, and move along.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;x,y&amp;nbsp;coords&amp;nbsp;for&amp;nbsp;imagettftext&amp;nbsp;defines&amp;nbsp;the&amp;nbsp;baseline&amp;nbsp;of&amp;nbsp;the&amp;nbsp;text:&amp;nbsp;the&amp;nbsp;lower-left&amp;nbsp;corner&lt;/li&gt;&lt;li&gt;//&amp;nbsp;so&amp;nbsp;the&amp;nbsp;x&amp;nbsp;coord&amp;nbsp;can&amp;nbsp;stay&amp;nbsp;as&amp;nbsp;0&amp;nbsp;but&amp;nbsp;you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;add&amp;nbsp;the&amp;nbsp;font&amp;nbsp;size&amp;nbsp;to&amp;nbsp;the&amp;nbsp;y&amp;nbsp;to&amp;nbsp;simulate&lt;/li&gt;&lt;li&gt;//&amp;nbsp;top&amp;nbsp;left&amp;nbsp;boundary&amp;nbsp;so&amp;nbsp;we&amp;nbsp;can&amp;nbsp;write&amp;nbsp;the&amp;nbsp;text&amp;nbsp;within&amp;nbsp;the&amp;nbsp;boundary&amp;nbsp;of&amp;nbsp;the&amp;nbsp;image&lt;/li&gt;&lt;li&gt;$x&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;/li&gt;&lt;li&gt;$y&amp;nbsp;=&amp;nbsp;$fontsize;&lt;/li&gt;&lt;li&gt;imagettftext($image,&amp;nbsp;$fontsize,&amp;nbsp;0,&amp;nbsp;$x,&amp;nbsp;$y,&amp;nbsp;$fontcolor,&amp;nbsp;$font,&amp;nbsp;$quote);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The next thing we do is write the text to the canvas.  We do this with imagettftext().  This GD function needs 8 arguments: &lt;/p&gt;
&lt;p&gt;1 -The image resource&lt;br /&gt;
2 - The font size of the text&lt;br /&gt;
3 - The angle we want the text to be written (like, if we want it to slant some way, instead of the normal horizontal.  Same as with the imagettfbbox() earlier)&lt;br /&gt;
4,5  - The x,y coordinate for the base point of the text. This coordinate specifies the lower left corner of the first character in the text.  &lt;br /&gt;
6 - the color of the font&lt;br /&gt;
7 - the font type&lt;br /&gt;
8 - the text to 'paint'&lt;/p&gt;
&lt;p&gt;Since the 4th and 5th arguments of imagettftext() specify the &lt;i&gt;lower&lt;/i&gt; left point of the text, we need to offset the starting point, so that the text is written within the boundary of our canvas.  The x coordinate doesn't need to be offset, so that stays at 0, but the y coordinate needs to be offset by the size of the font.  &lt;/p&gt;
&lt;h3&gt;Signed, sealed and delivered&lt;/h3&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;tell&amp;nbsp;the&amp;nbsp;browser&amp;nbsp;that&amp;nbsp;the&amp;nbsp;content&amp;nbsp;is&amp;nbsp;an&amp;nbsp;image&lt;/li&gt;&lt;li&gt;header('Content-type:&amp;nbsp;image/png');&lt;/li&gt;&lt;li&gt;//&amp;nbsp;output&amp;nbsp;image&amp;nbsp;to&amp;nbsp;the&amp;nbsp;browser&lt;/li&gt;&lt;li&gt;imagepng($image);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;delete&amp;nbsp;the&amp;nbsp;image&amp;nbsp;resource&amp;nbsp;&lt;/li&gt;&lt;li&gt;imagedestroy($image);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Okay, our image is now created!  Now all we have to do is output the results.  First, we send a header to the browser, telling it that the content is going to be an image.  I chose png image type for the hell of it.  You can specify it as a gif or bmp or jpg or whatever; the GD library supports outputting to different filetypes.  You'll have to change the content-type in the header call, as well as the appropriate GD function (like imagegif, imagejpeg, etc..).  &lt;/p&gt;
&lt;p&gt;Then we actually output the image with imagepng().  The only required argument is the image resource.  If that's the only argument we specify, it outputs it as a raw image to our browser (which is why we sent the header to the browser).  The other arguments can be used for saving the file, the quality, etc..  You can refer to the manual entry for what the other arguments are for and how to use them. &lt;/p&gt;
&lt;p&gt;Last thing we do is delete the image resource with imagedestroy(), so that it's not hanging around in the computer's memory anymore.  This isn't strictly necessary, as everything is destroyed, memory freed, etc.. blahblahblah when the script is done executing, but it's good programming practice to clean up after yourself.  After all, you do wipe your arse when you're done going #2, don't you?  Don't you??? &lt;/p&gt;
&lt;h3&gt;The End!&lt;/h3&gt;&lt;p&gt;All you have to do from there is treat the file as if it were an image, in an img tag or in an img bbcode on your forum; whatever. &lt;/p&gt;
&lt;p&gt;Hopefully this tutorial was easy enough to understand, and you can use it as a stepping stone to do whatever with it.  If you are interested in how to make a captcha image, there are a million and one tutorials out there for that, so you should have no problem finding something.  I doubt I will be writing one, especially since, as mentioned, the bulk of it is pretty much the same as what was shown here. &lt;/p&gt;
&lt;p&gt;On the other hand, there is a lot to explore and discuss about the specifics of captcha, so who knows, maybe I will.  Until then, &lt;/p&gt;
&lt;p&gt;Happy Coding!&lt;/p&gt;
&lt;p&gt;Crayon Violent&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=jYYNg43afug:ZC7XOk_CnG0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=jYYNg43afug:ZC7XOk_CnG0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=jYYNg43afug:ZC7XOk_CnG0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=jYYNg43afug:ZC7XOk_CnG0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=jYYNg43afug:ZC7XOk_CnG0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=jYYNg43afug:ZC7XOk_CnG0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=jYYNg43afug:ZC7XOk_CnG0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=jYYNg43afug:ZC7XOk_CnG0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpfreaks/tutorials/~4/jYYNg43afug" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 26 Jan 2009 05:32:55 +0000</pubDate>
      <comments>http://www.phpfreaks.com/tutorial/php-add-text-to-image#comments</comments>
    <feedburner:origLink>http://www.phpfreaks.com/tutorial/php-add-text-to-image</feedburner:origLink></item>
    <item>
      <title><![CDATA[Working with checkboxes and a database]]></title>
      <link>http://feedproxy.google.com/~r/phpfreaks/tutorials/~3/XI3UGHyw0aU/working-with-checkboxes-and-a-database</link>
      <guid isPermaLink="false">http://www.phpfreaks.com/tutorial/working-with-checkboxes-and-a-database</guid>
      <description>&lt;h4&gt;Introduction&lt;/h4&gt;&lt;p&gt;Over in the php help forum, the question of how to deal with checkboxes arises pretty often. Usually, people want to be able to select which rows of a database to update/delete/throw out the window.&lt;/p&gt;
&lt;p&gt;The concept is actually pretty simple. It involves naming your checkbox as an array and the use of the IN mysql clause. This tutorial aims to give a simple example in the hope that, next time someone asks, I can point them to a tutorial rather than explaining all over again.&lt;/p&gt;
&lt;p&gt;Right, on with the show.&lt;/p&gt;
&lt;h4&gt;The Database&lt;/h4&gt;&lt;p&gt;Seeing as we're going to be updating a database, we'll be needing a table and some data. Here's a table I made earlier:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;`tutorial_users`&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`id`&amp;nbsp;INT(&amp;nbsp;10&amp;nbsp;)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;AUTO_INCREMENT&amp;nbsp;,&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`username`&amp;nbsp;VARCHAR(&amp;nbsp;50&amp;nbsp;)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;,&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`admin`&amp;nbsp;TINYINT(&amp;nbsp;1&amp;nbsp;)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;'0',&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;PRIMARY&amp;nbsp;KEY&amp;nbsp;(&amp;nbsp;`id`&amp;nbsp;)&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;)&amp;nbsp;ENGINE&amp;nbsp;=&amp;nbsp;MYISAM&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And some data to work with. No prizes for guessing what I was just watching on TV:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;INSERT&amp;nbsp;INTO&amp;nbsp;`tutorial_users`&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`id`&amp;nbsp;,&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`username`&amp;nbsp;,&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;`admin`&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;)&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;VALUES&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Stewie',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Peter',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Brian',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Meg',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Lois',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Chris',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Greased&amp;nbsp;Up&amp;nbsp;Deaf&amp;nbsp;Guy',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;),&amp;nbsp;(&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;NULL&amp;nbsp;,&amp;nbsp;'Quagmire',&amp;nbsp;'0'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;It's a simple setup. A user's table with a field called admin, which is the field we'll be updating. &lt;/p&gt;
&lt;p&gt;If you're the kind of guy (or gal; we're all for equal opportunities here) who likes a quick fix – the full code is on the next page. Otherwise, we'll be breaking it down on pages 4 and 5.&lt;/p&gt;
&lt;h4&gt;The Code&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;include(&amp;quot;connect.php&amp;quot;);&lt;/li&gt;&lt;li&gt;$updated&amp;nbsp;=&amp;nbsp;FALSE;&lt;/li&gt;&lt;li&gt;if(count($_POST)&amp;nbsp;&amp;gt;&amp;nbsp;0){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$admin&amp;nbsp;=&amp;nbsp;$_POST['admin'];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array_map('intval',$admin);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$admin&amp;nbsp;=&amp;nbsp;implode(',',$admin);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_query(&amp;quot;UPDATE&amp;nbsp;tutorial_users&amp;nbsp;SET&amp;nbsp;admin=0&amp;quot;)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_query(&amp;quot;UPDATE&amp;nbsp;tutorial_users&amp;nbsp;SET&amp;nbsp;admin=1&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;IN&amp;nbsp;($admin)&amp;quot;)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$updated=TRUE;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;&amp;quot;-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Strict//EN&amp;quot;&amp;nbsp;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;html&amp;nbsp;xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;head&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;meta&amp;nbsp;http-equiv=&amp;quot;Content-Type&amp;quot;&amp;nbsp;content=&amp;quot;text/html;&amp;nbsp;charset=UTF-8&amp;quot;&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;title&amp;gt;phpfreaks&amp;nbsp;checkbox&amp;nbsp;tutorial&amp;lt;/title&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/head&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;form&amp;nbsp;action=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;$_SERVER['PHP_SELF'];?&amp;gt;&amp;quot;&amp;nbsp;method=&amp;quot;post&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;if($updated===TRUE){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;'&amp;lt;div&amp;gt;Privileges&amp;nbsp;Updated!&amp;lt;/div&amp;gt;';&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;table&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;tr&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;th&amp;gt;Username&amp;lt;/th&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;th&amp;gt;Admin&amp;nbsp;Privileges&amp;lt;/th&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/tr&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;id,username,admin&amp;nbsp;FROM&amp;nbsp;tutorial_users&amp;nbsp;ORDER&amp;nbsp;by&amp;nbsp;id&amp;nbsp;ASC&amp;quot;;&lt;/li&gt;&lt;li&gt;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;li&gt;while(list($id,$username,$admin)=mysql_fetch_row($result)){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$checked&amp;nbsp;=&amp;nbsp;($admin==1)&amp;nbsp;?&amp;nbsp;'checked=&amp;quot;checked&amp;quot;'&amp;nbsp;:&amp;nbsp;'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;'&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'.$username.'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;admin[]&amp;quot;&amp;nbsp;value=&amp;quot;'.$id.'&amp;quot;&amp;nbsp;'.$checked.'/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'.&amp;quot;\n&amp;quot;;&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;nbsp;colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;input&amp;nbsp;type=&amp;quot;submit&amp;quot;&amp;nbsp;name=&amp;quot;submit&amp;quot;&amp;nbsp;value=&amp;quot;Update&amp;nbsp;Privileges&amp;quot;&amp;nbsp;/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/table&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/form&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Interlude&lt;/h4&gt;&lt;p&gt;Thanks for sticking around. Before we take a closer look at that code, I just want to mention a little about checkboxes and how they work. &lt;/p&gt;
&lt;p&gt;You're probably aware that with a lot of other form elements, such as text fields, if you leave them blank they'll still appear in the $_POST/$_GET array – just with a blank value. &lt;/p&gt;
&lt;p&gt;On the other hand, checkboxes behave a bit more like buttons. If you don't check them, they wont appear in the array. Assuming you do tick them, they'll take the value you give them or 'on' by default. Bear that in mind, it'll be important later.&lt;/p&gt;
&lt;h4&gt;Breaking it down&lt;/h4&gt;&lt;p&gt;I'm going to start the breakdown a little way through the code from the opening form tag, seeing as you'll have to fill in that form before you can process it.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;form&amp;nbsp;action=&amp;quot;&amp;lt;?php&amp;nbsp;echo&amp;nbsp;$_SERVER['PHP_SELF'];?&amp;gt;&amp;quot;&amp;nbsp;method=&amp;quot;post&amp;quot;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;if($updated===TRUE){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;'&amp;lt;div&amp;gt;Privileges&amp;nbsp;Updated!&amp;lt;/div&amp;gt;';&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
We have a standard form with a post method, and an action of the same page. We're also going to display a message if the database was updated – because we're nice like that.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;table&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;tr&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;th&amp;gt;Username&amp;lt;/th&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;th&amp;gt;Admin&amp;nbsp;Privileges&amp;lt;/th&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/tr&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
We're going to setup a table with the username and privilege listed in it. If you don't like tables, tough luck.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;id,username,admin&amp;nbsp;FROM&amp;nbsp;tutorial_users&amp;nbsp;ORDER&amp;nbsp;by&amp;nbsp;id&amp;nbsp;ASC&amp;quot;;&lt;/li&gt;&lt;li&gt;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We select the fields we need from the database (not forgetting the id, as we'll use this to identify each row) and execute the query with a little error checking.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;while(list($id,$username,$admin)=mysql_fetch_row($result)){&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you're not familiar with the list() construct, it allows us to assign lots of variables from a numerically indexed array in one go. I get bored of using $row all the time, so it makes a change. It's important to use mysql_fetch_row() so that you get a numerically indexed array (as opposed to an associative one) and that you create the variables with the same order you selected them in your query. See &lt;a href="http://www.php.net/list"&gt;the manual page&lt;/a&gt; for a bit more.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;$checked&amp;nbsp;=&amp;nbsp;($admin==1)&amp;nbsp;?&amp;nbsp;'checked=&amp;quot;checked&amp;quot;'&amp;nbsp;:&amp;nbsp;'';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;'&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'.$username.'&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input&amp;nbsp;type=&amp;quot;checkbox&amp;quot;&amp;nbsp;name=&amp;quot;admin[]&amp;quot;&amp;nbsp;value=&amp;quot;'.$id.'&amp;quot;&amp;nbsp;'.$checked.'/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'.&amp;quot;\n&amp;quot;;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Inside that loop, we first work out if the checkbox should be ticked to start with. That is, if the user currently has admin privileges. Use of the ternary operator keeps this short and sweet. We then echo out a row for each user. &lt;/p&gt;
&lt;p&gt;Notice that we name the checkbox admin[]. This means that $_POST['admin'] is going to be an array. An array of all the ticked boxes in fact. Also notice that we set the value to the id of the user.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;nbsp;colspan=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;input&amp;nbsp;type=&amp;quot;submit&amp;quot;&amp;nbsp;name=&amp;quot;submit&amp;quot;&amp;nbsp;value=&amp;quot;Update&amp;nbsp;Privileges&amp;quot;&amp;nbsp;/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/table&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/form&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/body&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Finally, we make a submit button and finish off our html. I don't know about you, but I find forms without a submit button a little unsatisfactory.&lt;/p&gt;
&lt;p&gt;On the next page, we'll take a look at the processing.&lt;/p&gt;
&lt;h4&gt;Processing the form&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;include(&amp;quot;connect.php&amp;quot;);&lt;/li&gt;&lt;li&gt;$updated&amp;nbsp;=&amp;nbsp;FALSE;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;First, we include a file that's going to connect us to our database. I would show you that file, but personally I prefer to keep my username and password to myself. We also create a variable that says we haven't updated the database...yet.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;if(count($_POST)&amp;nbsp;&amp;gt;&amp;nbsp;0){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$admin&amp;nbsp;=&amp;nbsp;$_POST['admin'];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array_map('intval',$admin);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Our if statement ensures that this code only runs if the form has been submitted. We create a local variable from the $_POST array. We then do a little bit of validation. We don't want any nasty users modifying any of those values in our form to do some SQL injection, so we make sure every value in that array is an integer with the array_map function. Again, see &lt;a href="http://www.php.net/array_map"&gt;the manual page&lt;/a&gt; if you're not too sure how this function works.&lt;/p&gt;
&lt;p&gt;&amp;quot;What if I don't have integers as my values?&amp;quot; Good question. You might like to use mysql_real_escape_string(), like so:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;array_map('mysql_real_escape_string',$admin);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Or you might write your own function to make sure the values are the sort of thing you expect.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;$admin&amp;nbsp;=&amp;nbsp;implode(',',$admin);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Next, we use the implode() function to turn our array into a string. We separate each value with a comma. This will allow us to use the IN clause in a moment. If your values aren't integers, you'll have to do something different. I'll cover that in a minute.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;mysql_query(&amp;quot;UPDATE&amp;nbsp;users&amp;nbsp;SET&amp;nbsp;admin=0&amp;quot;)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_query(&amp;quot;UPDATE&amp;nbsp;users&amp;nbsp;SET&amp;nbsp;admin=1&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;IN&amp;nbsp;($admin)&amp;quot;)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$updated=TRUE;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Before we update the new users who have admin privileges, we first update the database so no-one does. Why? Well, our comma-delimited list contains just those people who we do want to have admin rights. So we better make sure no-one else does. Our second query makes use of that IN clause – it allows us to provide a comma-separate list of values that id can be.&lt;/p&gt;
&lt;p&gt;Note: An alternative to updating every row to 0 would be to use the NOT IN clause.&lt;/p&gt;
&lt;h4&gt;Using strings&lt;/h4&gt;&lt;p&gt;If your values are strings, you'll need to be a little more careful with your implode and query. Don't forget that all strings in your SQL must be inside quotes. It's a pretty simple adjustment, but it'll cause you an error if you forget. Make your implode look like this:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;$admin&amp;nbsp;=&amp;nbsp;implode(&amp;quot;','&amp;quot;,$admin);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And your query like this:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;mysql_query(&amp;quot;UPDATE&amp;nbsp;users&amp;nbsp;SET&amp;nbsp;admin=1&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;IN&amp;nbsp;('$admin')&amp;quot;)&amp;nbsp;or&amp;nbsp;trigger_error(mysql_error(),E_USER_ERROR);&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Note the extra quotes – after we've imploded our values, they might look a little like this: &lt;/p&gt;
&lt;p&gt;one','two','three','four&lt;/p&gt;
&lt;p&gt;So we need to add the quote to the front and back.&lt;/p&gt;
&lt;p&gt;We'll sum up on the last page&lt;/p&gt;
&lt;h4&gt;Summary&lt;/h4&gt;&lt;p&gt;So there we have it. The form gets processed and reloaded with the users having the new privileges. I hope that was easy to follow and worth the effort. Next time you work with checkboxes, it should be a little easier – there's really not much more to it. &lt;/p&gt;
&lt;p&gt;Remember to name your checkbox as an array and set its value to something that uniquely identifies the row. If that's a string, take care when you implode the data. And don't forget to validate those values too. Most users are evil. Alright, maybe not. But if you think like that, you'll save yourself more than a few headaches. &lt;/p&gt;
&lt;p&gt;Lastly, don't forget, you can name other pieces of your form so that they are arrays. Again, this is useful for updating an unknown, large amount of data simultaneously.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=XI3UGHyw0aU:VUqh90W8a04:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=XI3UGHyw0aU:VUqh90W8a04:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=XI3UGHyw0aU:VUqh90W8a04:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=XI3UGHyw0aU:VUqh90W8a04:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=XI3UGHyw0aU:VUqh90W8a04:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=XI3UGHyw0aU:VUqh90W8a04:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=XI3UGHyw0aU:VUqh90W8a04:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=XI3UGHyw0aU:VUqh90W8a04:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpfreaks/tutorials/~4/XI3UGHyw0aU" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 10 Jan 2009 17:47:52 +0000</pubDate>
      <comments>http://www.phpfreaks.com/tutorial/working-with-checkboxes-and-a-database#comments</comments>
    <feedburner:origLink>http://www.phpfreaks.com/tutorial/working-with-checkboxes-and-a-database</feedburner:origLink></item>
    <item>
      <title><![CDATA[Protecting php applications with PHPIDS]]></title>
      <link>http://feedproxy.google.com/~r/phpfreaks/tutorials/~3/vqv19_tI5sA/protecting-php-applications-with-phpids</link>
      <guid isPermaLink="false">http://www.phpfreaks.com/tutorial/protecting-php-applications-with-phpids</guid>
      <description>&lt;h4&gt;Introduction&lt;/h4&gt;&lt;pre class="bbcode"&gt;PHPIDS (PHP-Intrusion Detection System) is a simple to use,
well structured, fast and state-of-the-art security layer
for your PHP based web application. The IDS neither strips,
sanitizes nor filters any malicious input, it simply
recognizes when an attacker tries to break your site and
reacts in exactly the way you want it to. Based on a set of
approved and heavily tested filter rules any attack is given
a numerical impact rating which makes it easy to decide what
kind of action should follow the hacking attempt. This could
range from simple logging to sending out an emergency mail
to the development team, displaying a warning message for
the attacker or even ending the user's session&lt;/pre&gt;&lt;p&gt;In a nutshell PHPIDS is an advanced intrusion detection system written with performance on a large scale in mind. The basic installation and configuration is pretty straight forward.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline"&gt;Requirements&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 5.1.2 or better&lt;/li&gt;
&lt;li&gt;Apache&lt;/li&gt;
&lt;li&gt;mod_rewrite&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Installation&lt;/h4&gt;&lt;p&gt;First we need to download the latest stable release at &lt;a href="http://php-ids.org/downloads/"&gt;http://php-ids.org/downloads/&lt;/a&gt; and decompress it. Please note that you do not want public access to the phpids directory. I recommend that you place it above your document root. &lt;/p&gt;
&lt;p&gt;If you are on a shared host and cannot place it above the document root the following rewrite will prevent unwanted access.&lt;/p&gt;
&lt;pre class="bbcode"&gt;RewriteEngine On
RewriteCond %{REQUEST_URI} ^/phpids(.*)
RewriteRule ^(.+)$ - [F]&lt;/pre&gt;&lt;h4&gt;Configuration&lt;/h4&gt;&lt;p&gt;
The basic configuration is extremely simple. By default it comes with several examples. I recommend that you take the time to look at the original Config.ini and browse through the included documentation. It will work &amp;quot;out of the box&amp;quot; with very few edits to the Config.ini. My Config.ini looks like:&lt;/p&gt;
&lt;pre class="bbcode"&gt;[General]
    filter_type = xml
    use_base_path = false
    filter_path = default_filter.xml
    tmp_path  = tmp
    scan_keys  = false
    HTML_Purifier_Path = IDS/vendors/htmlpurifier/HTMLPurifier.auto.php
    HTML_Purifier_Cache = IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer
    html[] = __wysiwyg
    json[]  = __jsondata
    exceptions[]  = __utmz
    exceptions[] = __utmc
    min_php_version = 5.1.2
[Logging]
    path = tmp/phpids_log.txt
    recipients[] = me@domain.com
    subject = &amp;quot;PHPIDS detected an intrusion attempt!&amp;quot;
    header = &amp;quot;From: &amp;lt;PHPIDS&amp;gt; noreply@domain.com&amp;quot;
    envelope = &amp;quot;&amp;quot;
    safemode = true
    allowed_rate = 15

[Caching]
    caching = file
    expiration_time = 600
    path = tmp/default_filter.cache&lt;/pre&gt;&lt;p&gt;Now, we need to write a simple php script to enable PHPIDS. I used one of the included examples with minor modifications&lt;/p&gt;
&lt;p&gt;ids.php&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;set&amp;nbsp;the&amp;nbsp;include&amp;nbsp;path&amp;nbsp;properly&amp;nbsp;for&amp;nbsp;PHPIDS&lt;/li&gt;&lt;li&gt;set_include_path(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get_include_path()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.&amp;nbsp;PATH_SEPARATOR&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.&amp;nbsp;'phpids/lib/'&lt;/li&gt;&lt;li&gt;);&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;if&amp;nbsp;(!session_id())&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session_start();&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;require_once&amp;nbsp;'IDS/Init.php';&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;try&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$request&amp;nbsp;=&amp;nbsp;array(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'REQUEST'&amp;nbsp;=&amp;gt;&amp;nbsp;$_REQUEST,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'GET'&amp;nbsp;=&amp;gt;&amp;nbsp;$_GET,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'POST'&amp;nbsp;=&amp;gt;&amp;nbsp;$_POST,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'COOKIE'&amp;nbsp;=&amp;gt;&amp;nbsp;$_COOKIE&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$init&amp;nbsp;=&amp;nbsp;IDS_Init::init(dirname(__FILE__)&amp;nbsp;.&amp;nbsp;'/phpids/lib/IDS/Config/Config.ini');&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$init-&amp;gt;config['General']['base_path']&amp;nbsp;=&amp;nbsp;dirname(__FILE__)&amp;nbsp;.&amp;nbsp;'/phpids/lib/IDS/';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$init-&amp;gt;config['General']['use_base_path']&amp;nbsp;=&amp;nbsp;true;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$init-&amp;gt;config['Caching']['caching']&amp;nbsp;=&amp;nbsp;'file';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ids&amp;nbsp;=&amp;nbsp;new&amp;nbsp;IDS_Monitor($request,&amp;nbsp;$init);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result&amp;nbsp;=&amp;nbsp;$ids-&amp;gt;run();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!$result-&amp;gt;isEmpty())&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;require_once&amp;nbsp;'IDS/Log/File.php';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;require_once&amp;nbsp;'IDS/Log/Email.php';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;require_once&amp;nbsp;'IDS/Log/Composite.php';&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$compositeLog&amp;nbsp;=&amp;nbsp;new&amp;nbsp;IDS_Log_Composite();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$compositeLog-&amp;gt;addLogger(IDS_Log_Email::getInstance($init),IDS_Log_File::getInstance($init));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$compositeLog-&amp;gt;execute($result);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;$e)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//this&amp;nbsp;shouldn't&amp;nbsp;happen&amp;nbsp;and&amp;nbsp;if&amp;nbsp;it&amp;nbsp;does&amp;nbsp;you&amp;nbsp;don't&amp;nbsp;want&amp;nbsp;the&amp;nbsp;notification&amp;nbsp;public.&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now we will use PHP's auto_prepend_file to prepend our ids.php script from above to all other php scripts. You can do this by adding the following to your php.ini&lt;/p&gt;
&lt;pre class="bbcode"&gt;auto_prepend_file /full/path/to/ids.php&lt;/pre&gt;&lt;p&gt;Or with a .htaccess we can do something like:&lt;/p&gt;
&lt;pre class="bbcode"&gt;php_value auto_prepend_file /full/path/to/ids.php&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=vqv19_tI5sA:mW3W4qrjmwE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=vqv19_tI5sA:mW3W4qrjmwE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=vqv19_tI5sA:mW3W4qrjmwE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=vqv19_tI5sA:mW3W4qrjmwE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=vqv19_tI5sA:mW3W4qrjmwE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=vqv19_tI5sA:mW3W4qrjmwE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=vqv19_tI5sA:mW3W4qrjmwE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=vqv19_tI5sA:mW3W4qrjmwE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpfreaks/tutorials/~4/vqv19_tI5sA" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 21 Dec 2008 00:33:12 +0000</pubDate>
      <comments>http://www.phpfreaks.com/tutorial/protecting-php-applications-with-phpids#comments</comments>
    <feedburner:origLink>http://www.phpfreaks.com/tutorial/protecting-php-applications-with-phpids</feedburner:origLink></item>
    <item>
      <title><![CDATA[PHP Custom List Order]]></title>
      <link>http://feedproxy.google.com/~r/phpfreaks/tutorials/~3/oYr-BhaQvmE/php-custom-list-order</link>
      <guid isPermaLink="false">http://www.phpfreaks.com/tutorial/php-custom-list-order</guid>
      <description>&lt;p&gt;So you have some tabular data printed out in your browser.  You can even change the order of the information by clicking on the column name at the top of your list.   But can you make your own custom list order?  &lt;/p&gt;
&lt;p&gt;Or maybe you're deciding to make a content management system (CMS).  You're making your features modular, so it's easier to add/remove modules.  How do you go about displaying them in a custom order in the browser?  &lt;/p&gt;
&lt;p&gt;Or to illustrate with simple numbers: If you have a list ordered 1 2 3 4 5 and you're wanting to somehow make it 1 3 2 5 4 or 1 2 3 5 4 or 1 5 2 4 3 or whatever else, then you've come to the right place.&lt;/p&gt;
&lt;p&gt;Just want to say up front that yes, I am aware that there are several ajax or other &amp;quot;web 2.0&amp;quot; type methods, frameworks, etc.. that offer this sort of thing.  You can drag and drop rows and it's flashy and no, that's not what you're going to get out of this tutorial.  This is straight php.  No bells and whistles and warm fuzzy little kitties to jump up and down and purr about what a great job you're doing.  &lt;/p&gt;
&lt;h4&gt;Setup the Database&lt;/h4&gt;&lt;p&gt;
Since data is *usually* stored in a database, we are going to be storing our custom list order in a column in a SQL table.  I'm using MySQL just because that's what I use, but  as far as I know, all queries should work with any of the SQL database.  &lt;/p&gt;
&lt;p&gt;First things first, let's set up a table.  Create a table named 'info' with a column named 'usort' type int and a column named 'name' type varchar(10).   Here is a query for that:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;`info`&amp;nbsp;(&lt;/li&gt;&lt;li&gt;`usort`&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;,&lt;/li&gt;&lt;li&gt;`name`&amp;nbsp;VARCHAR(&amp;nbsp;10&amp;nbsp;)&amp;nbsp;NOT&amp;nbsp;NULL&lt;/li&gt;&lt;li&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And here is another query to populate it with some data:&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;INSERT&amp;nbsp;INTO&amp;nbsp;&lt;/li&gt;&lt;li&gt;`blah`&amp;nbsp;(`usort`,&amp;nbsp;`name`)&amp;nbsp;&lt;/li&gt;&lt;li&gt;VALUES&amp;nbsp;&lt;/li&gt;&lt;li&gt;('1',&amp;nbsp;'Larry'),&lt;/li&gt;&lt;li&gt;('2',&amp;nbsp;'Curly'),&lt;/li&gt;&lt;li&gt;('3',&amp;nbsp;'Moe'),&lt;/li&gt;&lt;li&gt;('4',&amp;nbsp;'Mary'),&lt;/li&gt;&lt;li&gt;('5',&amp;nbsp;'Jane');&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Note:  The values in the usort column need to be unique in order for this code to work.  However, DO NOT make this column  primary key, auto_increment, or unique.   If you do this, the query that swaps usort values will yell and scream at you about having duplicate entries.&lt;/p&gt;
&lt;p&gt;But that's okay, because usort is not meant to replace the row id which you will probably have, and will probably already be unique, auto_incremented, etc...&lt;/p&gt;
&lt;h4&gt;The Plan&lt;/h4&gt;&lt;p&gt;
Okay now that we have our table setup with some data to work with, let's talk about the script.   The goal of this example script is to display the data from the table.  We will make the column names links so that we can sort by column name.  &lt;/p&gt;
&lt;p&gt;More importantly, we will create 'up' and 'down' arrows for each row, so that we can order the list how we want to.  When you click an up or down arrow,  the script will send a query to the database to swap numbers in the table with the row above or below the row.  &lt;/p&gt;
&lt;p&gt;Entire code that way ----------&amp;gt;&lt;/p&gt;
&lt;h4&gt;The Code&lt;/h4&gt;&lt;p&gt;
Here is the whole script.  The next few pages will break it down bit by bit.  &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;//&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;db&lt;/li&gt;&lt;li&gt;$conn&amp;nbsp;=&amp;nbsp;mysql_connect('localhost','dbusername','dbpassword')&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;$db&amp;nbsp;=&amp;nbsp;mysql_select_db('dbname',$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;if&amp;nbsp;an&amp;nbsp;arrow&amp;nbsp;link&amp;nbsp;was&amp;nbsp;clicked...&lt;/li&gt;&lt;li&gt;if&amp;nbsp;($_GET['dir']&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;$_GET['id'])&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;GET&amp;nbsp;vars&amp;nbsp;easier&amp;nbsp;to&amp;nbsp;handle&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dir&amp;nbsp;=&amp;nbsp;$_GET['dir'];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;cast&amp;nbsp;as&amp;nbsp;int&amp;nbsp;and&amp;nbsp;couple&amp;nbsp;with&amp;nbsp;switch&amp;nbsp;for&amp;nbsp;sql&amp;nbsp;injection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$id&amp;nbsp;=&amp;nbsp;(int)&amp;nbsp;$_GET['id'];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;decide&amp;nbsp;what&amp;nbsp;row&amp;nbsp;we're&amp;nbsp;swapping&amp;nbsp;based&amp;nbsp;on&amp;nbsp;$dir&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;($dir)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;if&amp;nbsp;we're&amp;nbsp;going&amp;nbsp;up,&amp;nbsp;swap&amp;nbsp;is&amp;nbsp;1&amp;nbsp;less&amp;nbsp;than&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;'up':&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;row&amp;nbsp;above&amp;nbsp;to&amp;nbsp;swap&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;($id&amp;nbsp;&amp;gt;&amp;nbsp;1)?&amp;nbsp;$id--&amp;nbsp;:&amp;nbsp;1;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;if&amp;nbsp;we're&amp;nbsp;going&amp;nbsp;down,&amp;nbsp;swap&amp;nbsp;is&amp;nbsp;1&amp;nbsp;more&amp;nbsp;than&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;'down':&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;find&amp;nbsp;out&amp;nbsp;what&amp;nbsp;the&amp;nbsp;highest&amp;nbsp;row&amp;nbsp;is&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;count(*)&amp;nbsp;FROM&amp;nbsp;info&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$r&amp;nbsp;=&amp;nbsp;mysql_fetch_row($result);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$max&amp;nbsp;=&amp;nbsp;$r[0];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;row&amp;nbsp;below&amp;nbsp;to&amp;nbsp;swap&amp;nbsp;with&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;($id&amp;nbsp;&amp;lt;&amp;nbsp;$max)?&amp;nbsp;$id++&amp;nbsp;:&amp;nbsp;$max;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;default&amp;nbsp;value&amp;nbsp;(sql&amp;nbsp;injection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$dir)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;$id;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;switch&amp;nbsp;$dir&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;swap&amp;nbsp;the&amp;nbsp;rows.&amp;nbsp;Basic&amp;nbsp;idea&amp;nbsp;is&amp;nbsp;to&amp;nbsp;make&amp;nbsp;$id=$swap&amp;nbsp;and&amp;nbsp;$swap=$id&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;UPDATE&amp;nbsp;info&amp;nbsp;SET&amp;nbsp;usort&amp;nbsp;=&amp;nbsp;CASE&amp;nbsp;usort&amp;nbsp;WHEN&amp;nbsp;$id&amp;nbsp;THEN&amp;nbsp;$swap&amp;nbsp;WHEN&amp;nbsp;$swap&amp;nbsp;THEN&amp;nbsp;$id&amp;nbsp;END&amp;nbsp;WHERE&amp;nbsp;usort&amp;nbsp;IN&amp;nbsp;($id,&amp;nbsp;$swap)&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;if&amp;nbsp;GET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;set&amp;nbsp;a&amp;nbsp;result&amp;nbsp;order&amp;nbsp;with&amp;nbsp;a&amp;nbsp;default&amp;nbsp;(sql&amp;nbsp;infection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$sortby)&lt;/li&gt;&lt;li&gt;$sortby&amp;nbsp;=&amp;nbsp;($_GET['sortby']&amp;nbsp;==&amp;nbsp;'name')?&amp;nbsp;$_GET['sortby']&amp;nbsp;:&amp;nbsp;'usort';&lt;/li&gt;&lt;li&gt;//&amp;nbsp;pull&amp;nbsp;the&amp;nbsp;info&amp;nbsp;from&amp;nbsp;the&amp;nbsp;table&lt;/li&gt;&lt;li&gt;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;usort,&amp;nbsp;name&amp;nbsp;FROM&amp;nbsp;info&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;$sortby&amp;quot;;&lt;/li&gt;&lt;li&gt;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;display&amp;nbsp;table&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;table&amp;nbsp;border&amp;nbsp;=&amp;nbsp;'1'&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;make&amp;nbsp;column&amp;nbsp;names&amp;nbsp;links,&amp;nbsp;passing&amp;nbsp;sortby&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?sortby=usort'&amp;gt;usort&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?sortby=name'&amp;gt;name&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;display&amp;nbsp;data&amp;nbsp;1&amp;nbsp;row&amp;nbsp;at&amp;nbsp;a&amp;nbsp;time&lt;/li&gt;&lt;li&gt;while&amp;nbsp;($r&amp;nbsp;=&amp;nbsp;mysql_fetch_assoc($result))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;the&amp;nbsp;links&amp;nbsp;to&amp;nbsp;change&amp;nbsp;custom&amp;nbsp;order,&amp;nbsp;passing&amp;nbsp;direction&amp;nbsp;and&amp;nbsp;the&amp;nbsp;custom&amp;nbsp;sort&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;nbsp;align&amp;nbsp;=&amp;nbsp;'center'&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?dir=up&amp;amp;id={$r['usort']}'&amp;gt;/\&amp;lt;/a&amp;gt;&amp;nbsp;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?dir=down&amp;amp;id={$r['usort']}'&amp;gt;\/&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;{$r['name']}&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;while&amp;nbsp;$r&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;end&amp;nbsp;display&amp;nbsp;table&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Connect to db&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;?php&lt;/li&gt;&lt;li&gt;//&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;db&lt;/li&gt;&lt;li&gt;$conn&amp;nbsp;=&amp;nbsp;mysql_connect('localhost','dbusername','dbpassword')&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;$db&amp;nbsp;=&amp;nbsp;mysql_select_db('dbname',$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;First thing to do is connect to the database.  Nothing fancy here.  Insert your own info where appropriate.  &lt;/p&gt;
&lt;h4&gt;If an arrow was clicked...&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;if&amp;nbsp;an&amp;nbsp;arrow&amp;nbsp;link&amp;nbsp;was&amp;nbsp;clicked...&lt;/li&gt;&lt;li&gt;if&amp;nbsp;($_GET['dir']&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;$_GET['id'])&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;GET&amp;nbsp;vars&amp;nbsp;easier&amp;nbsp;to&amp;nbsp;handle&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dir&amp;nbsp;=&amp;nbsp;$_GET['dir'];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;cast&amp;nbsp;as&amp;nbsp;int&amp;nbsp;and&amp;nbsp;couple&amp;nbsp;with&amp;nbsp;switch&amp;nbsp;for&amp;nbsp;sql&amp;nbsp;injection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$id&amp;nbsp;=&amp;nbsp;(int)&amp;nbsp;$_GET['id'];&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Okay next, we want to check if an arrow was clicked.  We do this by checking for two GET variables.  One variable ('dir') will tell us which direction to swap the number (up or down), and the other variable ('id') will tell us what the number is.  We assign them to 'regular' variables for easier coding.  &lt;/p&gt;
&lt;p&gt;$id is cast as type int.  The reason why we do this is to keep people from entering in half numbers or things other than numbers.  We do this to prevent possible sql injection attacks from that variable (you always have to be security conscious).  &lt;/p&gt;
&lt;h4&gt;Up or Down&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;switch&amp;nbsp;($dir)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;if&amp;nbsp;we're&amp;nbsp;going&amp;nbsp;up,&amp;nbsp;swap&amp;nbsp;is&amp;nbsp;1&amp;nbsp;less&amp;nbsp;than&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;'up':&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;row&amp;nbsp;above&amp;nbsp;to&amp;nbsp;swap&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;($id&amp;nbsp;&amp;gt;&amp;nbsp;1)?&amp;nbsp;$id--&amp;nbsp;:&amp;nbsp;1;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;$dir tells us which way we want to swap: up or down.  For example, if we have a list of 1,2,3,  swapping up will change the list to 2,1,3.  Swapping down will change the list to 1,3,2.  &lt;/p&gt;
&lt;pre class="bbcode"&gt;List    Swapping up   Swapping down
1         2                 1
2         1                 3
3         3                 2&lt;/pre&gt;&lt;p&gt;We will use a switch to decide what to do if $dir is up or down.  if $dir == 'up'  then we will use a ternary operator to make sure that the current row is greater than 1, so that there is something above the row to swap with.  If there is, then we will assign the previous row to $swap by subtracting 1.  If there is no row above the current row (it's already at the top of the list), we assign 1 to it.  &lt;/p&gt;
&lt;p&gt;How do we know that the row above it is 1 less than its current number?  Because, all of the usort values are supposed to be unique.  5 rows == 5 numbers, 1-5.  There will always be 1,2,3,4,5.  Ordering by usort will always be 1-5 (or however many you have).  You have to program it that way, or it won't work.  &lt;/p&gt;
&lt;p&gt;Well, I take that back.  It won't work for this code example.  You can get fancy and do a query to find out what the one above or below will be, regardless of whether it's exactly 1 or not, but we aren't gonna get all complicated with it.  &lt;/p&gt;
&lt;h4&gt;Going Down on...the List&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;if&amp;nbsp;we're&amp;nbsp;going&amp;nbsp;down,&amp;nbsp;swap&amp;nbsp;is&amp;nbsp;1&amp;nbsp;more&amp;nbsp;than&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;'down':&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;find&amp;nbsp;out&amp;nbsp;what&amp;nbsp;the&amp;nbsp;highest&amp;nbsp;row&amp;nbsp;is&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;count(*)&amp;nbsp;FROM&amp;nbsp;info&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$r&amp;nbsp;=&amp;nbsp;mysql_fetch_row($result);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$max&amp;nbsp;=&amp;nbsp;$r[0];&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;row&amp;nbsp;below&amp;nbsp;to&amp;nbsp;swap&amp;nbsp;with&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;($id&amp;nbsp;&amp;lt;&amp;nbsp;$max)?&amp;nbsp;$id++&amp;nbsp;:&amp;nbsp;$max;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Swapping down a row is the same principle as swapping up row, except we're like, going down, instead of up.  First we do a select count(*) to find out how many rows we have.   Yes this will be done every page load.  Yes we can save it in a cookie or session var or pass it through the url (though I'd say no to the GET method for this var anyways, for security reasons), but in an effort to simplify, we're just going to select every time.  &lt;/p&gt;
&lt;p&gt;Grab the result, put it in a var $max.  Use a ternary to check if there is a row to swap down to.  If there is, then add 1 to the current row's id.  If not, then assign it $max.    &lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;default&amp;nbsp;value&amp;nbsp;(sql&amp;nbsp;injection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$dir)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$swap&amp;nbsp;=&amp;nbsp;$id;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;switch&amp;nbsp;$dir&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The default for $swap will be $id.  This is for in case someone decides to enter into the url dir=somethingotherthanupordown.&lt;/p&gt;
&lt;h4&gt;2 Card Monte...&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;swap&amp;nbsp;the&amp;nbsp;rows.&amp;nbsp;Basic&amp;nbsp;idea&amp;nbsp;is&amp;nbsp;to&amp;nbsp;make&amp;nbsp;$id=$swap&amp;nbsp;and&amp;nbsp;$swap=$id&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;UPDATE&amp;nbsp;info&amp;nbsp;SET&amp;nbsp;usort&amp;nbsp;=&amp;nbsp;CASE&amp;nbsp;usort&amp;nbsp;WHEN&amp;nbsp;$id&amp;nbsp;THEN&amp;nbsp;$swap&amp;nbsp;WHEN&amp;nbsp;$swap&amp;nbsp;THEN&amp;nbsp;$id&amp;nbsp;END&amp;nbsp;WHERE&amp;nbsp;usort&amp;nbsp;IN&amp;nbsp;($id,&amp;nbsp;$swap)&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;li&gt;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;if&amp;nbsp;GET&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now that we know which two numbers we're going to swap, we will run our query to swap them in the database.  Basically the query says this:&lt;/p&gt;
&lt;p&gt;&lt;i&gt;For every number in the IN(...) list, we are going to run a condition on it.  If it equals one thing, we're going to assign it this other thing.  If it's equal this other thing, we're going to assign it that one thing&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Or a more 'php' way of saying it:&lt;/p&gt;
&lt;pre class="bbcode"&gt;foreach ($list as $row) {
   if ($row == $x) { 
      $row = $y;
  } elseif ($row == $y) {
      $row = $x;
}&lt;/pre&gt;&lt;p&gt;&lt;span style="text-decoration:underline"&gt;You:&lt;/span&gt; &lt;i&gt;&amp;quot;Now wait just a minute there... how can the database do that?  I understand doing update table set column = $x where column = $y, but you can't just turn around and do the same thing for the 2nd row, because the first row has already been updated! There's no number to search for! wtf??&amp;quot;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline"&gt;Me:&lt;/span&gt; &lt;b&gt;MAGIC&lt;/b&gt;.  You heard me: &lt;b&gt;MAGIC&lt;/b&gt;.  For real.  Okay for really real, what happens is, internally the database will create a temporary variable to perform the execution.  First row gets updated where it equals whatever.  2nd row is updated based on temporary variable.  However, between the time the first row gets updated and the 2nd row gets updated, both rows will contain the same info, hence the duplicate error message that will ensue if you try to index that column as some flavor of unique.  &lt;/p&gt;
&lt;h4&gt;Sorting the data&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;set&amp;nbsp;a&amp;nbsp;result&amp;nbsp;order&amp;nbsp;with&amp;nbsp;a&amp;nbsp;default&amp;nbsp;(sql&amp;nbsp;infection&amp;nbsp;prevention&amp;nbsp;for&amp;nbsp;$sortby)&lt;/li&gt;&lt;li&gt;$sortby&amp;nbsp;=&amp;nbsp;($_GET['sortby']&amp;nbsp;==&amp;nbsp;'name')?&amp;nbsp;$_GET['sortby']&amp;nbsp;:&amp;nbsp;'usort';&lt;/li&gt;&lt;li&gt;//&amp;nbsp;pull&amp;nbsp;the&amp;nbsp;info&amp;nbsp;from&amp;nbsp;the&amp;nbsp;table&lt;/li&gt;&lt;li&gt;$sql&amp;nbsp;=&amp;nbsp;&amp;quot;SELECT&amp;nbsp;usort,&amp;nbsp;name&amp;nbsp;FROM&amp;nbsp;info&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;$sortby&amp;quot;;&lt;/li&gt;&lt;li&gt;$result&amp;nbsp;=&amp;nbsp;mysql_query($sql,&amp;nbsp;$conn)&amp;nbsp;or&amp;nbsp;die(mysql_error());&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Pretty straight forward.  We want to be able to click the column name to sort the data by that column, so assign a column name to $sortby to use in the query.  Since we only have two columns to sort by, we use another ternary to assign one or the other.  This ensures that $sortby will only be 'name' or 'usort' and not something else like another sql injection attempt.  We then run the query to get the data to display.  &lt;/p&gt;
&lt;h4&gt;Display the info&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;display&amp;nbsp;table&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;table&amp;nbsp;border&amp;nbsp;=&amp;nbsp;'1'&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;make&amp;nbsp;column&amp;nbsp;names&amp;nbsp;links,&amp;nbsp;passing&amp;nbsp;sortby&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?sortby=usort'&amp;gt;usort&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?sortby=name'&amp;gt;name&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Next we will start an html table, making the first row the column names.  We make them links, passing the column name through the url, so the script knows which column to order the results by, should you click on one.&lt;/p&gt;
&lt;ol class="code"&gt;&lt;li&gt;//&amp;nbsp;display&amp;nbsp;data&amp;nbsp;1&amp;nbsp;row&amp;nbsp;at&amp;nbsp;a&amp;nbsp;time&lt;/li&gt;&lt;li&gt;while&amp;nbsp;($r&amp;nbsp;=&amp;nbsp;mysql_fetch_assoc($result))&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;make&amp;nbsp;the&amp;nbsp;links&amp;nbsp;to&amp;nbsp;change&amp;nbsp;custom&amp;nbsp;order,&amp;nbsp;passing&amp;nbsp;direction&amp;nbsp;and&amp;nbsp;the&amp;nbsp;custom&amp;nbsp;sort&amp;nbsp;id&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;nbsp;align&amp;nbsp;=&amp;nbsp;'center'&amp;gt;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?dir=up&amp;amp;id={$r['usort']}'&amp;gt;/\&amp;lt;/a&amp;gt;&amp;nbsp;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;a&amp;nbsp;href='{$_SERVER['PHP_SELF']}?dir=down&amp;amp;id={$r['usort']}'&amp;gt;\/&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;td&amp;gt;{$r['name']}&amp;lt;/td&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;}&amp;nbsp;//&amp;nbsp;end&amp;nbsp;while&amp;nbsp;$r&lt;/li&gt;&lt;li&gt;echo&amp;nbsp;&amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;/li&gt;&lt;li&gt;//&amp;nbsp;end&amp;nbsp;display&amp;nbsp;table&lt;/li&gt;&lt;li&gt;?&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Finally, we use a while loop to loop through and display the results from the data pulling query.  We make some up arrow and down arrow links, passing which direction to swap, as well as the usort number for that row, so the script knows what rows to swap, should you click one of those links.  The name is displayed as plain text, because we aren't doing anything with that.  Close the table after the loop, and we're done.  &lt;/p&gt;
&lt;h4&gt;The End&lt;/h4&gt;&lt;p&gt;Well there you have it; a custom list order method made easy.  May you find this of some use in your coding endeavors.&lt;/p&gt;
&lt;p&gt;Crayon Violent&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=oYr-BhaQvmE:YH4aQsIiKFs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=oYr-BhaQvmE:YH4aQsIiKFs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=oYr-BhaQvmE:YH4aQsIiKFs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=oYr-BhaQvmE:YH4aQsIiKFs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=oYr-BhaQvmE:YH4aQsIiKFs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=oYr-BhaQvmE:YH4aQsIiKFs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?a=oYr-BhaQvmE:YH4aQsIiKFs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/phpfreaks/tutorials?i=oYr-BhaQvmE:YH4aQsIiKFs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpfreaks/tutorials/~4/oYr-BhaQvmE" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 03 Dec 2008 23:40:28 +0000</pubDate>
      <comments>http://www.phpfreaks.com/tutorial/php-custom-list-order#comments</comments>
    <feedburner:origLink>http://www.phpfreaks.com/tutorial/php-custom-list-order</feedburner:origLink></item>
  </channel>
</rss>
