<?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>Minimizr.com &#187; PHP</title>
	<atom:link href="http://minimizr.com/blog/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://minimizr.com</link>
	<description>More With Less</description>
	<lastBuildDate>Sun, 28 Oct 2007 13:39:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Setup MAMP (Mac, Apache, MySQL And PHP) on Mac OS X 10.5 Leopard</title>
		<link>http://minimizr.com/blog/2007/10/setup-mamp-mac-apache-mysql-and-php-on-mac-os-x-105-leopard/</link>
		<comments>http://minimizr.com/blog/2007/10/setup-mamp-mac-apache-mysql-and-php-on-mac-os-x-105-leopard/#comments</comments>
		<pubDate>Sun, 28 Oct 2007 13:39:14 +0000</pubDate>
		<dc:creator>kristian</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Server]]></category>

		<guid isPermaLink="false">http://www.minimizr.com/blog/2007/10/setup-mamp-mac-apache-mysql-and-php-on-mac-os-x-105-leopard/</guid>
		<description><![CDATA[New Mac OS X 10.5 Leopard comes with new versions of Apache and PHP (Apache/2.2.6 (Unix) mod_ssl/2.2.6 OpenSSL/0.9.7l DAV/2 PHP/5.2.4), so it is quite easy to setup a MAMP server. Sure there are other ways to do the setup: You can build Apache, MySQL and PHP from sources, you can use MacPorts or you can [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>New Mac <a href="http://www.apple.com/macosx/leopard/">OS X 10.5 Leopard</a> comes with new versions of Apache and PHP (<code>Apache/2.2.6 (Unix) mod_ssl/2.2.6 OpenSSL/0.9.7l DAV/2 PHP/5.2.4</code>), so it is quite easy to setup a <a href="http://en.wikipedia.org/wiki/MAMP">MAMP</a> server. Sure there are other ways to do the setup: You can build <a href="http://httpd.apache.org/">Apache</a>, <a href="http://dev.mysql.com/">MySQL</a> and <a href="http://www.php.net/">PHP</a> from sources, you can use <a href="http://www.macports.org/">MacPorts</a> or you can use pre-build packages like <a href="http://www.mamp.info/">MAMP</a> or <a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a>. But in my opinion, because Apache and PHP are already installed, they are easy way to go and will minimize you work.</p>
<h2>Apache</h2>
<p>To enable pre-installed PHP, you have to edit httpd.conf file:</p>
<pre lang="bash">sudo vi /private/etc/apache2/httpd.conf</pre>
<p>And uncomment next line:</p>
<pre lang="apache">LoadModule php5_module libexec/apache2/libphp5.so</pre>
<p>If you want to make other configuration changes, for example define virtual hosts, it&#8217;s better to use user&#8217;s configuration file:</p>
<pre lang="bash">sudo vi /private/etc/apache2/users/[username].conf</pre>
<p>After making changes, restart Apache aka Web Sharing. Go to System Preferences > Sharing and unselect and select again Web Sharing. That&#8217;s it. Now you have the Apache and PHP running. If there are any problems, you can examine the Apache error_log. Go to Console > /var/log > apache2 > error_log.</p>
<h2>PHP</h2>
<p>If you want to make changes to php.ini, do the following. Copy php.ini.default to php.ini:</p>
<pre lang="bash">sudo cp /private/etc/php.ini.default /private/etc/php.ini</pre>
<p>And to make changes:</p>
<pre lang="bash">sudo chmod 644 /private/etc/php.ini
sudo vi /private/etc/php.ini
sudo chmod 444 /private/etc/php.ini</pre>
<p>After making changes don&#8217;t forget to restart Apache.</p>
<h2>MySQL</h2>
<p>MySQL is a little trickier. It is not pre installed in OS X and in my opinion easiest way is to use binary from MySQL.com. So, <a href="http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg">download</a> the current version, which is mysql-5.0.45-osx10.4-i686.pkg at the moment and install it. Then install MySQLStartupItem.pkg and copy MySQL.prefPane to OSX/Library/PreferencePanes. It seems to be that current versions preference pane is not quite compatible with OS X 10.5. It shows if the server is running or stopped, but you can&#8217;t star or stop with it. MySQL starts when the OS starts, but you can start or stop it manually from console:</p>
<pre lang="bash">sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop</pre>
<p>MySQL with default settings use socket in /tmp and pre-installed PHP presumes it to be in /var/mysql, so you have to update the location in php.ini:</p>
<pre lang="ini">mysql.default_socket = /tmp/mysql.sock</pre>
<p>Perhaps you could also use a symbolic link from /var/mysql/mysql.sock to tmp/mysql.soc. <a href="http://dev.mysql.com/downloads/gui-tools/5.0.html">MySQL GUI Tools</a> are also working nicely with new OS X 10.5.</p>
<h2>Mac OS X 10.5</h2>
<p>No you should have a MAMP server running nicely. If you want to make host name changes &#8211; for example you can use different names for localhost to take advantage Apache&#8217;s virtual hosting &#8211; edit hosts file:</p>
<pre lang="bash">sudo vi /private/etc/hosts</pre>
]]></content:encoded>
			<wfw:commentRss>http://minimizr.com/blog/2007/10/setup-mamp-mac-apache-mysql-and-php-on-mac-os-x-105-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minimal Web Services with XFire, Spring and PHP</title>
		<link>http://minimizr.com/blog/2006/11/minimal-web-services-with-xfire-spring-and-php/</link>
		<comments>http://minimizr.com/blog/2006/11/minimal-web-services-with-xfire-spring-and-php/#comments</comments>
		<pubDate>Mon, 13 Nov 2006 19:27:17 +0000</pubDate>
		<dc:creator>kristian</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[XFire]]></category>

		<guid isPermaLink="false">http://www.minimizr.com/blog/2006/11/minimal-web-services-with-xfire-spring-and-php/</guid>
		<description><![CDATA[If you have a Java web application implemented with Java 5 and Spring Framework, it is really easy to expose your POJOs as web services. In this example I use XFire and JSR 181 annotations for that. I&#8217;ll also make a small web service client example with PHP. The goal is to add web services [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>If you have a Java web application implemented with Java 5 and <strong><a href="http://www.springframework.org/">Spring</a></strong> Framework, it is really easy to expose your POJOs as web services. In this example I use <strong><a href="http://xfire.codehouse.org/">XFire</a></strong> and JSR 181 annotations for that. I&#8217;ll also make a small web service client example with <strong><a href="http://www.php.net/">PHP</a></strong>. The goal is to add web services to the existing Java code with absolute minimal code addition. I was about to add web service authentication with Acegi Security, but instead for now, there is no authentication in this example.</p>
<p>XFire has a quite versatile but scarce <a href="http://xfire.codehaus.org/User%27s+Guide">user&#8217;s guide</a>. But it is a good start, so start with <a href="http://xfire.codehaus.org/Overview">overview</a> and quick start. Add XFire libraries and the depencies with the help of a <a href="http://xfire.codehaus.org/Dependency+Guide">Depency quide</a>. This example works at least with the following libraries:</p>
<table>
<tr>
<td valign="top">
<ul>
<li>xfire-all-1.2.2</li>
<li>activation-1.1</li>
<li>commons-codec-1.3</li>
<li>commons-httpclient-3.0</li>
<li>commons.logging-1.0.4</li>
<li>mail-1.4</li>
<li>jaxen-1.1-beta-9</li>
<li>jdom-1.0</li>
</ul>
</td>
<td valign="top">
<ul>
<li>junit-3.8.1</li>
<li>servlet-api-2.3</li>
<li>spring-2.0</li>
<li>stax-api-1.0.1</li>
<li>wsdl4j-1.5.2</li>
<li>xbean-spring-2.5</li>
<li>wstx-3.0.1</li>
<li>XmlSchema-1.1</li>
</ul>
</td>
<td valign="top">
<ul>
<li>xfire-jsr181-api-1.0-M1</li>
<li>jaxb-xjc-2.0.1</li>
<li>jaxb-impl-2.0.1</li>
<li>jaxb-api-2.0</li>
<li>aopalliance-1.0</li>
<li>commons-beanutils-1.7.0</li>
</ul>
</td>
</tr>
</table>
<p>XFire 1.2.2 package comes with xbean-spring-2.6. There can be some <a href="http://forum.springframework.org/showthread.php?t=29867">problems</a> with that version but at least version 2.5 is working with Spring 2.0.</p>
<p>First, add <strong>xfire-servlet.xml</strong> into WEB-INF directory. Here are the default settings from the user&#8217;s manual:</p>
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
    <bean id="jaxbTypeMappingRegistry"
        class="org.codehaus.xfire.jaxb2.JaxbTypeRegistry"
        init-method="createDefaultMappings" singleton="true"/>
    <bean id="webAnnotations"
        class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"/>
    <bean id="handlerMapping"
        class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">
<property name="typeMappingRegistry">
        <ref bean="jaxbTypeMappingRegistry"/>
      </property>
<property name="xfire">
        <ref bean="xfire"/>
      </property>
<property name="webAnnotations">
        <ref bean="webAnnotations"/>
      </property>
    </bean>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
          <entry key="/">
            <ref bean="handlerMapping"/>
          </entry>
        </map>
</property>
    </bean>
</beans>
</pre>
<p>Add xfire-servlet.xml  into the Spring&#8217;s contextConfigLocation and XFireServlet in <strong>web.xml</strong> file:</p>
<pre lang="xml">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
    /WEB-INF/applicationContext.xml
    /WEB-INF/xfire-servlet.xml
  </param-value>
</context-param>

<servlet>
  <servlet-name>XFireServlet</servlet-name>
  <display-name>XFire Servlet</display-name>
  <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>XFireServlet</servlet-name>
  <url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>XFireServlet</servlet-name>
  <url-pattern>/services/v1/*</url-pattern>
</servlet-mapping>
</pre>
<p>Let&#8217;s have a simply <strong>MinimizrFacade.java</strong> Java interface:</p>
<pre lang="java">
package com.minimizr.service;

import java.util.List;
import com.minimizr.service.domain.ExampleObject;

public interface MinimizrFacade {
  String getString();
  String echoString(String string);
  ExampleObject echoObject(ExampleObject exampleObject);
  List<exampleObject> loadExampleObjectList();
}
</pre>
<p>And let&#8217;s have another <strong>MinimizrService.java</strong> Java interface for web services:</p>
<pre lang="java">
package com.minimizr.service;

import java.util.List;
import javax.jws.WebService;
import com.minimizr.service.domain.ExampleObject;

@WebService
public interface MinimizrService {
  String getString();
  String echoString(String string);
  ExampleObject echoObject(ExampleObject exampleObject);
  List<exampleObject> loadExampleObjectList();
}
</pre>
<p>And for this example a <strong>ExampleObject.java</strong> Java object:</p>
<pre lang="java">
package com.minimizr.service;

public class ExampleObject {
  private String name;
  private Integer age;

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
</pre>
<p>And finally a <strong>MinimizrImpl.java</strong> Java implementation for the interfaces:</p>
<pre lang="java">
package com.minimizr.domain.logic;

import java.util.List;
import javax.jws.WebService;
import com.minimizr.service.ExampleObject;
import com.minimizr.service.MinimizrService;

@WebService(serviceName = "MinimizrService",
    endpointInterface = "com.minimizr.service.MinimizrService")
public class MinimizrImpl implements MinimizrFacade, MinimizrService {
  public String getString() {
    return "Example string";
  }

  public String echoString(String string) {
    return string;
  }

  public ExampleObject echoObject(ExampleObject exampleObject) {
    return exampleObject;
  }

  public List loadExampleObjectList() {
    /* Here you would get list of ExampleObjects for example from database
    and return it instead of null */
    return null;
  }
}
</pre>
<p>XFire does not support <a href="http://jira.codehaus.org/browse/XFIRE-425">RPC-encoding</a> but you can use <a href="http://docs.codehaus.org/display/XFIRE/PHP+Interoperation">XFire web services with PHP</a> with document/literal style of SOAP.</p>
<p>Here is a really simple example to use all the exposed java web services in this example with <a href="http://sourceforge.net/projects/nusoap/">NuSOAP</a> PHP SOAP library. There are <ins datetime="2006-12-02T13:42:02+00:00">no</ins> checks for errors in the code:</p>
<pre lang="php">
<?php
require("../lib/nusoap.php");
$soapClient = new soapclient(
    "http://www.minimizr.com/ws/services/v1/MinimizrService?wsdl", "wsdl");
$proxyClass = $soapClient->getProxy();

// getString
$string = $proxyClass->getString();
print("<b>String:</b> " . $string["out"] . "
<hr/>");

// echoString
$string = $proxyClass->echoString(array("in0" => "ABC"));
print("<b>String:</b> " . $string["out"] . "
<hr/>");

// echoObject
$requestObject = array("name" => "John", "age" => 50);
$result = $proxyClass->echoObject(array("in0" => $requestObject));
$resultObject = $result["out"];
print("<b>Object:</b> name: " . $resultObject["name"]);
print(", age: " . $resultObject["age"] . "
<hr/>");

// loadExampleObjectList
$exampleObjectList = $proxyClass->loadExampleObjectList();
foreach ($exampleObjectList["out"]["ExampleObject"] as $key => $value) {
  print($value["name"] . " " . $value["age"] . "<br/>");
}
?>
</pre>
<h4>Authentication</h4>
<p><em>Added November 14, 2006</em>: Well, easiest and most straightforward way to secure web service is to use HTTP Authentication. It doesn&#8217;t need any additional code in the server side. While still looking for solution to use easily Acegi Security, I&#8217;ll add HTTP Authentication to this example. On the server side you&#8217;ll have to add security constraint into <strong>web.xml</strong>:</p>
<pre lang="xml">
<security-constraint>
  <web-resource-collection>
    <web-resource-name>Protected Minimizr Web Services</web-resource-name>
    <url-pattern>/services/v1/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>minimizr.webservices.client</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>Minimizr Realm</realm-name>
</login-config>

<security-role>
  <description>Required roles to use the Web Services</description>
  <role-name>minimizr.webservices.client</role-name>
</security-role>
</pre>
<p>And couple more lines into the PHP file. Credentials must be added into the wsdl url and proxy class. Notice that it is quite necessary to use SSL connection (https) with basic authentication since username and password are in clear text. You can use useHTTPPersistentConnection method to use persistent connection, if possible:</p>
<pre lang="php">
<?php
require("../lib/nusoap.php");

$username = "username";
$password = "password";
$method = "basic";

$soapClient = new soapclient(
  "https://$username:$password@www.minimizr.com/ws/services/v1/MinimizrService?wsdl",
  "wsdl");
$proxyClass = $soapClient->getProxy();
$proxyClass->setCredentials($username, $password, $method);
$proxyClass->useHTTPPersistentConnection();
...
</pre>
<h4>Conclusion</h4>
<p>It is no brainer to expose Java POJOs as web services with Spring, XFire and JSR-181 annotations. And it is as easy use those web services with Java or PHP or other platforms. I guess integrating <a href="http://www.acegisecurity.org/">Acegi Security</a> with XFire web services needs a little bit more work. Any suggestions for the easiest way to implement it?</p>
<h4>Additional recourses</h4>
<ul>
<li><a href="http://www.logemann.org/blojsom/blog/default/2006/05/26/Webservices-with-Spring-XFire-and-jsr181.html">Webservices with Spring, XFire and jsr181</a></li>
<li><a href="http://www.memestorm.com/blog/basic-spring-web-services-with-xfire-and-jsr-181/">Basic Spring Web services with XFire and JSR 181</a></li>
<li><a href="http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire"> Spring, Hibernate, and XFire</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://minimizr.com/blog/2006/11/minimal-web-services-with-xfire-spring-and-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minimal How to Use Google Maps API With PHP</title>
		<link>http://minimizr.com/blog/2006/10/minimal-how-to-use-google-maps-api-with-php/</link>
		<comments>http://minimizr.com/blog/2006/10/minimal-how-to-use-google-maps-api-with-php/#comments</comments>
		<pubDate>Sat, 21 Oct 2006 13:39:35 +0000</pubDate>
		<dc:creator>kristian</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.minimizr.com/blog/2006/10/minimal-how-to-use-google-maps-api-with-php/</guid>
		<description><![CDATA[The goal of this how to is to easily add multiple markes into the map on your own site using Google Maps API and PHP. Google Maps API key If you don&#8217;t already have, sign up for the Google Account. Sign up for the Google Maps API key. Read at least the higlights from the [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://www.google.com/apis/maps/"><img id="image35" src="http://www.minimizr.com/wp-content/uploads/minimizr.com/2006/10/post-google-maps-php.gif" alt="Google Maps" style="float:right;margin-left:10px;"/></a><span class="summary"><strong>The goal of this how to is to easily add multiple markes into the map on your own site using Google Maps API and PHP.</strong></span></p>
<h4>Google Maps API key</h4>
<ol>
<li>If you don&#8217;t already have, sign up for the <a href="http://www.google.com/accounts/">Google Account</a>.</li>
<li>Sign up for the <a href="http://www.google.com/apis/maps/signup.html">Google Maps API key.</a> Read at least the higlights from the Google Maps API terms. Sign up for your site, forexample <em>http://www.mysite.com/</em></li>
</ol>
<p>After sign up you&#8217;ll get your key and an example html code. If you lost your key anytime, you can sign up again for the same site and use a new key. You can also sign up for multiple sites keys if needed. You&#8217;ll get different key for each site.</p>
<h4>JavaScript</h4>
<p>To add multiple markers on your map we&#8217;ll use some basic PHP code. Google&#8217;s example code is a good starting point for this:</p>
<pre lang="html4strict">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
  Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;
    charset=utf-8"/>

    <script src="http://maps.google.com/maps?
      file=api&amp;v=2&amp;key=ABCDEFGH..."
      type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
    function load() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(
        document.getElementById("map"));
        map.setCenter(
        new GLatLng(37.4419, -122.1419), 13);
      }
    }
    //]]&gt;
    </script>
  </head>
  <body onload="load()" onunload="GUnload()">
<div id="map"
    style="width: 500px; height: 300px"></div>

  </body>
</html>
</pre>
<p>You have your API key on the html head and JavaScript to load on page load and div element to show the map. With map.setCenter(new GLatLng(37.4419, -122.1419), 13) you define the map&#8217;s center point and the zoom level. Here is an <a href="http://www.minimizr.com/example/2006/10/minimal-how-to-google-maps-api-with-php-1.php">example</a>.</p>
<p>To have some controls in the map, add this line into JavaScript load funtion:</p>
<pre>map.addControl(new GSmallMapControl());</pre>
<p>Add this JavaScript function to make markers:</p>
<pre lang="javascript">
function createMarker(point, text, title) {
  var marker = new GMarker(point,{title:title});
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(text);
  });
  return marker;
}
</pre>
<p>Add marker with this code:</p>
<pre lang="javascript">
var marker = createMarker(
new GLatLng(37.4419, -122.1419),
'Marker text', 'Example Title text');
map.addOverlay(marker);
</pre>
<p>Note that you can add in the markers any html code like links and images for example. So, the code looks now like this:</p>
<pre lang="html4strict"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
  Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;
    charset=utf-8"/>

    <script src="http://maps.google.com/maps?
      file=api&amp;v=2&amp;key=ABCDEFGH..."
      type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
    function load() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(
        document.getElementById("map"));
        map.addControl(new GSmallMapControl());
        map.setCenter(
        new GLatLng(37.4419, -122.1419), 13);
        function createMarker(point, text, title) {
          var marker =
          new GMarker(point,{title:title});
          GEvent.addListener(
          marker, "click", function() {
            marker.openInfoWindowHtml(text);
          });
          return marker;
        }
        var marker = createMarker(
        new GLatLng(37.4419, -122.1419),
        'Marker text', 'Example Title text');
        map.addOverlay(marker);
      }
    }
    //]]&gt;
    </script>
  </head>
  <body onload="load()" onunload="GUnload()">
<div id="map"
    style="width: 500px; height: 300px"></div>

  </body>
</html>
</pre>
<p>Here is an <a href="http://www.minimizr.com/example/2006/10/minimal-how-to-google-maps-api-with-php-2.php">example</a>.</p>
<h4>PHP</h4>
<p>In order to add multiple markes, we&#8217;ll use some PHP to iterate over some marker points. Let&#8217;s use an array in this example, but you could get the marker points for example from database or xml file. Put the following lines around marker adding lines:</p>
<pre lang="php">
<?php
$points = Array(1 => "37.4389, -122.1389",
2 => "37.4419, -122.1419",
3 => "37.4449, -122.1449");
foreach ($points as $key => $point) {
?>
var marker = createMarker(
new GLatLng(<?php echo $point ?>),
'Marker text <?php echo $key ?>',
'Example Title text <?php echo $key ?>');
map.addOverlay(marker);
<?php } ?>
</pre>
<p>And here is the final code:</p>
<pre lang="html4strict">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
  Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html;
    charset=utf-8"/>

    <script src="http://maps.google.com/maps?
      file=api&amp;v=2&amp;key=ABCDEFGH..."
      type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
    function load() {
      if (GBrowserIsCompatible()) {
        var map = new GMap2(
        document.getElementById("map"));
        map.addControl(new GSmallMapControl());
        map.setCenter(
        new GLatLng(37.4419, -122.1419), 13);
        function createMarker(point, text, title) {
          var marker =
          new GMarker(point,{title:title});
          GEvent.addListener(
          marker, "click", function() {
            marker.openInfoWindowHtml(text);
          });
          return marker;
        }
        <?php
        $points = Array(
        1 => "37.4389, -122.1389",
        2 => "37.4419, -122.1419",
        3 => "37.4449, -122.1449");
        foreach ($points as $key => $point) {
        ?>
        var marker = createMarker(
        new GLatLng(<?php echo $point ?>),
        'Marker text <?php echo $key ?>',
        'Example Title text <?php echo $key ?>');
        map.addOverlay(marker);
        <?php } ?>
      }
    }
    //]]&gt;
    </script>
  </head>
  <body onload="load()" onunload="GUnload()">
<div id="map"
    style="width: 500px; height: 300px"></div>

  </body>
</html>
</pre>
<p>And here is the final <a href="http://www.minimizr.com/example/2006/10/minimal-how-to-google-maps-api-with-php-3.php">example</a>.</p>
<p>If you have let&#8217;s say hundereds or thousands and more markers in your map, you might want to give a try to <a href="http://www.acme.com/javascript/#Clusterer">Clusterer</a>. It is an excellent and easy to use JavaScript library by Jef Poskanzer.</p>
<p>This how to showed only very basic usage of Google Maps API. To learn more Google Maps API has a good <a href="http://www.google.com/apis/maps/documentation/">documentation</a> and <a href="http://www.econym.demon.co.uk/">Mike</a> has many excellent <a href="http://www.econym.demon.co.uk/googlemaps/index.htm">examples</a> of the basics and more andvanced stuff.</p>
]]></content:encoded>
			<wfw:commentRss>http://minimizr.com/blog/2006/10/minimal-how-to-use-google-maps-api-with-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
