| Subcribe via RSS

Función PHP que añade un carácter al final si no existe

Diciembre 1st, 2008 | No Comments » | Posted in php, programacion

Hoy os propongo esta pequeña función que a mí me ahorra muchos disgustos. Se trata de una función que toma una cadena, comprueba si tiene el carácter ‘/’ al final y lo añade si no lo tiene.

Por ejemplo:

poner_barra_final("/home/gorka"); ---> "/home/gorka/"
poner_barra_final("/home/gorka/"); ---> "/home/gorka/"

De esta forma me aseguro que todas las carpetas tienen una barra al final y no tengo que preocuparme de si ya tienen la dichosa barra o no. Así me evito cosas como:

/home/gorka//

que en algunas situaciones ha sido fuente de errores.

La función:

function poner_barra_final($texto)
{
	if ((strrpos($texto, '/')+1)!=strlen($texto))
		$texto .= '/';
	return $texto;
}

Explicación:

La función strrpos (con dos ‘r’) devuelve la posición de la última aparición de ‘/’.

strlen cuenta el número de caracteres de la cadena.

Si no coinciden ambos valores (sumando uno al primer valor) quiere decir que el último carácter no es una ‘/’ así que la añado.

Tags: , ,

Extraer elementos aleatoriamente de un array en PHP

Noviembre 27th, 2008 | No Comments » | Posted in php, programacion

Os dejo aquí un pequeño código que os permitirá extraer elementos de manera aleatoria de un array. La explicación un poco más abajo.

Este ejemplo toma un array y muestra dos elementos escogidos de manera aleatoria.

<?
$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');
$claves = array_rand($elementos, 2);
foreach($claves as $clave)
{
	echo $elementos[$clave];
}
?>

Explicación:

$elementos = array('tortilla de patata', 'bonito con tomate',
'morcilla con pimientos', 'salmón ahumado');

Esto es un array, no necesita mucha explicación. Un detalle importante, estoy escribiendo esto cerca de la hora de comer, por eso todos los elementos son platos que me encantan.

$claves = array_rand($elementos, 2);

Esta función nos devuelve un array $claves que contendrá dos (porque así lo hemos indicado) elementos que serán dos índices (o claves) aleatorios del array $elementos.

foreach($claves as $clave)

Con este foreach recorreremos el array de claves aleatorias y mostramos con el echo mostramos los valores.

Un pequeño apunte: antes de la versión de PHP 4.2.0 era necesario inicializar el generador de números aleatorios:

srand((float) microtime() * 10000000);
Tags: , , ,

cURL y PHP: hacer una llamada a una página en segundo plano

Noviembre 11th, 2008 | 1 Comment | Posted in php, programacion

Hace un par de días os hablaba de cURL. Hoy vamos a ver un sencillo ejemplo con esta librería.

En este ejemplo, vamos a conectarnos desde nuestro servidor con Google y vamos a pedirle que nos busque resultados que contengan la palabra ‘curl’:

<?
if(function_exists('curl_init')) // Comprobamos si hay soporte para cURL
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	$resultado = curl_exec ($ch);
 
	print_r($resultado);
}
else
	echo "No hay soporte para cURL";
?>

Lo primero que debemos hacer es iniciar la sesión cURL:

$ch = curl_init();

esto nos devuelve un “manejador” $ch que identifica a la sesión cURL recién creada.

Ahora vamos a indicarle cuál es la URL a la que nos queremos conectar:

curl_setopt($ch, CURLOPT_URL,
		"http://www.google.es/search?hl=es&q=curl");

En este caso vamos a realizar una búsqueda en google sobre el término ‘curl’.

Establecemos un tiempo máximo de respuesta:

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

Esta línea la veremos más abajo:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Si en el servidor al que nos conectamos hubiese alguna redirección (código 302) y nos interesa seguirla entonces debemos decírselo a cURL:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

En este caso no es necesario, pero lo he dejado como nota didáctica.

Finalmente hacemos la llamada:

$resultado = curl_exec ($ch);

Como hemos establecido el parámetro CURLOPT_RETURNTRANSFER, curl_exec va a devolver la respuesta del servidor y la va a almacenar en la variable $resultado. Si no hubiésemos establecido ese parámetro curl_exec hubiese devuelto verdadero o falso dependiendo de si la operación se ha realizado con éxito.

Este es un ejemplo muy sencillo sin valor más allá del didáctico, pero puede tener muchas aplicaciones. Por ejemplo se puede usar en pasarelas de pago como PayPal para hacer una llamada en segundo plano al servidor.

Tags: , ,

libCurl en PHP

Noviembre 7th, 2008 | 2 Comments | Posted in php, programacion

libCurl es una biblioteca (o, como suele decirse: librería) para la transferencia de archivos que soporta varios protocolos (FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS y FILE).

Lo más habitual es que el soporte para cURL venga “de serie” en una instalación PHP. Si no es así tienes dos opciones:

1) Compilar el PHP añadiendo el soporte para cURL (necesitas tener la librería libCurl instalada antes de compilar el PHP). Aquí tienes instrucciones en inglés sobre cómo compilar PHP con soporte cURL.

2) Instalar el paquete php5-curl de tu distribución Linux (el nombre del paquete puede variar).

En algunas versiones tendrás que editar el fichero php.ini y modificar la línea:

;extension=php_curl.so

quitando el símbolo ‘;’ y dejarla así:

extension=php_curl.so

En otras basta con asegurarse que tenemos el fichero curl.so en el directorio:

/usr/lib/php5/extensions

Eso sí, una vez añadido el soporte para cURL deberemos reiniciar Apache:

/etc/init.d/apache restart

¿Cómo puedo comprobar si cURL está disponible en mi instalación Apache/PHP?

Puedes probarlo con el siguiente código:

<?php
if(function_exists('curl_init'))
   echo "Hay cURL";
?>

o puedes hacerlo con la función:

que te mostrará esta y otras valiosas informaciones sobre tu servidor.

En una próxima entrega veremos un ejemplo de trabajo con cURL.

Tags: , , ,

Linux: Recuperar un archivo que tiene un nombre con caracteres extraños

Noviembre 6th, 2008 | No Comments » | Posted in linux

En alguna ocasión me ha ocurrido que se suben a algún servidor archivos en cuyo nombre hay caracteres con una codificación diferente a la que usa el servidor. Si el servidor no puede traducirlos a su codificación los dejará “tal cual” pero luego será un dolor de cabeza acceder a ese archivo.

Por ejemplo, si un usuario sube un archivo con el nombre:

sin-título.jpg

es posible (dependiendo de tu servidor) que se almacene como:

sin-t�tulo.jpg

Quizá se te ocurra renombrarlo para que tenga un nombre más adecuado haciendo:

mv sin-título.jpg sin-titulo.jpg

o:

mv sin-t�tulo.jpg sin-titulo.jpg

Lo más seguro es que no te funcione ninguno de estos métodos. Pero tranquilo, antes de abrirte la cabeza y arrancarte el cerebro con una cuchara prueba lo siguiente:

more sin-t�tulo.jpg > sin-titulo.jpg

es posible que te funcione ¡suerte!

Tags: , , ,

MySQL: actualizar un campo con la suma de unos registros de otra tabla

Noviembre 3rd, 2008 | No Comments » | Posted in mysql, php

Si tenemos una tabla que queremos actualizar con la suma de valores de otra tabla podemos hacerlo vía programación (lo he visto en un programa que he tenido que modificar recientemente) o lo podemos hacer directamente usando una consulta MySQL.

En este ejemplo en concreto que me encontré había dos tablas:

facturas:

  • num_factura
  • base_imponible

factura_detalle:

  • num_factura
  • articulo
  • precio

La tabla factura_detalle contiene, como el nombre indica, el detalle de las facturas. Cada línea es un artículo y su precio.

La tabla facturas tenía un campo base_imponible que era necesario actualizar con el precio de los artículos de la factura en la tabla factura_detalle.

Esto se puede hacer directamente usando una subconsulta:

UPDATE facturas SET base_imponible =
     ( SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')
     WHERE num_factura = '30';

La subconsulta se encarga de buscar todos los registros de la tabla de detalle y sumar los precios:

SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')

y la consulta principal lo que hace es asignar ese valor, que sería algo así suponiendo que la anterior hubiese devuelto el valor ‘300′:

UPDATE facturas SET base_imponible = '300'
     WHERE num_factura = '30';
Tags: , , , , ,

Optimizar código PHP (Benchmarks)

Octubre 1st, 2008 | No Comments » | Posted in php, programacion

En The PHP Benchmark podemos encontrar una comparativa que nos da una idea de qué código es mejor usar en cada ocasión.

Entre otras cosas, como es bastante lógico, podemos ver que es mejor usar:

$size = sizeof($x);
for ($i=0; $i<$size; $i++)
{...}

que:

for ($i=0; $i {...}

La razón es que en la primera opción ya está calculado el tamaño del array $x, y en la segunda forma tenemos que calcular el tamaño cada vez. Para hacernos una idea de la diferencia, la segunda forma tarda unas 350 veces más en ejecutarse en el ejemplo que proponen.

De todas formas, hay otros benchmarks que difiere en algunas conclusiones. Sin embargo, para hacerse una idea está bien. Se puede tener en cuenta sobre todo en los que se ve clara la diferencia.

Vía: Sentido Web.

Tags: , , ,

Kohana, la ¿evolución? de Code Igniter

Agosto 14th, 2008 | No Comments » | Posted in php, programacion

Los que me conocéis ya sabéis que soy un enamorado de Code Igniter. Sin embargo, recientemente he descubierto Kohana, que es un fork de mi amado framework.

¿Cuál es la diferencia entre Code Igniter y Kohana? Entre otras tenemos estas:

- Principalmente que está llevado por una comunidad cuya principal prioridad es Kohana, al contrario que Ellislab (empresa creadora de Code Igniter) cuya prioridad es Expression Engine, su producto estrella. La principal ventaja es que las modificaciones y mejoras se aplican más rápidamente en Kohana.

- Kohana funciona sólo con PHP5, mientras Code Igniter funciona también con PHP4. Ya sé que PHP4 ya no tiene soporte pero existen todavía muchos servidores que aún no se actualizado (y lo que tardarán todavía).

- En Kohana se puede acceder a la variable $_GET a través de un array (en Code Igniter el array $_GET no “existe”).

- Kohana está totalmente orientada a objetos (incluso los helpers son clases).

- En Kohana han sacado el directorio “Application” del directorio “System” y lo han puesto en el raíz. Esto puede parecer una tontería, pero de esta forma tienes totalmente independiente tu aplicación de los ficheros del framework.

Ya estoy empezando a usar Kohana para algunos proyectos. Claro que, únicamente lo hago en aquellos que estoy seguro que no se alojarán en servidores con PHP4 :-P.

Tags: , , , ,

PHP: Cambiar el set de caracteres en una consulta MySQL

Agosto 12th, 2008 | No Comments » | Posted in mysql, php, programacion

Existe una función, que he de reconocer no conocía, que permite cambiar el set de caracteres (charset) cuando hacemos una consulta a MySQL.

Por ejemplo, si queremos asegurarnos que los datos que vamos a introducir en la base de datos van a estar en UTF-8 usaremos:

mysql_set_charset('utf8',$link);

(donde el parámetro $link, como en casi todas las funciones para mysql, es opcional).

Esta función se ha incorporado en la versión PHP 5 (5.0.7) y por lo visto también está disponible en la versión PHP 4 (a partir de la 4.1.13). En los comentarios de la documentación de PHP han aportado este código que hace que mysql_set_charset funcione también en versiones anteriores de PHP:

<?php
 if (function_exists('mysql_set_charset') === false) {
     function mysql_set_charset($charset, $link_identifier = null)
     {
         if ($link_identifier == null) {
             return mysql_query('SET NAMES "'.$charset.'"');
         } else {
             return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
         }
     }
 }
 ?>
Tags: , , ,

Las novedades en el futuro ZenCart 1.4

Agosto 5th, 2008 | No Comments » | Posted in php, zencart

Ya queda menos para la nueva versión de ZenCart, la 1.4. En esta versión se han centrado especialmente en mejorar el temas relacionados con la base de datos. Según parece en esta versión se va a notar una gran mejora en el rendimiento del software, pero de cara al usuario va a haber poca diferencia.

Por un lado han simplificado el sistema para la creación de drivers para bases de datos que no sean MySQL y según promete el equipo de ZenCart esto va a ser muy sencillo.

Por otro lado han añadido soporte para tablas Innodb, lo que permitirá usar transacciones (parece ser que han trabajado algo también el tema de las transacciones). Gracias a las transacciones se evitará que haya problemas de inconsistencia en los datos.

También han hecho cambios en la parte de la caché para SQL de tal forma que se podrán usar otros sistemas de caché (como MemCache, para el cual han añadido soporte).

Otro punto destacable son los cambios que han hecho en la estructura de la base de datos para mejorar el rendimiento de las consultas, por ejemplo, para las categorías ahora usan el modelo MPTT (Modified Pre-order Tree Traversal). MPTT es un ingenioso sistema para acceder a un árbol de categorías con muchas menos consultas a la base de datos.

Además, han revisado las consultas redundantes que se hacían para recuperar la información de un producto (precio, atributos, peso, etc…) y las han unificado de tal forma que han conseguido ahorrar un buen número de llamadas a la base de datos.

Habrá que esperar a que salga la nueva versión para poder comprobar si estas mejoras se pueden cambiar. Mientras tanto tendremos que seguir esperando que ZenCart traiga “de serie” una de las características más destacadas por los usuarios como es una gestión de atributos más completa y sencilla de manejar, ah y el control de stock por atributos.

ZenCart está a punto de mover ficha ¿Cuándo le tocará a OsCommerce? :-)

Tags: ,