Archivo de la etiqueta: php

Comandos Zend Framework Command Line Console Tool

Dejo aquí los comandos de la zf tool en la versión de Zend Framework 1.11.11

Zend Framework Command Line Console Tool v1.11.11
Usage:
    zf [--global-opts] action-name [--action-opts] provider-name [--provider-opts] [provider parameters ...]
    Note: You may use "?" in any place of the above usage string to ask for more specific help information.
    Example: "zf ? version" will list all available actions for the version provider.

Providers and their actions:
  Version
    zf show version mode[=mini] name-included[=1]
    Note: There are specialties, use zf show version.? to get specific help on them.

  Config
    zf create config
    zf show config
    zf enable config
    Note: There are specialties, use zf enable config.? to get specific help on them.
    zf disable config
    Note: There are specialties, use zf disable config.? to get specific help on them.

  Phpinfo
    zf show phpinfo

  Manifest
    zf show manifest

  Profile
    zf show profile

  Project
    zf create project path name-of-profile file-of-profile
    zf show project
    Note: There are specialties, use zf show project.? to get specific help on them.

  Application
    zf change application.class-name-prefix class-name-prefix

  Model
    zf create model name module

  View
    zf create view controller-name action-name-or-simple-name module

  Controller
    zf create controller name index-action-included[=1] module

  Action
    zf create action name controller-name[=Index] view-included[=1] module

  Module
    zf create module name

  Form
    zf enable form module
    zf create form name module

  Layout
    zf enable layout
    zf disable layout

  DbAdapter
    zf configure db-adapter dsn section-name[=production]

  DbTable
    zf create db-table name actual-table-name module force-overwrite
    Note: There are specialties, use zf create db-table.? to get specific help on them.

  ProjectProvider
    zf create project-provider name actions

Hello World!!!

An example Hello world program, written in Per...
Image via Wikipedia

Hello World!!!

Con esta famosa frase nos iniciamos todos en cualquier lenguaje de programación, cualquier manual o cualquier curso en sus primeras lecciones la primera demostración que nos hacen es sacar por pantalla esta frase.

Por eso he pensado en hacer un pequeño recopilatorio de como mostrar esta frase en distintos lenguajes de programación.

JAVASCRIPT

<script language='text/javascript'>
    document.write("Hello World!!!");
</script>

JAVA

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!!!");
    }
}

PHP

<?php
echo "Hello World!!!";
?>

RUBY

puts "Hello World!!!"

PYTHON

print ("Hello World!!!")

PERL

print "Hello World!!!";

Objetive-C

#import <Foundation/Foundation.h>;
int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Hello, World!!!");
    [pool drain];
    return 0;
}

Formato moneda con PHP – PHP Tips

The PHP logo displaying the Handel Gothic font.
Image via Wikipedia

Con la función money_format  money_format( $formato, $numero ),  podemos convertir un numero en el formato de moneda sin necesidad de estar agregando el símbolo, establecer el numero de decimales que tendrá el numero, el separador de miles y el separador de decimales. En formato lo mas sencillo es poner «%i» o «%n» siendo la primera el formato internacional para la configuración regional y la segunda el formato nacional para la configuración regional.

Estas opciones las coges de las locales que tengamos definidas en el sistema, y aquí viene lo divertido de la historia.

Primero establecemos el formato monetario con setlocale.

$numero = 12345.67;
setlocale(LC_MONETARY, 'es_ES');
echo money_format('%i', $numero) ."\n"; // devuelve 12.345,6,7 EUR
echo money_format('%n', $numero) ."\n"; //devuelve 12.345,67 €

Es posible que probéis estos ejemplos y no funcionen, uno de los motivos es si estais usando ubuntu o cualquier distro basada en Debian, en estas distros hay que poner en vez de es_ES , es_ES.UTF-8, o puede que estéis probando esta función en windows y no funcione a lo cual me remito a lo que dice la documentacion de PHP:

«La función money_format() sólo está definida si el sistema tiene capacidad strfmon. Por ejemplo, Windows no lo hace, así que money_format() no está definido en Windows.»

Por lo tanto si tenemos la aplicación corriendo en un windows no podremos utilizar esta función tan util.

+ Info: http://es.php.net/manual/es/function.money-format.php

Error 404 personalizado – Apache Tips, PHP Tips

Deutsch: Bildschirmfoto eines 404-Fehlers bei ...
Image via Wikipedia

Una de las maneras de obtener información del servidor donde tenemos alojada nuestra web es solicitando una pagina que no exista y así nos devuelva la pagina
que tiene el servidor por defecto de pagina no encontrada en la cual suele venir el modelo versión y demás detalles. Una solución rápida para esto es crear
nuestra pagina de error 404. Para ello tendremos que editar el fichero .htaccess en la raíz de nuestra pagina web y poner lo siguiente:
Nota: Consideramos que el servidor web es apache

ErrorDocument 404 /404.php

Con esto le estamos diciendo que cuando se produzca un error 404 nos muestre la pagina 404.php
Dicha pagina la podemos poner como queramos y el mensaje que queramos.
Otra opción que tenemos, por si no queremos hacer una pagina de error es pasarle directamente el mensaje a la configuración

ErrorDocument 404 "Lo sentimos la pagina web solicitada no existe"

Lo mismo que con el 404 ( pagina no encontrada ) lo podemos hacer con otros codigos como el 403 y demás.

Ahora bien, hay un caso, que tenemos que tener cuidado, pongamos que hacemos la típica aplicación en la cual tenemos que estar registrados para acceder a las secciones y queremos evitar
que nos accedan directamente a las paginas. La programación de la cabecera de los ficheros podría ser

if ( session_id != null ) {
    session_regenerate_id();
} else {
    session_start();
}
if (!$_SESSION['auth']) { 
// Redirección a la pagina
    header("Location:404.php"); // Redirigimos a la pagina de error o a la que queramos
    exit(0);
}

Imaginemos que queremos crear una función para no tener que escribir todo esto en cada cabecera, y lanzamos esa función en cada pagina, y pensamos que tenemos que cambiar la ruta del
header para cada sección. A la vez pensamos que hemos hecho la redirección 404 en el .htaccess como a continuacion:

header("HTTP/1.0 404 Not Found"); // Esta manera
header("Status: 404 Not Found"); // O esta manera

Y decimos mira mando un header de 404, este me lo interpreta el .htaccess y me manda a la pagina
seleccionada… ERROR eso no funciona, y para colmo decir que no necesitaríamos hacer nada mas ya que esta funcionaria dentro de las carpetas, siempre y cuando no existiera la pagina 404.php, y si no ahí va un truco, que el header apunte a notfound.html, esta va a ser una pagina que no crearemos en ningún sitio, el header la llamara, como no existe hará que el .htaccess lance la pagina 404.php que tenemos en la raíz

+ Info

Solucionar error session_start – header already sent – PHP:MySQL Tips

The PHP logo displaying the Handel Gothic font.

Os suena este error:

warning: session_start()[function.session-start]:cannot send session cache limiter – header already sent (output started at ….

De primeras tenemos que el session_start hay que ponerlo al principio de todo, fuera de la sección html, a veces el error viene por otro lado, la otra posibilidad

suele suceder cuando escribimos el session_start() en un fichero en el cual ya se ha iniciado la sesión en otro punto, como por ejemplo tenemos un fichero con funciones

el cual incluimos en otro fichero en el cual hemos puesto en la cabecera el session_start() y para proteger el fichero de funciones ponemos también el session_start(), tenemos

que ponerlo en los dos sitios si o si. Pues bien para solucionar esto me he creado una pequeña función, la cual pongo en el principio de mis ficheros php que chequea si se ha iniciado la sesión, si es asi regenera el id y si no pues la inicia.

function checkSession() {
if ( session_id() != null ){
session_regenerate_id();
} else {
session_start();
}

Llamo a la función en las cabeceras, si el session_id no es nulo se regenera, es decir la sesión esta iniciada, si no se inicia.

Saneando inputs – PHP:MySQL Tips

Como bien dice el mantra filter input – escape output
Una de las maneras que tenemos para filtrar los valores que nos llegan antes de usarlos, por ejemplo en una consulta mysql es por medio de la función mysql_real_escape_string($string, $link).
He desarrollado una pequeña función la cual si le pasamos un array o un string nos lo filtra. Esta función me es muy útil cuando envió a una pagina o bien vía $_GET o bien $_POST.

function sanitize( &$vars ) {
    global $con; // identificador de la conexion mysql
    if ( is_array( $vars ) ) {
        foreach ( $vars as &$var ) {
            mysql_real_escape_string( $var, $con );
        }
    } elseif ( is_string( $vars ) ) {
        mysql_real_escape_string( $vars, $con );
    }
}
// Aquí llamamos a la función - ejemplo
if( isset( $_GET ) ) {
    sanitize( $_GET );
}
if ( isset( $_POST ) ) {
    sanitize( $_POST );
}

De esta manera si tenemos un fichero con funciones ponemos esta y llamamos a la función en las cabeceras de los ficheros donde recibamos datos y cuando los tratemos ya los tendremos saneados para trabajar con ellos.
+Info: http://es2.php.net/manual/en/function.mysql-real-escape-string.php

Solución al error Asigment in condition – PHP:MySQL Tips

Los que desarrollamos con Zend Studio o con Eclipse y nos da por abrir proyectos antiguos, vemos que se nos empieza a quejar de errores en nuestro codigo antiguo. Uno de estos errores es el de ‘Asigment in condition’que viene a decir que estamos asignando un valor en una condicional.
Veamos el ejemplo.
Los que somos de la vieja escuela de PHP realizabamos las consultas a MySQL como nos las habian explicado, por lo menos en mi caso era de esta manera:

$sql = "Select * from `tabla`";
$consulta = mysql_db_query($dbname, $sql, $con);
while ( $resultado = mysql_fetch_array($consulta)) {
echo $resultado[0],$resultado[1];// presentábamos los datos 
}

Bien esta sintaxis la cual nos aprendimos de memoria ahora nos tirara dos errores. El primero lo explique en una entrada anterior y es el mysql_db_query, el cual ha pasado a deprecated y hay que usar el mysql_query($sql, $con), y la base de datos pasa a establecerse con la funcion mysql_select_db($dbname)
El segundo error que nos dará, es en el while el cual es debido a que estamos asignando valor a $resultado dentro de una estructura condicional. Para solucionarlo rápidamente añadiremos true == delante o detrás de la estructura.
La estructura corregida quedara de la siguiente manera

mysql_select_db($dbname); // Seleccionamos la base de datos para trabajar
$sql = "Select * from `tabla`";
$consulta = mysql_query($sql, $con);
while ( true == ($resultado = mysql_fetch_array($consulta))) {
echo $resultado[0],$resultado[1];// presentábamos los datos 
}

Si analizamos la sentencia de la condicional ahora dice mientras la asignacion de valor a resultado sea verdadero hara el echo.
+Info: Aquí

Acortando if-else. El operador ternario

A la hora de programar muchas veces escribimos los típicos si es esto escribe esto si no escribe lo otro.
Este codigo podia ser el siguiente:
Supongamos que $valor puede tener el valor true o false

if ($valor ) {
$resultado = 'El resultado es correcto';
} else {
$resultado = 'El resultado es falso';
}

Pues bien, una manera de acortarlo y dejarlo en una sola linea es con el operador ternario ‘?:’ y quedaria de la siguiente manera:

$resultado = ($valor) ? 'El resultado es correcto':'El resultado es falso';

UTF-8 Por defecto en nuestras conexiones PHP:MySQL Tips

Conexión a MySQL clasica

$con = mysql_connect ("localhost","user","password") or die (mysql_error()); // establecemos la conexion
mysql_set_charset('utf8', $con); // establecemos el Charset
$dbname = "midb"; 
mysql_select_db($dbname, $con); // establecemos la base de datos por defecto
// Consulta de ejemplo
$sql = "Select * from mitabla";
// como mysql_db_query esta deprecated tenemos que acostumbrarnos a usar el mysql_query
$consulta = mysql_query($sql,$con); // asi ya no es necesario usar el $dbname en todas las consultas

Conexion a MySQL con Zend_Dd

require_once 'Zend/Loader/Autoloader.php'; // Para que me haga la autocarga de Zend
Zend_Loader_Autoloader::getInstance(); // Establece la autocarga
$pdoParams = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');
$this->db = Zend_Db::factory('Pdo_Mysql',array(
    'host'  =>  'localhost',
    'username'  =>  'user',
    'password'  =>  'password',
    'dbname'    =>  'midb',
    'driver_options' => $pdoParams
));