<?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>Marcos Fernández &#187; php</title>
	<atom:link href="http://www.marcosdev.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcosdev.com</link>
	<description>Programación de páginas web</description>
	<lastBuildDate>Mon, 28 Sep 2009 07:59:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ZCE PHP 5 conseguido</title>
		<link>http://www.marcosdev.com/zce-php-5-conseguido/</link>
		<comments>http://www.marcosdev.com/zce-php-5-conseguido/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 07:57:58 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=75</guid>
		<description><![CDATA[Después de mucho tiempo, vuelvo a postear en mi blog, y en este caso, es para decir que al final, después de una odisea, he conseguido el título de certificación de PHP5 ( Zend Certified Engineer PHP5). Todo ha sido más largo de lo que debería no por no querer presentarme al examen, ya que [...]]]></description>
			<content:encoded><![CDATA[<p>Después de mucho tiempo, vuelvo a postear en mi blog, y en este caso, es para decir que al final, después de una odisea, he conseguido el título de certificación de PHP5 ( Zend Certified Engineer PHP5). Todo ha sido más largo de lo que debería no por no querer presentarme al examen, ya que tenía cita para Julio, si no por que no me dejaron hacerlo. Os resumo mi pequeña odisea:</p>
<ul>
<li>Pido cita (día y hora para hacer el examen a través de la página de Pearson VUE que es la empresa encarga de autorizar centros para la realización del exámen)</li>
<li>Cuadro la cita con mis vacaciones</li>
<li>Dos días antes del examen, repaso y hago exámenes de pruebas (se pueden comprar en la página de Zend)</li>
<li>Me presento en el centro. Me tienen 30 minutos de reloj esperando para al final decirme que no puedo hacer el exámen ya que, según ellos, los de Pearson Vue han cambiado el programa y desde entonces, a ellos no les funcionan por no se cuantas escusas más.</li>
<li>Me traslado a mi pueblo e intento cambiar el examen, pero ya no me dejan por que ya ha pasado.</li>
<li>Tengo que llamar varias veces hasta contactar con Pearson (más vale que habléis inglés si os pasa esto) para realizar la reclamación. Tengo que mandar un e-mail a una dirección determinada.</li>
<li>Mando el e-mail y contactan conmigo dos días después. Hablan con el centro y en teoría en una o dos semanas estará todo arreglado.</li>
<li>Pasan las semanas, mando e-mail sin respuestas hasta que estallo y mando un e-mail acordándome de ciertos parientes. A este e-mail si que recibo respuesta. Intercambio de e-mail con tono tenso.</li>
<li>Busco centro en Madrid (agosto), llamo al centro pero hasta septiembre está cerrado y no me pueden dar información.</li>
<li>Llamo el 2 de septiembre y me comunican que el sistema funciona correctamente y puedo realizar el examen.</li>
<li>Programo viaje para finales de septiembre (y de paso de turismo).</li>
<li>Por fin hago el examen el 25 de septiembre en el centro Azpe de Madrid.</li>
<li>Apruebo!!!!</li>
</ul>
<p>Cómo podéis comprobar, el camino ha sido largo, pero bueno, ya se ha acabado y ahora toca prepararse para el SCJP de Java.</p>
<p>En cuanto al examen, lo que os puedo contar es que es algo más difícil que los de test, principalmente por que aparecen cuestiones referentes a funciones que no están incluidas en el libro de preparación de Apress. No os puedo contar más ya que te hacen firmar que no comentes nada sobre el examen. De todas formas, si os preparáis bien y lleváis bien controlado todo lo que aparece en el libro de Apress, (y mucha práctica, por supuesto), no tendréis problemas para sacaros la certificación.</p>
<p>En cuanto al lugar y forma de realizar el examen, pues lo más resañable sería que cuando lleguéis os verificarán vuestra identidad mediante la solicitación de dos documentos identificativos, luego os pedirán firmar algún documento, iréis a un habitáculo cerrado con cámara, no se puede entrar con ningún objeto personal, ni incluso el reloj. La pantalla del programa de preguntas es toda blanca y podréis revisar todas las preguntas en cualquier momento hasta al hacer clic sobre el botón de evaluar, y por supuesto, todo en inglés.</p>
<p>Espero que más o menos, os haya aclarado un poco la idea del examen.</p>
<p>Un saludo y ánimo a todos</p>
<p>P.D.: aquí os dejo el logotipo con el enlace al perfil mi certificación</p>
<div class="wp-caption alignnone" style="width: 83px"><a href="http://www.zend.com/en/yellow-pages#show-ClientCandidateID=ZEND011172"><img title="ZCF PHP 5" src="http://www.zend.com/img/yellowpages/php5_zce_logo_new.gif" alt="Haz clic en el logo para ver mi perfil" width="73" height="68" /></a><p class="wp-caption-text">Haz clic en el logo para ver mi perfil</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/zce-php-5-conseguido/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Preparando certificación Zend de PHP 5</title>
		<link>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/</link>
		<comments>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/#comments</comments>
		<pubDate>Sun, 10 May 2009 10:29:10 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=72</guid>
		<description><![CDATA[Durante estos meses he estado muy ausente del blog. He cambiado de trabajo y  tecnologías con las que tener que programar, y por si fuera poco, también he cambiado de casa, con lo que todo ello conlleva. Además, no se si por el constructor o por telefónica, no tengo línea de ADSL, y estoy con [...]]]></description>
			<content:encoded><![CDATA[<p>Durante estos meses he estado muy ausente del blog. He cambiado de trabajo y  tecnologías con las que tener que programar, y por si fuera poco, también he cambiado de casa, con lo que todo ello conlleva. Además, no se si por el constructor o por telefónica, no tengo línea de ADSL, y estoy con un truñete sistema de internet a través de 3G.</p>
<p>Pero, a lo que iba en este post: <a title="Certificación Zend de PHP" href="http://www.zend.com/en/services/certification/">la certificación Zend de PHP</a>. He comenzado a prepararme seriamente dicha certificación que tenía en mente hace ya mucho tiempo. He comprado el Voucher (ticket para poder hacer el examen) y 5 exámenes de prueba. Tengo previsto realizar la prueba dentro un mes, durante junio probablemente. El examen se puede realizar en cualquier centro Vue autorizado y consiste en 70 preguntas tipo test, multiselección o de escritura, durante un tiempo máximo de 90 minutos. El <a title="Temario Certificación Zend PHP" href="http://www.zend.com/en/services/certification/php-5-certification/">temario</a> intenta contemplar todos los ámbitos de PHP, he incluso diferencias entre la versión 4 y la 5. Una vez superada la prueba, tu perfil aparece en un <a title="Páginas amarillas certificados por Zend" href="http://www.zend.com/en/yellow-pages">listado</a> en la página de Zend, con la gente que ha aprobado el examen, y cuya finalidad es de que si alguna empresa necesita de un programador PHP certificado, pueda ser fácil encontrarlo. Además, te ofrecen colocar un <a title="Logo certificados por Zend" href="http://www.zend.com/services/certification/zce-logo">logo de la certificación</a> enlazado con tu perfil de usuario dentro de Zend. El porcentaje de preguntas aprobadas necesarias para poder aprobar el examen, no lo he encontrado en ningún sitio, así que no puedo dar detalles sobre ese tema.</p>
<p>Dentro de unos días, tengo intención de continuar escribiendo tutoriales que nos ayuden con el día a día, dentro de nuestro mundo de la programación web.</p>
<p>Un saludo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos (IV)</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 08:26:33 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=57</guid>
		<description><![CDATA[Este va a ser el último tip para ir mejorando nuestra clase. Durante todo el recorrido hemos podido ver una evolución de nuestra clase, ganando abstracción, ganando flexibilidad y ahora vamos a ganar capacidad gestión de errores.

Un problema que podemos tener al trabajar con nuestra base de datos, es que ésta no esté disponible en [...]]]></description>
			<content:encoded><![CDATA[<p>Este va a ser el último tip para ir mejorando nuestra clase. Durante todo el recorrido hemos podido ver una evolución de nuestra clase, ganando abstracción, ganando flexibilidad y ahora vamos a ganar capacidad gestión de errores.</p>
<p><span id="more-57"></span></p>
<p>Un problema que podemos tener al trabajar con nuestra base de datos, es que ésta no esté disponible en un momento determinado por que esté sobrecargada o por que no hay posibilidad de conexión. Por ello, debemos controlar que si no tenemos conexión a la base de datos, la ejecución de nuestra aplicación sea detenida inmediatamente (en el caso de que el uso de la base de datos sea crítico y nuestra aplicación sea 100% dependiente de la conexión a la base de datos.</p>
<p>Existen multitud de formas de controlar y gestionar los errores. PHP nos da ciertas herramientas para intentar capturar estas situaciones. En el ejemplo vamos a utilizar la función <a title="Detalle de la función exit de PHP" href="http://es2.php.net/manual/es/function.exit.php"><em><strong>exit</strong></em></a>, que permite detener inmediatamente la ejecución de nuestro script, y también la función <a title="Detalle de la función error_log de PHP" href="http://es2.php.net/error_log"><em><strong>error_log</strong></em></a> que permite registrar en el log de errores de nuestro servidor web un evento, en nuestro caso, una frase identificadora para que podamos saber cúando ha pasado el problema. Si tenemos un hosting contratado (no un servidor dedicado), es prácticamente seguro que no tendremos acceso al fichero de logs del servidor web, pero lo bueno de esta función es que también es capaz de guardar el registro que nosotros queramos en un derminado fichero o incluso mandar un e-mail a una determinada cuenta. Recomiendo mirar la documentación por que además de las capacidades citadas, permite más opciones, las cuales puedes ser muy útiles para nuestra aplicación.</p>
<p>Lo que vamos a hacer es modificar la función pública conectar() de la clase Db. En dicha función vamos a detectar si nuestra conexión ha fallado, y si se da el caso, registrar dicho error para luego diagnosticar el problema, además de mostrar un error por pantalla avisando al visitante de existe un problema con nuestra aplicación.</p>
<pre>
<pre class="brush: php">
/*Realiza la conexión a la base de datos.*/
private function conectar(){
   switch ($this-&gt;tipo){
      case &#039;mysql&#039;:       $link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
                          if ($link){
                             mysql_select_db($this-&gt;base_datos,$this-&gt;link);
                             @mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
                          }
                          break;

      case &#039;postgress&#039;:   $this-&gt;link=pg_connect(&quot;host=&quot;.$this-&gt;servidor.&quot; dbname=&quot;.$this-&gt;base_datos.&quot; user=&quot;.$this-&gt;usuario.&quot; password=&quot;.$this-&gt;password)
                          break;
      break;
   }
   if (!$link){
      error_log(0,&#039;Problema de conexión a la base de datos.&#039;);
      exit(&#039;Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos&#039;);
   }else{
      $this-&gt;link=$link;
   }
}
</pre>
</pre>
<p><a title="Ficheros de ejemplo" href="http://www.marcosdev.com/ejemplos/clase-base-de-datos-iv/archivos.zip">Descargar fichero Db.class.php actualizado (en formato UTF8)</a></p>
<p>Con esto ponemos fin a una pequeña colección de tips. Espero que esto les haya servidor para ir aprendiendo como poder crear y desarrollar una clase, utilizar un patrón de diseño y crear niveles de abastracción.</p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">Crear una clase para conectar a la base de datos</a></p>
<p><a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">Crear una clase para conectar a la base de datos (II)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (III)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/">Crear una clase para conectar a la base de datos (III)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos (III)</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 00:23:20 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=51</guid>
		<description><![CDATA[Continuemos mejorando nuestra clase. En el último tip, creamos una clase nueva para leer un fichero de configuración. Este fichero contenía los valores que nos interesase para realizar la conexión a la base de datos. Luego estuvimos adaptando el fichero de conexión a la base de datos para que fuera capaz de instanciar el objeto [...]]]></description>
			<content:encoded><![CDATA[<p>Continuemos mejorando nuestra clase. En el <a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">último tip</a>, creamos una clase nueva para leer un fichero de configuración. Este fichero contenía los valores que nos interesase para realizar la conexión a la base de datos. Luego estuvimos adaptando el fichero de conexión a la base de datos para que fuera capaz de instanciar el objeto Conf y pudiera tener acceso a los datos necesarios para realizar la conexión.</p>
<p>En esta siguiente parte del tutorial vamos a realizar una sencilla mejora para hacer que nuestra clase sea capaz de conectarse a diferentes tipos de base de datos. En concreto vamos a ver cómo adaptarla para que se conecte a PostgreSQL.</p>
<p><span id="more-51"></span></p>
<p>Lo primero que debemos realizar es agregar una nueva variable a nuestro fichero de configuración:</p>
<p>config.php</p>
<pre>
<pre class="brush: php">

//Datos de configuración de la conexión a la base de datos

//Servidor
$host=&#039;localhost&#039;;

//Usuario
$user=&#039;user&#039;;

//Password
$password=&#039;test&#039;;

//Base de datos a utilizar
$db=&#039;testDB&#039;;

//Qué sistema gestor de base de datos utilizamos, mysql, oracle, ...
$dbType=&#039;mysql&#039;
</pre>
</pre>
<p>Podemos observar una nueva última variable llamada dbType la cual utilizaremos para saber que tipo de base de datos vamos a utilizar.</p>
<p>Ahora vamos a adaptar nuestra clase Conf para que lea dicho valor y lo guarde ($_dbType). Además agregaremos una función getDBType() para poder obtener dicho valor.</p>
<p>Conf.class.php</p>
<pre>
<pre class="brush: php">
Class Conf{
   private $_domain;
   private $_userdb;
   private $_passdb;
   private $_hostdb;
   private $_db;
   private $_dbType;

   private static $_instance;

   private function __construct(){
      require &#039;config.php&#039;;
      $this-&gt;_domain=$domain;
      $this-&gt;_userdb=$user;
      $this-&gt;_passdb=$password;
      $this-&gt;_hostdb=$host;
      $this-&gt;_db=$db;
      $this-&gt;_dbType=$dbType;
   }

   private function __clone(){ }

   private function __wakeup(){ }

   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   public function getUserDB(){
      $var=$this-&gt;_userdb;
      return $var;
   }

   public function getHostDB(){
      $var=$this-&gt;_hostdb;
      return $var;
   }

   public function getPassDB(){
      $var=$this-&gt;_passdb;
      return $var;
   }

   public function getDB(){
      $var=$this-&gt;_db;
      return $var;
   }

   public function getDBType(){
	  $var=$this-&gt;_dbType;
	  return $var;
   }

}
</pre>
</pre>
<p>Por último los cambios más significativos vienen dentro de nuestra clase Db. Dentro de las funciones de conectar, ejecutar una query y obtener una fila de resultados es dónde podemos ver cómo en función del  valor tipo de base de datos, la clase utiliza unas funciones u otras.</p>
<p>Db.class.php</p>
<pre>
<pre class="brush: php">

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private $servidor;
   private $usuario;
   private $password;
   private $base_datos;
   private $tipo;
   private $link;
   private $stmt;
   private $array;

   private static $_instance;

   /*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   private function __construct(){
      $this-&gt;setConexion();
      $this-&gt;conectar();
   }

   /*Método para establecer los parámetros de la conexión*/
   private function setConexion(){
      $conf = Conf::getInstance();
      $this-&gt;servidor=$conf-&gt;getHostDB();
      $this-&gt;base_datos=$conf-&gt;getDB();
      $this-&gt;usuario=$conf-&gt;getUserDB();
      $this-&gt;password=$conf-&gt;getPassDB();
      $this-&gt;tipo=$conf-&gt;getDBType();
   }

   /*Evitamos el clonaje del objeto. Patrón Singleton*/
   private function __clone(){ }

   private function __wakeup(){ }

   /*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   /*Realiza la conexión a la base de datos.*/
   private function conectar(){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     $this-&gt;link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
	                   mysql_select_db($this-&gt;base_datos,$this-&gt;link);
	                   @mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
			   break;

       case &#039;postgress&#039;:   $this-&gt;link=pg_connect(&quot;host=&quot;.$this-&gt;servidor.&quot; dbname=&quot;.$this-&gt;base_datos.&quot; user=&quot;.$this-&gt;usuario.&quot; password=&quot;.$this-&gt;password)
		           break;
       break;
      }
   }

   /*Método para ejecutar una sentencia sql*/
   public function ejecutar($sql){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     $this-&gt;stmt=mysql_query($sql,$this-&gt;link);
			   break;
         case &#039;postgress&#039;: $this-&gt;stmt=pg_Euery($this-&gt;link,$sql);
			   break;
         break;
      }
      return $this-&gt;stmt;
   }

   /*Método para obtener una fila de resultados de la sentencia sql*/
   public function obtener_fila($stmt,$fila){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     if ($fila==0){
	                      $this-&gt;array=mysql_fetch_array($stmt);
	                   }else{
	                      mysql_data_seek($stmt,$fila);
	                      $this-&gt;array=mysql_fetch_array($stmt);
	                   }
	                   break;
         case &#039;postgress&#039;: if ($fila==0){
			      $this-&gt;array=pg_fetch_row($stmt);
			   }else{
			      $this-&gt;array=pg_fetch_row($stmt,$fila);
			   }
			   break;
          break;
      }
      return $this-&gt;array;
   }

}
</pre>
</pre>
<p>En el siguiente y última parte, veremos cómo controlar los errores.</p>
<p>Un saludo</p>
<p><a title="Ficheros de ejemplo" href="http://www.marcosdev.com/ejemplos/clase-base-de-datos-iii/archivos.zip">Ficheros del ejemplo (en formato UTF-8)</a></p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">Crear una clase para conectar a la base de datos</a></p>
<p><a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">Crear una clase para conectar a la base de datos (II)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (IV)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iV/">Crear una clase para conectar a la base de datos (IV)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos (II)</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 08:13:41 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=41</guid>
		<description><![CDATA[En un post anterior vimos como crear una clase muy sencilla la cual podía ser instanciada varias veces (patrón de diseño Singleton) sin que nos produjese la creación de varios objectos ni la creación de más conexiones concurrentes.
En en esta segunda parte vamos a ver como crear una clase, siguiendo también el patrón Singleton, que [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">En un post anterior</a> vimos como crear una clase muy sencilla la cual podía ser instanciada varias veces (patrón de diseño Singleton) sin que nos produjese la creación de varios objectos ni la creación de más conexiones concurrentes.</p>
<p>En en esta segunda parte vamos a ver como crear una clase, siguiendo también el patrón Singleton, que sea capaz de leer un fichero de configuración. En este fichero de configuración aparecerán los parámetros de conexión a nuestra base de datos, además de otros valores que puedan ser interesantes para nuestra aplicación. Con ello, haremos que nuestras clases sean reutilizables sin la necesidad de editarlas para adaptarlas al proyecto de turno.</p>
<p><span id="more-41"></span></p>
<p>Lo primero de todo veamos la estructura del fichero de configuración:</p>
<p>config.php</p>
<pre>
<pre class="brush: php">

//Datos de configuración de la conexión a la base de datos

//Servidor
$host=&#039;localhost&#039;;

//Usuario
$user=&#039;user&#039;;

//Password
$password=&#039;test&#039;;

//Base de datos a utilizar
$db=&#039;testDB&#039;;
</pre>
</pre>
<p>La estructura de este fichero es muy sencilla y se limita a un conjunto de variables que contiene la información necesaria para conectarse a la base de datos.</p>
<p>Ahora veamos la estructura de la clase Conf</p>
<p>Conf.class.php</p>
<pre>
<pre class="brush: php">
Class Conf{
   private $_domain;
   private $_userdb;
   private $_passdb;
   private $_hostdb;
   private $_db;

   static $_instance;

   private function __construct(){
      require &#039;config.php&#039;;
      $this-&gt;_domain=$domain;
      $this-&gt;_userdb=$user;
      $this-&gt;_passdb=$password;
      $this-&gt;_hostdb=$host;
      $this-&gt;_db=$db;
   }

   private function __clone(){ }

   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   public function getUserDB(){
      $var=$this-&gt;_userdb;
      return $var;
   }

   public function getHostDB(){
      $var=$this-&gt;_hostdb;
      return $var;
   }

   public function getPassDB(){
      $var=$this-&gt;_passdb;
      return $var;
   }

   public function getDB(){
      $var=$this-&gt;_db;
      return $var;
   }

}
</pre>
</pre>
<p>Como podemos observar en el código, lo único que hace esta clase es la inclusión del fichero de configuración y la importación de los valores de las variables a variables privadas de la clase. Mediante métodos podremos obtener los valores que necesitemos de la configuración sin peligro de sobreescribir ninguno de los valores, algo que si requiriésemos el fichero config.php en cualquier lugar, sería muy probable que nos pasase. Ahora debemos realizar algunas modificaciones sencillas dentro del fichero de nuestra clase de base de datos, Db.class.php:</p>
<pre>
<pre class="brush: php">

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private $servidor;
   private $usuario;
   private $password;
   private $base_datos;
   private $link;
   private $stmt;
   private $array;

   static $_instance;

   /*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   private function __construct(){
      $this-&gt;setConexion();
      $this-&gt;conectar();
   }

   /*Método para establecer los parámetros de la conexión*/
   private function setConexion(){
      $conf = Conf::getInstance();
      $this-&gt;servidor=$conf-&gt;getHostDB();
      $this-&gt;base_datos=$conf-&gt;getDB();
      $this-&gt;usuario=$conf-&gt;getUserDB();
      $this-&gt;password=$conf-&gt;getPassDB();
   }

   /*Evitamos el clonaje del objeto. Patrón Singleton*/
   private function __clone(){ }

   /*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
         return self::$_instance;
   }

   /*Realiza la conexión a la base de datos.*/
   private function conectar(){
      $this-&gt;link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
      mysql_select_db($this-&gt;base_datos,$this-&gt;link);
      @mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
   }

   /*Método para ejecutar una sentencia sql*/
   public function ejecutar($sql){
      $this-&gt;stmt=mysql_query($sql,$this-&gt;link);
      return $this-&gt;stmt;
   }

   /*Método para obtener una fila de resultados de la sentencia sql*/
   public function obtener_fila($stmt,$fila){
      if ($fila==0){
         $this-&gt;array=mysql_fetch_array($stmt);
      }else{
         mysql_data_seek($stmt,$fila);
         $this-&gt;array=mysql_fetch_array($stmt);
      }
      return $this-&gt;array;
   }

   //Devuelve el último id del insert introducido
   public function lastID(){
      return mysql_insert_id($this-&gt;link);
   }

}
</pre>
</pre>
<p>Podemos ver que en la clase hay un nuevo método privado llamado setConexion() el cual se encarga de instanciar el objeto de la clase Conf y establecer el valor de las variables privadas que tenemos en la clase Db. Luego el proceso es el mismo que en la primera parte del tutorial.</p>
<p>Veamos que cómo debería quedar el código de ejemplo para que nos funcionase con la nueva clase:</p>
<pre>
<pre class="brush: php">

/*Incluimos el fichero de la clase Db*/
require &#039;Db.class.php&#039;;
/*Incluimos el fichero de la clase Conf*/
require &#039;Conf.class.php&#039;;

/*Creamos la instancia del objeto. Ya estamos conectados*/
$bd=Db::getInstance();

/*Creamos una query sencilla*/
$sql=&#039;SELECT NOMBRE FROM CLIENTES&#039;;

/*Ejecutamos la query*/
$stmt=$bd-&gt;ejecutar($sql);

/*Realizamos un bucle para ir obteniendo los resultados*/
while ($x=$bd-&gt;obtener_fila($stmt,0)){
echo $x[&#039;NOMBRE&#039;].&#039;&lt;br /&gt;&#039;;
}
</pre>
</pre>
<p>Cómo podemos observar, únicamente hemos añadido un require para la nueva clase creada. Nada más. En la siguiente parte del tutorial veremos cómo podemos hacer que esta clase se conecte a diferentes tipos de base de datos.</p>
<p>Un saludo</p>
<p><a title="Ficheros de ejemplo" href="www.marcosdev.com/ejemplos/clase-base-de-datos-ii/archivos.zip">Ficheros del ejemplo (en formato UTF-8)</a></p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">Crear una clase para conectar a la base de datos</a></p>
<p><a title="Crear una clase para conectar a la base de datos (III)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/">Crear una clase para conectar a la base de datos (III)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (IV)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iV/">Crear una clase para conectar a la base de datos (IV)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 08:20:36 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=11</guid>
		<description><![CDATA[Cuando un programador web comienza con PHP, una de las tareas más habituales es la de realizar conexiones y querys a la base de datos. Normalmente, muchísima gente utiliza funciones php para conectarse a una base de datos directamente en el código como puede ser mysql_connect (para conectarse a una base de datos MySQL) o [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando un programador web comienza con PHP, una de las tareas más habituales es la de realizar conexiones y querys a la base de datos. Normalmente, muchísima gente utiliza funciones php para conectarse a una base de datos directamente en el código como puede ser mysql_connect (para conectarse a una base de datos MySQL) o pg_connect (para conectarse a una base de datos Postgress).</p>
<p>Esta forma de trabajar implica un problema muy serio si nuestro proyecto va orientado a una intranet, en la cual, de la noche a la mañana pueden tener la necesidad de cambiar la base de datos por otra diferente (por ejemplo, que una intranet crezca mucho y necesiten cambiar a una base de datos Oracle por funcionalidades específicas).</p>
<p>Si se da este caso podríamos tener un problema muy grave; deberíamos revisar todo el código que hemos escrito en busca de esas funciones específicas y adaptarlas a la nueva base de datos.</p>
<p>Para solventar este problema (crear una capa que nos abstraiga de que base de datos estemos utilizando) y además crear posibles funcionalidades nuevas, vamos a crear una clase muy sencilla la cual nos permita conectarnos a la base de datos. Esta clase la vamos a crear siguiendo el patrón de diseño Singleton. Los patrones de diseño son soluciones a problemas típicos de programación que se repiten contínuamente. El patrón Singleton nos ayuda a crear una clase la cual, si intentamos crearla dos veces, esta realmente sólo es una. En vez intentar crear el objeto, lo que haremos es instanciarlo. Esto nos permite conectarnos a la base de datos en cualquier punto del código (dentro de funciones, dentro de objectos,&#8230;) sin necesidad de crear más conexiones o tener que pasarla por parámetro (en el caso de querer que una función determinada que tengamos creada utilice una conexión existente y no cree otra nueva).</p>
<p>La estructura de la clase sería la siguiente:</p>
<p><span id="more-11"></span></p>
<pre class="brush: php">

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

private $servidor=&#039;localhost&#039;;
private $usuario=&#039;user&#039;;
private $password=&#039;test&#039;;
private $base_datos=&#039;testDB&#039;;
private $link;
private $stmt;
private $array;

static $_instance;

/*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
private function __construct(){
$this-&gt;conectar();
}

/*Evitamos el clonaje del objeto. Patrón Singleton*/
private function __clone(){ }

/*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
public static function getInstance(){
if (!(self::$_instance instanceof self)){
self::$_instance=new self();
}
return self::$_instance;
}

/*Realiza la conexión a la base de datos.*/
private function conectar(){
$this-&gt;link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
mysql_select_db($this-&gt;base_datos,$this-&gt;link);
@mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
}

/*Método para ejecutar una sentencia sql*/
public function ejecutar($sql){
$this-&gt;stmt=mysql_query($sql,$this-&gt;link);
return $this-&gt;stmt;
}

/*Método para obtener una fila de resultados de la sentencia sql*/
public function obtener_fila($stmt,$fila){
if ($fila==0){
$this-&gt;array=mysql_fetch_array($stmt);
}else{
mysql_data_seek($stmt,$fila);
$this-&gt;array=mysql_fetch_array($stmt);
}
return $this-&gt;array;
}

//Devuelve el último id del insert introducido
public function lastID(){
return mysql_insert_id($this-&gt;link);
}

}
</pre>
<p>En esta clase, cómo podemos obsevar, existen varios métodos para conectar, obtener resultados de una query así como el último id que se ha creado mediante un Insert en un campo  clave autoincremental.</p>
<p>Ahora veamos como utilizar esta clase:</p>
<pre class="brush: php">

/*Incluimos el fichero de la clase*/
require &#039;Db.class.php&#039;;

/*Creamos la instancia del objeto. Ya estamos conectados*/
$bd=Db::getInstance();

/*Creamos una query sencilla*/
$sql=&#039;SELECT NOMBRE FROM CLIENTES&#039;;

/*Ejecutamos la query*/
$stmt=$bd-&gt;ejecutar($sql);

/*Realizamos un bucle para ir obteniendo los resultados*/
while ($x=$bd-&gt;obtener_fila($stmt,0)){
echo $x[&#039;NOMBRE&#039;].&#039;&lt;br /&gt;&#039;;
}
</pre>
<p>Muy sencillo y práctico.</p>
<p>Esta clase es muy (MUY) mejorable. Por ejemplo, en el siguiente tip veremos como utilizar un fichero de configuración que será utilizado por una clase llamada Conf, la cual será utilizada a su vez por esta clase que acabamos de crear. Además, introducir control de errores de conexión, niveles de seguridad para utilizar diferentes perfiles según el ámbito de la conexión,&#8230;</p>
<p>Esta clase va dirigida a aquellas personas que todavía no utilizan un Framework y siguen trabajando directamente sobre PHP.</p>
<p><a title="Ficheros de ejemplo" href="www.marcosdev.com/ejemplos/clase-base-de-datos-i/archivos.zip">Ficheros del ejemplo (en formato UTF-8)</a></p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">Crear una clase para conectar a la base de datos (II)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (III)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/">Crear una clase para conectar a la base de datos (III)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (IV)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iV/">Crear una clase para conectar a la base de datos (IV)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Videotutorial &#8211; Reducir javascript con PHP</title>
		<link>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/</link>
		<comments>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/#comments</comments>
		<pubDate>Fri, 02 May 2008 19:34:50 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[videotutoriales]]></category>
		<category><![CDATA[optimizar]]></category>
		<category><![CDATA[reducir]]></category>
		<category><![CDATA[screecast]]></category>
		<category><![CDATA[videotutorial]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=8</guid>
		<description><![CDATA[Videotutorial  sobre el tutorial para reducir ficheros javascript con PHP.
Duración: 13:03


Descarga en formato QuickTime 
]]></description>
			<content:encoded><![CDATA[<p>Videotutorial  sobre el tutorial para reducir ficheros javascript con PHP.</p>
<p>Duración: 13:03</p>
<p><span id="more-8"></span></p>
<p><code><img src="http://www.marcosdev.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></code></p>
<p><a href="http://www.marcosdev.com/videos/reducir-js-php.mov">Descarga en formato QuickTime </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://www.marcosdev.com/videos/reducir-js-php.mov" length="19057131" type="video/quicktime" />
<enclosure url="http://www.marcosdev.com/videos/reducir-js-php.flv" length="49532051" type="video/x-flv" />
		</item>
		<item>
		<title>Reducir ficheros javascript con PHP</title>
		<link>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/</link>
		<comments>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/#comments</comments>
		<pubDate>Fri, 02 May 2008 14:01:46 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[optimizar]]></category>
		<category><![CDATA[reducir]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=5</guid>
		<description><![CDATA[Uno de los problemas más habituales hoy en día en el desarrollo de páginas web es la utilización de múltiples ficheros Javascript. Estos ficheros a la mínima que la página sea algo grande, toman un peso muy significativo. Una de las premisas que siempre debemos tener en la cabeza es hacer que nuestra página cargue [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los problemas más habituales hoy en día en el desarrollo de páginas web es la utilización de múltiples ficheros Javascript. Estos ficheros a la mínima que la página sea algo grande, toman un peso muy significativo. Una de las premisas que siempre debemos tener en la cabeza es hacer que nuestra página cargue lo más rápido posible. (El addon para <a title="Página oficial de navegador Firefox" href="http://www.mozilla-europe.org/es/products/firefox/">Firefox</a> llamado <a title="Página oficial de YSlow" href="http://developer.yahoo.com/yslow/">YSlow</a> que se integra con <a title="Página oficial del addon Firebug" href="http://www.getfirebug.com/">Firebug</a> es muy útil para optimizar nuestra página).</p>
<p>Como toda buena práctica de programación, nuestro código incluye sangrías y comentarios. Si no ponemos sangrías nuestro código se hace incomprensible, y si le quitamos los comentarios, dentro de unos meses nos acordaremos de aquel día que decidimos no escribir una frase aclaratoria de que hacía aquella función.</p>
<p><span id="more-5"></span></p>
<p>Por ello, existen multitud de herramientas que permite que a partir de un fichero javascript nuestro, se genere un fichero javascript reducido, es decir, sin espacios, sin comentarios, e incluso ofuscado (cambia nombre a las variables por letras o números y trata de reducir la comprensión del código por alguien que quiera copiarnos o analizarnos para un ataque).</p>
<p>Estas herramientas el problema que tienen es que debes tener un fichero para el desarrollo y luego de haber hecho los cambios oportunos, debes generar el fichero reducido.</p>
<p>En este tutorial veremos como podemos reducir en tiempo real los ficheros Javascript que precise nuestro documento mediante PHP (es necesario tener la versión 5). Además, si nuestra página utiliza más de un fichero js (javascript), lograremos reducir las peticiones al mínimo. Por ejemplo, nuestra página utiliza tres ficheros js nuestros, son tres peticiones. Lograremos reducirlo a únicamente una petición. Caso aparte es cuando debes realizar la inclusión de un fichero js como el de Google Maps, con el cual no puedes utilizar esta técnica.</p>
<p>Vamos manos a la obra.</p>
<p>Lo primero que necesitamos es descargar una librería llamada Jsmin-php. Podéis encontrarlo en su <a title="Página web Jsmin-php" href="http://code.google.com/p/jsmin-php/">página web</a>, y justo en la derecha hay un botón para accionar la <a title="Descarga directa de Jsmin-php" href="http://jsmin-php.googlecode.com/files/jsmin-1.1.1.php">descarga</a>.</p>
<p>Descargamos el dichero jsmin-1.1.1.php (esta era la versión al momento de hacer este tutorial).</p>
<p>Supongamos que tenemos la siguiente estructura de ficheros:</p>
<p style="text-align: center;"><a href="http://www.marcosdev.com/wp-content/imagen-2.png"><img class="alignnone size-medium wp-image-6 aligncenter" title="Estructura de ficheros" src="http://www.marcosdev.com/wp-content/imagen-2.png" alt="" width="143" height="87" /></a></p>
<p style="text-align: left;">En la imagen podemos observar que tenemos un fichero index.php en el cual hay el siguiente código:</p>
<pre class="brush: html">
&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/meta&gt;&lt;/head&gt;
&lt;body&gt;
&lt;p id=&#039;parrafo&#039;&gt;Hola&lt;/p&gt;

&lt;script type=&#039;text/javascript&#039; src=&#039;test.js&#039;&gt;&lt;/script&gt;
&lt;script type=&#039;text/javascript&#039; src=&#039;test2.js&#039;&gt;&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Cómo se puede observar es un documento en blanco con un párrafo en el cual está escrito la palabra Hola. Este párrafo tiene como identificador único el id &#8216;parrafo&#8217;.</p>
<p>Más adelante podemos ver la llamada a dos ficheros js externos al documento. Cómo se puede apreciar, he puesto las inclusiones al final del documento, justo antes del final del body. Esto es una de las pautas a la hora de optimizar el rendimiento de una página web. En otro tutorial trataremos de una manera más profunda este tema.</p>
<p>El contenido de los ficheros js es el siguiente</p>
<p>Fichero test.js</p>
<pre class="brush: jscript">
/*
Esto es un fichero de prueba js
Conjunto de comentarios que explican el funcionamiento de este js
El código siguiente sustuirá el texto interior del párrafo identificado con el id parrafo
*/

document.getElementById(&#039;parrafo&#039;).innerHTML=&#039;esto funciona&#039;;
</pre>
<p>Fichero test2.js</p>
<pre class="brush: jscript">
//Comentario: esto va a mostrar un mensaje de alerta
alert(&#039;hola mundo&#039;);
</pre>
<p>El código del fichero test.js lo que hace es buscar dentro del documento un elemento que tenga como identificador &#8216;parrafo&#8217; y le sustituye su contenido por un texto &#8216;esto funciona&#8217;.</p>
<p>El código del fichero test2.js lo que hace es mostrar un mensaje.</p>
<p>En ambos documentos se pueden ver muchos comentarios. Estos comentarios están bien para nosotros pero  lo que hacen es hacer más lenta la carga de la página ya que el fichero tiene un mayor fichero.</p>
<p>Vamos a comenzar a solucionar este problema.</p>
<p>Para ello, lo primero que debemos hacer es crear un fichero php al cual le podemos llamar scripts.php. Este fichero tiene la función de solicitar los ficheros js que necesitemos, reducirlos y generar un documento único.</p>
<p>Para que el contenido final del documento sea entendido por el navegador como código javascript y no otro tipo de lenguaje debemos incluir como primera línea de nuestro fichero scripts.php el siguiente código:</p>
<pre class="brush: php">

header(&quot;content-type: application/x-javascript&#039;);
</pre>
<p>Ahora debemos incluir la librería jsmin que hemos descargado y la cual se encargará de optimizar el código:</p>
<pre class="brush: php">

require_once &#039;jsmin-1.1.1php&#039;;
</pre>
<p>La parte que viene ahora es muy sencilla. Debemos ejecutar la siguiente línea por cada fichero js que queramos llamar. En nuestro caso será dos veces:</p>
<pre class="brush: php">

echo JSMin::minify(file_get_contents(&#039;test.js&#039;));

echo JSMin::minify(file_get_contents(&#039;test2.js&#039;));
</pre>
<p><em><strong>JSMin:minify</strong></em> es la orden que se encarga de reducir un determinado código. <em><strong>file_get_contents</strong></em> lo que hace es obtener el contenido de un determinado fichero. Por lo tanto esta orden lo que hace es obtiene el código de nuestros ficheros js, lo reduce y mediante la orden echo lo vuelca en pantalla, en nuestro caso, produciendo un nuevo fichero js.</p>
<p>El resultado es el siguiente:</p>
<pre class="brush: jscript">

document.getElementById(&#039;parrafo&#039;).innerHTML=&#039;esto funciona&#039;;
alert(&#039;hola mundo&#039;);
</pre>
<p>Cómo se puede observar ya no hay comentarios. Si el código tuviese sangrías o fuera más complejo, se podría observar muchas más diferencias.</p>
<p>Ahora ya sólo nos queda retocar el fichero index.php. Vamos a decirle que en vez de utilizar los dos ficheros js, utilice únicamente el fichero php que hemos generado. Con ello matamos dos pájaros de un tiro: reducimos las peticiones de 2 ficheros a 1, y generamos código reducido. Para ello sustituimos las siguientes líneas:</p>
<pre class="brush: html">

&lt;script type=&#039;text/javascript&#039; src=&#039;test.js&#039;&gt;&lt;/script&gt;

&lt;script type=&#039;text/javascript&#039; src=&#039;test2.js&#039;&gt;&lt;/script&gt;
</pre>
<p>Por esta</p>
<pre class="brush: html">

&lt;script type=&#039;text/javascript&#039; src=&#039;scripts.php&#039;&gt;&lt;/script&gt;
</pre>
<p>Listo. Ya tenemos nuestra página web con el js reducido y además hemos reducido el número de peticiones.</p>
<p>Espero que esto os pueda ser útil.</p>
<p><a href="http://www.marcosdev.com/wp-content/reducir-js-php.zip">Ficheros del tutorial Reducir Js con PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
