Enviar datos por POST mediante CURL

Si el otro día indicábamos cómo obtener una página protegida por autenticación, hoy vamos a explicar lo fácil que es enviar una petición HTTP con datos por POST usando CURL.

Tan solo es necesario indicar que se envían datos por POST e indicar qué datos se van a mandar:

<?php
$ch = curl_init('http://dominio.com/pagina.php');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, "parametro1=valor1¶metro2=valor2");
curl_exec ($ch);
curl_close ($ch);
?>

Con CURLOPT_POST indicamos que enviamos datos en POST y con CURLOPT_POSTFIELDS indicamos los datos.

Consejos para escribir menos código PHP

Escribir menos código puede suponer dos mejoras en nuestra aplicación: código más limpio y fácil de seguir, y código más eficiente.

Usar operadores lógicos (or y and) en vez de if

Si queremos ejecutar una instrucción dependiendo del resultado booleano de una instrucción anterior, como por ejemplo:

$status = fwrite($h, 'texto');
if (!$status) {
log('Error al escribir');
}

Podremos hacerlo de la siguiente manera:

fwrite($h, 'texto') or log('Error al escribir');

Uso del operador ternario

Cuando queremos asignar un valor a una variable dependiendo del resultado de una condición:

$var = $ok? 'Correcto' : 'Falso';

Usar for antes que while

Mientras que con el while sería:

$i = 0;
while ($i < 100) {
$var[] = $aux[$i];
$i += 2;
}

Con el for sería así:

for ($i = 0; $i < 100; $var[] = $aux[$i+=2]);

Uso de funciones por referencia

Cuando una función nos devuelve un array, no es imposible acceder directamente al contenido del array:

$ext = pathinfo('file.png')['extension'];
// Parse error: syntax error, unexpected '[' in ... on line ...

Para evitar este error podemos crearnos un juego de funciones como estas:

// Devuelve la referencia al objeto
function &r($v) { return $v; }
// Devuelve la posición del array
function &a(&$a, $i) { return $a[$i]; }

Y por último un par de consejos: intenta conocer las funciones de PHP, hay muchas que harán justo lo que tu necesitas, por lo que no tendrás que implementarlo. Antes de escribir más código para que se lea con facilidad, añade un comentario explicativo.

6 PHP coding tips to write less code

Vía / dzone

Obtener una página con autenticación en PHP

Algo que normalmente es interesante hacer y que nos da muchos problemas es leer una página web desde un script PHP y que la página tenga autenticación.

La solución es sencilla, pero es necesario el uso de CURL:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, 'usuario:password'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout 10 segs
$data = curl_exec($ch);

Vía / [no recuerdo de dónde lo copié]

| |

Microsoft ofrece un driver SQL Server 2005 para PHP

Microsoft ha contribuido con PHP para crear un driver para acceder a SQL Server 2005. Diseñado para que permita una integración fiable y escalable con SQL Server para aplicaciones PHP desarrolladas en plataforma Windows.
Se trata de una extensión para PHP5 que permite leer y escribir data dentro de los scripts PHP, incluyendo procedimientos para acceder a los datos de SQL Server 2005 y SQL Server 2000 (incluyendo Express Edition), y hace uso de las características de PHP, como la lectura y escritura de objetos grandes.
Existe también un blog y un foro.
SQL Server 2005 Driver for PHP
Vía / International PHP Magazine

|

Minishowcase: galería PHP y Ajax

Minishowcase es una aplicación sencilla basada en PHP y Ajax que nos permite crear galerías de fotos facilmente, sin necesidad de configurar bases de datos o cambiar código.
minishowcase.png
Tan solo es necesario situar las fotografías en un directorio y ya dispondremos de un album, sin necesidad de crear thumbnails ya que Minishowcase se encarga de ello.
Disponible en varios idiomas, nos muestra las imágenes mediante lightbox y nos permite visualizarlas mediante un slideshow. A parte podemos compartir las galerías mediante enlaces permanentes.
Minishowcase
Vía / WebAppers

| |

Laboratorio: modificar urls para CodeIgniter con mod_rewrite

codeigniter.pngCodeIgniter es uno de los frameworks PHP de los que más se habla últimamente, a mí personalmente me gusta bastante, aunque hay algunas cosas que no son como me gustaría.

Una de ellas es la estructura de las URLs, las URLs siguen el formato:

http://dominio/controlador/metodo/parametro/parametro/...

El controlador es la clase que se encarga de hacer las operaciones y el método es el método de la clase que realiza una función concreta.

Por ejemplo si tenemos una tienda online, podemos tener un controlador para productos y un método que sea editar, con el que se podrá modificar las características del producto. La url sería la siguiente:

http://tienda.com/articulo/editar/cafetera

Con esta url podemos editar un artículo llamado cafetera y además es bastante entendible. Pero, ¿qué pasa si queremos mostrar el artículo cafetera?, pues que la url debería ser la siguiente:

http://tienda.com/articulo/ver/cafetera

Pero lo de ver no queda demasiado bien y queda mejor si es directamente:

http://tienda.com/articulo/cafetera

El problema nos lo encontramos cuando queremos usar una URL que no indique el método y si un parámetro. Si no usamos ni método ni parámetro, CodeIgniter toma por defecto el método index, pero si no usamos método y si parámetro, CodeIgniter no es capaz de saber que lo que mandamos es un parámetro, por lo que hay que usar el Apache para que siga la estructura de CodeIgniter.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^articulo/(.+)$ index.php/articulo/ver/$1 [L]
RewriteCond $1 !^(index\.php|favicon\.ico)
RewriteRule ^(.*)$ index.php/$1 [L]

Hay que tener en cuenta que este ejemplo es válido únicamente si solo se va a usar siempre dos segmentos en la url, uno para el controlador y otro para el parámetro.

La segunda parte y el uso de index.php es debido a que CodeIgniter usa este script para gestionar toda la aplicación, y para que no aparezca, debemos redireccionarlo todo a index.php, menos los ficheros que existen como el favicon, el robot.txt, etc.

Subir un fichero por FTP en PHP

El código que nos muestran es sencillo, se trata de subir un fichero mediante un formulario a un servidor FTP, para lo cual será necesario CURL.

Inicialmente necesitaremos el formulario html:

<form action="ftpupload.php" method="post" enctype="multipart/form-data">
<div>
<label for="upload">Selecciona un fichero</label>
<input name="upload" type="file" />
<input type="submit" name="submit" value="Enviar" />
</div>
</form>

Recordad que es importante que el enctype sea multipart/form-data para que se pueda enviar el fichero al servidor.

Una vez tenemos este formulario, deberemos tener el fichero ftpupload.php el cual deberá ejecutar lo siguiente:

if (isset($_POST['submit'])) {
if (!empty($_FILES['upload']['name'])) {
$ch = curl_init();
$localfile = $_FILES['upload']['tmp_name'];
$fp = fopen($localfile, 'r');
curl_setopt($ch, CURLOPT_URL, 'ftp://usuario:password@ftp.servidor.com/'.$_FILES['upload']['name']);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);
if ($error_no == 0) {
$error = 'Fichero subido correctamente.';
} else {
$error = 'Error al subir el fichero.';
}
} else {
$error = 'Seleccione un fichero.';
}
}

Tutorial: FTP Upload via cURL

|

Oracle creará un driver open source para PHP

OracleA parte de la casi compra de Bea por parte de Oracle (sería una buena noticia para los que desarrollen con Weblogic), nos enteramos de una gran noticia para los desarrolladores de PHP, y es que Oracle contribuye con un driver PHP open source para su OCI8. Este driver nos permite acceder a las características que nos ofrece la base de datos de Oracle, pudiendo así disponer del pool de conexiones, entre otras cosas.
Uno de las prioridades de Oracle es hacerse un hueco en la web2.0, para lo cual en colaboración de Zend pretende sacar este driver para así poder realizar aplicaciones que necesiten la robustez de la base de datos Oracle.
Oracle Contributes Open Source Driver for PHP

|

phpEquiMon: monitorizar equipos de forma remota

phpEquiMon está pensado para los administradores de redes para tener y mantener una base de datos de equipos basados en IP, pudiendo guardar el hostname, la dirección IP, la MAC address y mucho más. Además ofrece características que facilitan la labor al administrador y permite a gente sin conocimiento técnico hacer un seguimiento del estado de los equipos.
phpequimon.png
Entre las características que ofrece nos encontramos con la posibilidad de personalizar las tablas de resultados, sistema de usuarios y grupos, monitorización online haciendo pings frecuentes, logs, temas, LDAP y mucho más.
phpEquiMon
Vía / International PHP Magazine

Creación de thumbnails con Imagick

Un buen y sencillo ejemplo de cómo crear miniaturas de imágenes (thumbnails) con sombra y borde redondeado usando Imagick. No olvidar que siempre hay que tener en cuenta que la manipulación de imágenes es algo costoso en rendimiento, y más si usamos Imagick en vez de gd, sí, permite más funcionalidades pero es más pesado.

El resultado sería el siguiente:

resize.png

<?php
// Parsear la imagen
$im = new Imagick( 'imagen.png' );
// Redimensionar la imagen
$im->thumbnailImage( 200, null );
// Esquinas redondeadas
$im->roundCorners( 5, 5 );
// Clonamos el objeto actual
$shadow = $im->clone();
// Cambiamos el color de la imagen a negro (color de la sombra)
$shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );
// Creamos la sombra
$shadow->shadowImage( 80, 3, 5, 5 );
// Superponemos la original sobre la sombra
$shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );
// Mostramos la imagen
header( "Content-Type: image/png" );
echo $shadow;
?>

Pretty thumbnails