Consejos útiles para principiantes en PHP

Para todos aquellos que comienzan a desarrollar aplicaciones con PHP, es recomendable conocer estos consejos para optimizar sus aplicaciones, esto te ahorrará trabajo de escritura de código, te dará una mejor estructura y será más legible tu código para otras personas. Los consejos son los siguientes:

Clase de conexión para MySQL

Establece la conexión con la base de datos MySQL o cualquier otra mediante una clase (class), y solamente tienes que llamar la clase cuando necesites conectarte, un ejemplo de clase de conexión MySQL es el siguiente:

class BaseDeDatos {
    function BaseDeDatos() {
        $this->host = "localhost"; // El host de la base de datos
        $this->bd = "MiBaseDeDatos"; // Nombre de la base de datos
        $this->usuario = "MiUsuario"; // Usuario de la base de datos
        $this->clave = "MiClave"; // Contraseña de la base de datos
        $this->conexion = mysql_connect($this->host, $this->usuario, $this->clave);
        mysql_select_db($this->bd);
    }
}

Lo único que necesitas hacer es editar la variables, guardarlo en un archivo por ejemplo «class.mysqlconexion.php» y en cada archivo que necesites hacer una conexión a la base de datos, incluye el archivo con la clase de la siguiente manera:

include_once("class.mysqlconexion.php"); // Incluyes el archivo con la clase
$bd = new $BaseDeDatos; // Para llamar a la clase

De esta manera ya puedes realizar las consultas a la base de datos de la siguiente manera:

$resultado = mysql_query("SELECT * FROM tabla ORDER BY id ASC");

Puedes encontrar más información en el manual de PHP (lee también los comentarios, muy útiles)

Trabajando con Magic Quotes

PHP «automagicamente», por razones de seguridad, puede aplicar barras a los datos contenido en las variable $_POST. Esto es una medida importante para prevenir inyecciones SQL. Sin embargo, las barras el tus scripts pueden causar destrozos. Este es método sencillo para negociar con ellos. La mejor manera de manejar las barras es quitarlas de las variables con la directiva magic quotes, pero ¿qué sucede si esta directiva no está habilitada?

function magicQuotes($_POST) {
	if (get_magic_quotes_gpc()) {
		if (is_array($_POST) {
			return array_map(\'stripslashes\',$_POST);
		} else {
			return stripslashes($_POST);
		}
	} else {
		return; // Si magic quotes están apagadas, no hacemos nada
	}
}

La función de arriba verifica que magic quotes estén habilitadas, Si sí están determina si la variable $_POST es una matriz (array) y después quita las barras de acuerdo a cómo corresponda..

Nota: esta es una validación muy básica, no es 100% confiable aunque efectiva, para hacer una validación más segura, se recomienda validar todos los datos enviados con expresiones regulares (la cuál es la manera más común de hacerlo).

Más información acerca de magic quotes (comillas mágicas).
Más información acerca de inyección SQL (en inglés) (español).

Más información acerca de expresiones regulares (en inglés) o (en español).

Consultas seguras con mysql_real_escape_string

Cuando tienes todo listo para realizar consultas a tu base de datos MySQL, vas a necesitar escapar (quitar), caracteres especiales (comillas principalmente) y agregando barras. Es necesario aplicar estos cambios a los datos antes de ser insertados en la base de datos. Esta es una función de ejemplo, antes de comenzar a escapar caracteres necesitamos determinar la versión de PHP que utilizamos, para poder aplicar ‘mysql_real_escape_string’ o ‘mysql_escape_string’ según corresponda:

function EscaparCadena($_POST) {
	if (phpversion() >= \'4.3.0\') {
		return array_map(\'mysql_real_escape_string\',$_POST);
	} else {
		return array_map(\'mysql_escape_string\',$_POST);
	}
}

Más información acerca de mysql_real_escape_string (en inglés).

Depuración

Lo más importante para poder depurar todos tus scripts es preguntarle a PHP que puedes hacer, es es muy fácil, PHP reporta los errores de tus scripts, pero casi siempre esta característica está deshabilitada, la manera más sencilla de agregar esta línea al principio de tus scripts::
error_reporting(E_ALL);
Esto te imprimirá en pantalla todos los errores, y te va a ayudar a corregirlos a tiempo. El error más común que E_ALL reporta no es precisamente un error, es una noticia para un «Undefined index». Típicamente significa que no has puesto tu variable apropiadamente. Es fácil de arreglar y te mantiene programando correctamente.

Otra herramienta útil mienras trabajas con consultas es print_r(). Si una consulta te regresa valores nulos o extraños, simplemente agrega esto después de tu consulta, y el contenido de tu variale matriz $resultado será mostrado en pantalla.
print_r($resultado); exit;
El comando exit detiene la ejecución del script para no causar problemas..

Más información acerca de error_reporting (en inglés).
Más información acerca de print_r (en inglés).

Comienza a escribir funciones (y Clases)

Muchos tiene la creencia que aprender a usar funciones y clases es difícil, pero solo es cuestión de ser paciente al principio, Escribir funciones es algo que todo principiante debe comenzar a escribir inmediatemente, es muy sencillo. Va a comprender cómo producir piezas de código más eficientemente. En lugar de tener varias líneas de código como el ejemplo:

if ($rs[\'prefijo\'] == 1) {
	$prfijo = \'Señora \';
} elseif ($rs[\'prefijo\'] == 2) {
	$prfijo = \'Señorita \';
} else {
	$prfijo = \'Señor \';
}
echo $prfijo.$rs[\'nombre\'].\' \'.$rs[\'apellido\'];

Puedes reescribirlo en una función:

function ponerPrefijo($prefijo=\'\')
{
	if (!$prefijo) return \'\';
	if ($prefijo == 1) return \'Señora \';
	if ($prefijo == 2) return \'Señorita \';
	if ($prefijo == 3) return \'Señor \';
}
echo ponerPrefijo($rs[\'prefijo\']) . $rs[\'nombre\'] . \' \' . $rs[\'apellido\'];

Ahora que ya has escrito esta función la puedes utilizar en varios proyectos,

Una manera fácil de describir clases classes es una colección de funciones que trabajan juntas. Escribir una buena clase requiere comprender la estructura de Programación Orientada a Objetos de PHP 5.

Más información acerca de cómo escribir funciones
Más información acerca de cómo escribir clases

Comillas dobles y comillas simples

Comillas simples y comillas dobles a veces son confusas para los principiantes pero con el tiempo no tienen porque serlo. Es fácil de entender, las comillas dobles permiten a PHP analizar la cadena en busca de variables y las comillas simples no, estos son unos ejemplos:

// bien
$variable = $valor;
// bien, pero las dobles comillas no son necesarias
$variable = "$valor";
// No trabajará (comillas simples no analizan la cadena)
$variable = \'$valor\';

(Para juntar o conectar variables se utiliza ‘.’ pero muchas veces los programadores dejan espacios entre el punto ‘ . ‘ para hacer el código más fácil de leer.)

// bien, técnica preferida
$variable = \'Este es el \' . $valor . \' de algo.\';
// bien, pero difícil de leer/depurar
$variable = "This is the $valor of things.";
// No va a analizar $valor
$variable = \'Este es el $valor de algo.\';
// ERROR
$variable = Este es el $valor de algo.;
// bien, generalmente la técnica preferida
$variable = $array[\'nombre\'];
// bien, pero no es necesario utilizar las comillas dobles
$variable = $array["nombre"];
// bien, pero difícil de leer/depurar, pobre estilo
$variable = "$array[nombre]";
// bien, técnica preferida
$variable = \'Nombre: \' . $array[\'nombre\'];
// bien, pero difícil de leer/depurar, pobre estilo
$variable = "Nombre: $array[nombre]";
// ERROR
$variable = "Nombre: $array["nombre"]";
// ERROR
$variable = "Nombre: $array[\'nombre\']";
// bien
FuncioDeEjemplo($valor);
// bien, pero no es necesario utilizar las comillas dobles
FuncioDeEjemplo("$valor");
// No va a analizar $valor
FuncioDeEjemplo(\'$valor\');

Problemas con el estilo

Esto es una cuestión más de conveniencia que de estilo, para hacer scripts de tal manera que sean fáciles de leer y depurar. Si para escribir tu código estás utilizando un editor que te resalte el código va a ser fácil identificar las partes, pero se va a resaltar correctamente siempre y cuando esté correctamente escrito, estos son algunos ejemplos.

// Está bien - fácil de leer y depurar
$line = $resultado[\'nombre\'] . \' \' . $resultado[\'apellido\'];

// Está bien, ¿pero por qué utilizar doble comilla si no es necesario?
$line = $resultado["nombre"] . \' \' . $resultado["apellido"];

// Está bien - pero muy difícil de leer y depurar, estilo de código pobre
$line = "$resultado[nombre] $resultado[apellido]";

// Muy bien - el método preferido, utilizando una función
$line = $resultado[\'nombre\'] . \' \' . hacerAlgo($resultado[\'apellido\']);

Si estás trabajando en un grupo donde otras personas tienen acceso a tus scripts, debes hacerlo accesible para ellos y que en un futuro tú o ellos lo puedan modificar y entender sin problemas.

El operador ternario

El operador ternario es similar a la declaración if/else excepto que este es más racional, este es un ejemplo de una declaración if/else tradicional:

if (empty($_POST[\'accion\'])) {
	$accion = \'predeterminada\';
} else {
	$accion = $_POST[\'accion\'];
}

Este ejemplo con el operador ternario, producirá el mismo resultado que el ejemplo anterior utilizando menos espacio. Hace uso de ? y : tal cómo if y else.

$accion = (empty($_POST[\'accion\'])) ? \'predeterminada\' : $_POST[\'accion\'];

Para trabajar con operadores ternarios, tal vez solamente haga falta practicar – asegurate de ir probando tu trabajo cada vez que haya un avance.

Más infrmación acerca de operadores ternarios en esta comparación de operadores en PHP (en inglés)

Consultas seguras

Las consulta a la base de datos seguras es un tema extense pero seré breve aquí. Estoy utilizando funciones, diferente a la forma tradicional que es clases, pero se pueden adaptar, esto es solo con fines prácticos.

Una consulta segura no va a mostrar mensajes de error del servidor que puedan revelar rutas de la información o dar accidentalmente informnación valiosa a los hackers acerca de nuestro servidor. Ciertamente la seguridad a cambio de ocultar información no es lo mejor, pero reducir los mensajes de error que se muestran al usuario final está bien una vez que se ha lanzado el sitio.

Utilizaremos la clase de conexión de uno de los consejos anteriores y algunas funciones para hacer las consultas. La primera función realiza la consulta actual utilizando msyql_query. Si la cadena de consulta está vacía regresará FALSE.

function ConsultaSegura($consulta=\'\')
{
	global $bd;
	if (!$consulta) return false;
	return mysql_query($consulta, $bd->link);
}

Las siguientes 2 funciones de ejemplo son nuestros medios para realizar consultas. Note que nuestra función fetchArray() va a regresar una matriz de los resultados mientas que la función fetchRow() va a regresar una simple fila. Si alguna de las funciones no regresa resultados, se va a regresar FALSE will be returned.

// regresa una matriz de los resultados
function fetchArray($consulta=\'\')
{
	if ($result = ConsultaSegura($consulta)) {
		if (mysql_num_rows($resultado) > 0) {
			while ($matriz = mysql_fetch_assoc($resultado)) $filas[] = $matriz;
			return $filas;
		}
	}
	return false;
}

// Regresa un registro simple
function fetchRecord($consulta=\'\')
{
	if ($fila = ConsultaSegura($consulta)) {
		if (mysql_num_rows($fila) > 0) {
			return mysql_fetch_assoc($fila);
		}
	}
	return false;
}

Ahora, con una simple línea de código podemos realizar nuestra consulta para regresar nuestros resultados.

$resultados = fetchArray("SELECT id, campo1 FROM registros");

// ejemplo de salida de resultados
if (!$resultados) {
	echo \'No hay resultados.\';
} else {
	// bucle de datos
	foreach ($resultados as $resultado) {
		echo $resultado[\'id\'] . \' \' . $resultado[\'campo1\'];
	}
}

Con estas propuestas también puedes definir tus consultas más específicamente para INSERT, DELETE, etc., y/o para tareas repetitivas. Una vez que tengas tu grupo de funciones hasta te pueden servir para reciclarlas en otros proyectos.

Si comprendes cómo trabajan estas funciones para realizar consultas seguras, probablemente estés listo para explorar la comúnmente utilizada PEAR DB database abstraction class, esta clase, la cual es Open Source, te va a dar más flexibilidad, características de depuración, y puede trabajar en más una base de datos MySQL.

Escríbe un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

3 comentarios en “Consejos útiles para principiantes en PHP”

  1. Hola:
    Espero que puedas ayudarme ya que veo que controlas mucho sobre php.
    Quiero quitar las comillas simples. Tengo un archivo por ejemplo llamado ‘prueba’.pdf y quiero quitar esas comillas. Cómo puedo hacerlo?? hay alguna función??
    Es que lo que hago es ponerle \ delante de la comilla pero luego al abrir el archivo desde la aplicación que estoy programando y con mozilla mi abre con y sin comillas pero el explorer sólo me abre el de sin comillas.
    Espero que puedas ayudarme porque además es muy urgente.

    Gracias