<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP Made Simple &#187; PHP</title>
	<atom:link href="http://www.phpmadesimple.info/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpmadesimple.info</link>
	<description>To support simplicity, possiibility and cost effective of PHP</description>
	<lastBuildDate>Tue, 03 Aug 2010 14:13:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Building a Data Access layer using PDO</title>
		<link>http://www.phpmadesimple.info/2008/02/10/building-a-data-access-layer-using-pdo/</link>
		<comments>http://www.phpmadesimple.info/2008/02/10/building-a-data-access-layer-using-pdo/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 18:40:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[level 2]]></category>

		<guid isPermaLink="false">http://artemis.com.vn/blogvui/index.php/2008/02/10/building-a-data-access-layer-using-pdo/</guid>
		<description><![CDATA[Every time you start building a complete website with some modules and functionalities, you start thinking about the &#8220;structure&#8221; of your system or in other word, the framework you use  through  the system. For a PHP website, MVC is the most widely use framework or programming model where M is the Model which [...]]]></description>
			<content:encoded><![CDATA[<p>Every time you start building a complete website with some modules and functionalities, you start thinking about the &#8220;structure&#8221; of your system or in other word, the framework you use  through  the system. For a PHP website, MVC is the most widely use framework or programming model where M is the Model which handles the logic of the website, V is view which presents information to your users and C is controller which collaborate Views and Models together. However, the MVC itself does not include the data access layer which actually does the data manipulation work within your system and without data, your system seems to be unreal.</p>
<p>PDO is a very useful and widely use PEAR library for data manipulation. <strong>It can work with most kind of DBMS</strong> (DataBase Management System) such as MySQL (of course), Microsoft SQL, etc. PDO stands for PHP Data Object, a powerful and fast data access method for developers who need to <strong>work with different types of DBMS, handle stored procedures, process transactions or passing params to queries.</strong></p>
<p><span id="more-26"></span></p>
<p>So let begin with a Database class using PDO. <strong>This class should be simple to use, aware about your &#8216;entity&#8217; object, prevent you from being attacked by injection and the most important, bring use a methodology of writing clean, reusable and testable SQL queries</strong>.</p>
<p>Sounds like buzzwords but in fact, PDO does most of those things and our work is to just making a little more systematic in the way we use PDO functions. So, the first step is to declare a PDO object in our class:</p>
<pre class="brush: php">

class Database
{
protected $pdo;

function __construct($host, $db, $user, $password)
{
$this-&gt;pdo = new PDO(&quot;mysql:host=$host;dbname=$db&quot;, $user, $password);
}
}
</pre>
<p>The code above also shows you how to connect to an MySQL database with PDO. We as the consumer to pass basic informations to the constructor of the Database class so we can create a connection to the DB using our $pdo object.</p>
<p>The next key work is we want to pass parameter to our object to execute a query. This way, we can write only one query to use in different places and make sure that once the query runs properly, unexpected result can be caused only by bad parameters.</p>
<pre class="brush: php">

protected function parseSql($sqlElement, $params)
{
$sql = $this-&gt;pdo-&gt;prepare((string)$sqlElement);

if (!is_array($params))
$params = array($params);
try
{
for ($i = 1; $i &lt; = count($params); $i++)
{
//Replace null param by empty string for wellform SQL query
if ($params[$i-1] == null)
$params[$i-1] = &#039;&#039;;
$sql-&gt;bindValue($i, $params[$i-1]);
}
return $sql;
}
catch(Exception $ex)
{
echo &quot;Error while parsing SQL query.&lt;br /&gt;&quot;;
var_dump($sqlElement); echo &quot;&lt;br /&gt;&quot;;
var_dump($params); echo &quot;&lt;br /&gt;&quot;;
}
}</pre>
<p>From the code above, first of all you can notice the $sqlElement. It is actually not a string of SQL query but a SimpleXML text element  containing the SQL query and some other information our framework needs. We will talk about those XML files later but at this moment, we have to convert $sqlElement into string before use.</p>
<p>In order to pass params to a marked SQL query using PDO, you go through two steps. First, you ask PDO to prepare the query using the <strong>prepare() </strong>method and then use the prepared query to bind marked parameters with values using the <strong>bindValue()</strong> method.</p>
<p><strong>The PDO library provide you two binding functions, bindParam() and bindValue()</strong>. They are similar in binding mechanism but different in processing the result query. Both bind a PHP variable to a question mark or named param in a query and you can specify name, data type and also the length of the parameter. However, <strong>the bindParam hold a referent to the PHP variable you bind and the result query is evaluated only at runtime. bindValue() result an evaluated query immeidately</strong>.</p>
<pre class="brush: php">

protected function execute($sqlId, $params, &amp;$sql)
{
$sql = $this-&gt;parseSql($this-&gt;getSqlElement($sqlId), $params);
try
{
$sql-&gt;execute();
return true;
}
catch(Exception $ex)
{
echo &quot;Error while executing $sqlId &lt;br /&gt;$sql-&gt;errorInfo()&quot;;
}

}

protected function getSqlElement($sqlId)
{
$tmp = explode(&#039;.&#039;, $sqlId);
$sqlFile = SitePath . &#039;data&#039; . DIRSEP . $tmp[0] . &#039;.xml&#039;;

$root = simplexml_load_file($sqlFile);
foreach($root-&gt;sql as $sql)
{
if ($sql[&#039;Id&#039;] == $tmp[1])
return $sql;
}
return null;
}</pre>
<p>Back to our class, what we need now is where to get the SQL queries and how to execute one query after having it parsed with params. You may implement the SQL query resource in many different ways but for me, I prefer to put all SQL queries into XML files. That way, I <strong>never write SQL code in my PHP files</strong> meaning the code is very clean and easy to debug. I can also write and test my query first in a MySQL query client tool and the copy the tested code to my XML file, remove testing values with question marks so that I can pass to them the parameters I want from PHP code.</p>
<p>Writing SQL queries this way is a similar way of writing one-query-procedure. <strong>It is not only very reusable but also make the teamwork of many developers easy and help you deploy the system from testing environment to production environment quickly</strong>. Just forget about finding all PHP files where you have just change your SQL queries inside and copy them to another place.</p>
<p>Enough talk. Back to the XML and the getSqlElement function in our class. Our coding convention (which is very important in a PHP framework) is having the sqlId of two parts separated by a period (.). First part is the XML filename and the second part is the &#8216;id&#8217; of the SQL element in that file. <strong>We don&#8217;t want to put all queries into just one file because many developers can work on that file at the same time. Also we don&#8217;t want the getSqlElement function to look through a long text file just to find out a short SQL query to run</strong>. For your information, PDO cannot run as fast as pure PHP data manipulation function. It as rate at the second position, with the great Database library ADOdb.</p>
<p>Now, once we have the query from XML file, pass parameters to it, the execution is simple by calling <strong>execute()</strong> function in PDO. After execute, the $sql variable holds result data that you can fetch is in many different way.</p>
<p>I don&#8217;t like processing data rows and columns as array of array so I use PDO fetch object style. It&#8217;s easier for you whenever you pull data form the DB, they are in form of a &#8216;Model&#8217; object (in an MVC framework) and ready for you to call some logic function. That&#8217;s why we don&#8217;t process an array of columns just to create an object to continue our programming flow.</p>
<p>As you can see in the code below, except for querying data for just one column of the first returned row, we all fetch data as object or list of object. If we pass the class name of the object to the queryXXX function, it try to create an object of the desired class for us, otherwis it create a standard PHP object.</p>
<pre class="brush: php">

public function queryForColumn($sqlId, $params, $columnIndex, $defaultValue = null)
{
$sql = null;
$ret = $this-&gt;execute($sqlId, $params, $sql);
if ($ret === true)
return $sql-&gt;fetchColumn($columnIndex);
else
return $defaultValue;
}

public function queryForObject($sqlId, $params, $className = null, $defaultValue = null)
{
$sql = null;
$ret = $this-&gt;execute($sqlId, $params, $sql);
if ($ret === true)
{
if ($className != null)
$sql-&gt;setFetchMode(PDO::FETCH_CLASS, $className);
else
$sql-&gt;setFetchMode(PDO::FETCH_OBJ);

return $sql-&gt;fetch();
}
else
return $defaultValue;
}

public function queryForList($sqlId, $params, $className = null, $defaultValue = null)
{
$sql = null;
$ret = $this-&gt;execute($sqlId, $params, $sql);
if ($ret === true)
{
if ($className != null)
$sql-&gt;setFetchMode(PDO::FETCH_CLASS, $className);
else
$sql-&gt;setFetchMode(PDO::FETCH_OBJ);

return $sql-&gt;fetchAll();
}
else
return $defaultValue;
}</pre>
<p>I do like fetching data into named object as PHP5 provides magic getter/setter methods that make my class become more reusable from project to project. <strong>The idea is a map to translate columns in Database into properties in PHP code. That way, I never break my PHP coding standard no matter what the DB naming standard is. </strong> Another roughly example is in some websites you use email as the useranme while in others you really have an username column in the database beside the email column. In the first cases, I just map email to the Username property so my code to handle user related logic does not change else where.</p>
<p>Here is how to create an EntityBase class with magic setter function.</p>
<pre class="brush: php">

class EntityBase
{
/**
* @desc Column map for consistent entity property
*/
protected $columnMap = array();

public function __set($column, $value)
{
$property = $this-&gt;columnMap[$column];
$setter = &quot;set$property&quot;;
if (!method_exists($this, $setter))
$this-&gt;$property = $value;
else
$this-&gt;$setter($value);
}
}</pre>
<p>Last thing, we don&#8217;t want to call a function like queryForXXX to execute an action query like Insert/Update/Delete data. So we just add a simpe query() funtion for this task.</p>
<pre class="brush: php">

public function query($sqlId, $params)
{
$sql = null;
return $this-&gt;execute($sqlId, $params, $sql);
}
</pre>
<p>Now, we have an useful Database class and to use it, just create an users.xml file of queries like what I have for my simple demo blog site:</p>
<pre class="brush: xml">

&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;queries&gt;
&lt;sql Id=&quot;getUserById&quot;&gt;
Select *
From users
Where Id = ?
&lt;/sql&gt;

&lt;sql Id=&quot;validateUser&quot;&gt;
Select Count(Id)
From users
Where Email = ? AND Password = ?
&lt;/sql&gt;

&lt;sql Id=&quot;getIdByName&quot;&gt;
Select Id
From users
Where email = ?
&lt;/sql&gt;
&lt;/queries&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmadesimple.info/2008/02/10/building-a-data-access-layer-using-pdo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Installing Apache on Windows</title>
		<link>http://www.phpmadesimple.info/2008/01/17/installing-apache-on-windows/</link>
		<comments>http://www.phpmadesimple.info/2008/01/17/installing-apache-on-windows/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 07:09:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[level 1]]></category>

		<guid isPermaLink="false">http://artemis.com.vn/blogvui/?p=21</guid>
		<description><![CDATA[Because it&#8217;s the most popular web server in use, you might think that Apache is a complicated piece of software, but it&#8217;s not difficult at all.
Installing Apache for Windows is a simple task, due in great part to the installation wizard distributed by the Apache Group. While running any web server on a Windows operating [...]]]></description>
			<content:encoded><![CDATA[<p>Because it&#8217;s the most popular web server in use, you might think that Apache is a complicated piece of software, but it&#8217;s not difficult at all.</p>
<p>Installing Apache for Windows is a simple task, due in great part to the installation wizard distributed by the Apache Group. While running any web server on a Windows operating system is not as fast, stable, or secure as running a web server on a Linux/Unix machine. However, installing and configuring a development web server on a Windows-based operating system is perfectly acceptable, and is how most users get their start.<span id="more-21"></span></p>
<p>To download the Apache distribution for Windows, start at the Apache Server website, http://httpd.apache.org/, and follow the Download link. As of this writing, the current version is 2.0.49, so the file used as an example throughout this section is apache_2.0.49- win32-x86-no_ssl.msi. Once you have downloaded the installation file to your hard drive, double-click the file called apache_2.0.49-win32-x86-no_ssl.msi to start the installation wizard.</p>
<p>Note: When you are ask how to run Apache, choose the Run as Service for All Users radio button.</p>
<p>To run a basic test before moving forward to configuring your server, choose Program Files, Apache HTTP Server 2.0.49, Configure Apache Server, Test Configuration from the Windows Start menu. This will launch a console window showing a successful installation.</p>
<p>Configuring Apache on Windows<br />
The master configuration file for Apache is called httpd.conf, and it lives in the conf directory, within the Apache installation directory. So if your installation directory is C:\Program Files\Apache Group\Apache2\, the httpd.conf file will be in C:\Program Files\Apache Group\Apache2\conf\.</p>
<p>Two values you usually want to change are the listen on port and the document root.</p>
<pre class="brush: xml">
#Listen 12.34.56.78:80
Listen 8080
ServerName localhost:8080
</pre>
<p>By default Apache is installed to listen of default HTTP port 80. However, your Windows might has IIS (Internet Information Server) installed and takes that port already. The alternative port other developers love to use is 8080, like what I configured for my Apache.</p>
<pre class="brush: xml">

DocumentRoot &quot;D:/projects/www&quot;
</pre>
<p>By default, the document root where we will serve data for web client is Path_to_apache/htdocs. You may want to change it to an easier to access location on your development environment. Remember that Apache protect your hard drive data from web user, thus you have to change the permission for users to access your new DocumentRoot.</p>
<p><directory>
<pre class="brush: xml">
&lt;/directory&gt;&lt;directory &quot;D:/projects/www&quot;&gt;
#
# Possible values for the Options directive are &quot;None&quot;, &quot;All&quot;,
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that &quot;MultiViews&quot; must be named *explicitly* --- &quot;Options All&quot;
# doesn&#039;t give it to you.
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks Includes ExecCGI

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be &quot;All&quot;, &quot;None&quot;, or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
AllowOverride All

#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all

&lt;/directory&gt;
</pre>
<p>Restart your apache so that your new configuration can take effect. Now, you can test connect to Apache web server from web browser.</p>
<p>http://localhost OR<br />
http://localhost:8080 if you modify port that Apache listen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmadesimple.info/2008/01/17/installing-apache-on-windows/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using Zend components in your own web project</title>
		<link>http://www.phpmadesimple.info/2008/01/15/using-zend-components-in-your-own-web-project/</link>
		<comments>http://www.phpmadesimple.info/2008/01/15/using-zend-components-in-your-own-web-project/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 07:15:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[components]]></category>
		<category><![CDATA[level 2]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://artemis.com.vn/blogvui/?p=20</guid>
		<description><![CDATA[I am a fan of Prado but Zend framework takes my love with its set of components. Having an MVC framework with a higher level of intefration between Model &#8211; View &#8211; Controller is better than taking Zend basic MVC model into a real life project. However, using Zend components to complete common web features [...]]]></description>
			<content:encoded><![CDATA[<p>I am a fan of Prado but Zend framework takes my love with its set of components. Having an MVC framework with a higher level of intefration between Model &#8211; View &#8211; Controller is better than taking Zend basic MVC model into a real life project. However, using Zend components to complete common web features is a dream.</p>
<p>Zend components are not only easy to use but also designed with standards and deep thought. They are also very isolated so that coders are not required to use Zend MVC framework to use a component. Off course, there are some dependencies you have to take care of, for example, Zend_Authentication depends on Zend_Session or Zend_Feed depends on Zend_Http.<span id="more-20"></span>Zend library is about 13Mb in its latest release at this moment, contains the whole framework suite and examples.</p>
<ul>
<li>To download Zend framework: http://framework.zend.com/download</li>
<li>To download API and Programmer ref. guide: http://framework.zend.com/download/documentation/</li>
</ul>
<p>Here are steps to take Zend components in to use in my own project:</p>
<ol>
<li> Extract ZendFramework/library/Zend into my /includes folder. Actually, I put only components I need but if you don&#8217;t want to concern with component dependencies, put them all here.</li>
<li>Zend will make a lot of include file once you include one component into your code. So in order to forget this including process, create an __autoload() function for PHP5 to take of this inclusion.
<pre class="brush: php">
// For loading classes
function __autoload($class_name) {
$filename = $class_name . &#039;.php&#039;;
include_once($filename);
}
</pre>
</li>
<li>Then you have to add /includes/Zend into your include_path as you will don&#8217;t know where does a Zend component want to include its dependency or at least, you really don&#8217;t care.
<pre class="brush: php">
$includePath = get_include_path();
$includePath .= PATH_SEPARATOR . SitePath . &#039;includes&#039;;
$includePath .= PATH_SEPARATOR . SitePath . &#039;includes&#039; . DIRSEP . &#039;Zend&#039;;
$includePath .= PATH_SEPARATOR . SitePath . &#039;framework&#039;;
$includePath .= PATH_SEPARATOR . SitePath . &#039;data&#039; . DIRSEP . &#039;entities&#039;;
set_include_path($includePath);
</pre>
</li>
<li>Now, let&#8217;s test Zend_Feed component which requires Http, Uri, Validate, Exception and Loader</li>
</ol>
<pre class="brush: php">
require_once &#039;Zend/Feed.php&#039;;

// Fetch the latest Slashdot headlines
try {
$phpvnRss = Zend_Feed::import(&#039;http://artemis.com.vn/blogvui/?feed=rss2&#039;);
} catch (Zend_Feed_Exception $e) {
// feed import failed
echo &quot;Exception caught importing feed: {$e-&gt;getMessage()}\n&quot;;
exit;
}

// Initialize the channel data array
$channel = array(
&#039;title&#039; =&gt; $phpvnRss-&gt;title(),
&#039;link&#039; =&gt; $phpvnRss-&gt;link(),
&#039;description&#039; =&gt; $phpvnRss-&gt;description(),
&#039;items&#039; =&gt; array()
);

// Loop over each channel item and store relevant data
foreach ($phpvnRss as $item) {
$channel[&#039;items&#039;][] = array(
&#039;title&#039; =&gt; $item-&gt;title(),
&#039;link&#039; =&gt; $item-&gt;link(),
&#039;description&#039; =&gt; $item-&gt;description()
);
}

if (count($channel[&#039;items&#039;]))
{
echo &quot;&lt;ul&gt;&quot;;
for ($i = 0; $i &lt; 5 &amp;&amp; $i &lt; count($channel[&#039;items&#039;]); $i++)
{
$item = $channel[&#039;items&#039;][$i];
echo &#039;&lt;li&gt;&lt;a href=&quot;&#039; . $item[&#039;link&#039;] . &#039;&quot; target=&quot;_blank&quot;&gt;&#039;.$item[&#039;title&#039;].&#039;&lt;/a&gt;&#039;;
}
echo &quot;&lt;/ul&gt;&quot;;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmadesimple.info/2008/01/15/using-zend-components-in-your-own-web-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP training course</title>
		<link>http://www.phpmadesimple.info/2008/01/14/php-training-course/</link>
		<comments>http://www.phpmadesimple.info/2008/01/14/php-training-course/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 11:58:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[courses]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://artemis.com.vn/blogvui/?p=16</guid>
		<description><![CDATA[There are many PHP &#38; MySQL  books out there plus many free tutorial helpful for you. However, I choose the best roadmap for you by going the same road a PHP programmer goes for Zend PHP5 Certificate. You are not required to follow step by step and also on each step, I try to point [...]]]></description>
			<content:encoded><![CDATA[<p>There are many PHP &amp; MySQL  books out there plus many free tutorial helpful for you. However, I choose the best roadmap for you by going the same road a PHP programmer goes for Zend PHP5 Certificate. You are not required to follow step by step and also on each step, I try to point out some places that you may interested jumping to.</p>
<p>So, what you are going to learn are:</p>
<ul>
<li>Basic of PHP</li>
<li>Function, Array and basic programming classes (String, Date, Math, etc.)</li>
<li>More details about string and patterns</li>
<li>Web programming basis (HTML, CSS, Form, Session, JavaScript, etc.)</li>
<li>Object Oriented Programming (OOP)</li>
<li>Working with MySQL</li>
<li>Designing OOP web application</li>
<li><strong>A Simple MVC framework</strong></li>
<li>XML &amp; Web Service</li>
<li>Secure your web application</li>
<li>File and network resources</li>
<li>Compare PHP4 and PHP5</li>
<li>Overview of PHP web development engineering
<ul>
<li>PHP Frameworks (Zend, Symfony, Prado, CakePHP, CodeIgniter)</li>
<li>Advanced JavaScript</li>
<li>Introduce an online Project Management tool</li>
<li>Code generation</li>
<li>A coding convention reference</li>
</ul>
</li>
</ul>
<p>(*) Items with links show lessons are available.<br />
(**) Item with ($)  shows some advanced articles required subscription</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmadesimple.info/2008/01/14/php-training-course/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP developer toolset</title>
		<link>http://www.phpmadesimple.info/2008/01/14/php-developer-toolset/</link>
		<comments>http://www.phpmadesimple.info/2008/01/14/php-developer-toolset/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 10:03:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php tools]]></category>

		<guid isPermaLink="false">http://artemis.com.vn/blogvui/?p=15</guid>
		<description><![CDATA[A lot of beginners do not know what to use and where to start when begin with PHP, a open source programming language with no official support. PHP on its way spreading the world programming community come with many commercial tools to help developers more productive. Tools varies from small, cheap coding programs to very [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of beginners do not know what to use and where to start when begin with PHP, a open source programming language with no official support. PHP on its way spreading the world programming community come with many commercial tools to help developers more productive. Tools varies from small, cheap coding programs to very deluxe, expensive IDE with all of dreaming utility a PHP developer wish to have.  Here are a set of FREE but powerful tool I recommend for a PHP developer:</p>
<p><span id="more-15"></span></p>
<ul>
<li><strong>PHP eclipse</strong>: Based on Eclipse open source IDE, PHP eclipse is the best FREE IDE for coding with its own PHP parser, Apache webserver and debuger. Eclipse can also work with share projects using CVS source control. Speed can be problem as it runs on Java Runtime engine and you must care about new update.</li>
<li><strong>Zend Studio Neon Beta</strong>: Zend Studio release versions are commercial but the beta is free without some cool tools displayed each time you start.</li>
<li><strong>NuSphere  phpEd</strong>:  It will be my mistake if not mention this dreaming php coder IDE. Just one thing I don&#8217;t like about it is &#8230; the cost of ownership.</li>
<li><strong>SqlYog community version</strong>: SqlYog is the best choice for Windows users to manage MySQL database. Addressing almost every need of developers, this tool is much more better than MySQL administrator and MySQL Query created by MySQL.</li>
<li><strong>Navicat</strong>: Another MySQL GUI tool, support both Windows and Linux but it&#8217;s just best choice for Linux users as SQLYog has not support Linux yet.</li>
<li><strong>DBDesigner</strong>: FabForce DbDesigner is totally free database schema designer tool. DbDesigner can connect to a selected database on MySQL to reverse tables into design element and synchronize between your design and database.</li>
<li><strong>XAMPP</strong>: A very stable server suite including Apache 2.x, PHP5, MySQL 5 and FileZilla. XAMPP is available in both Windows and Linux</li>
<li><strong>XCHM</strong>: Most of manual are in CHM version and developers always need to refer to the manual while programming. Windows users do not have problem with .chm files but Linux users need a third party tool. Though there are many .chm reader for Linux, I found XCHM the most easy to use and install.</li>
<li><strong>FireFox web developer toolbar</strong>: an extremely helpful toolbar for FireFox, support you to view HTML code, show CSS and debug JavaScript.</li>
<li><strong>W3C validators</strong>: to ensure that generated HTML and CSS are following W3C standards, W3C help developers with their online tool to validate code and inspect errors.</li>
<li><strong>TortoiseSVN</strong>: SVN client for Windows. This tool helps developers using PHP Eclipse work with SVN servers as PHP Eclipse does not support SVN very well.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmadesimple.info/2008/01/14/php-developer-toolset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
