Introducción
PHP sigue siendo uno de los lenguajes más populares para el desarrollo web, a pesar de la aparición de muchas alternativas. Sin embargo, los principiantes suelen cometer errores típicos que pueden provocar vulnerabilidades, reducción del rendimiento o simplemente código que no funciona. En este artículo, analizaremos los 5 errores principales de los desarrolladores principiantes de PHP, mostraremos ejemplos de código incorrecto y daremos recomendaciones para corregirlos. El material será útil tanto para quienes recién comienzan a estudiar PHP como para quienes desean refrescar sus conocimientos.
1. Ignorar la seguridad: Inyecciones SQL y XSS
El error más común y peligroso es el filtrado insuficiente de los datos del usuario. Muchos principiantes toman datos directamente de $_GET o $_POST y los insertan en consultas SQL o los muestran en la página sin escaparlos.
Código incorrecto (Inyección SQL)
<?php$username = $_POST['username'];$password = $_POST['password'];
// Consulta vulnerable$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";$result = mysqli_query($conn, $sql);?>Si un atacante introduce en el campo username el valor ' OR '1'='1, la consulta devolverá todos los usuarios y el inicio de sesión se realizará sin contraseña.
Código correcto (Uso de consultas preparadas)
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");$stmt->bind_param("ss", $username, $password);$stmt->execute();$result = $stmt->get_result();?>Lo mismo aplica para la salida de datos en HTML. Utilice siempre htmlspecialchars() para escapar los caracteres especiales:
<?phpecho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');?>2. Descuidar la tipificación estricta
PHP es un lenguaje de tipificación dinámica, y los principiantes a menudo confían en la conversión automática de tipos. Esto puede llevar a resultados inesperados, especialmente en las comparaciones.
Ejemplo de comportamiento no evidente
<?php$value = "100 apples";if ($value == 100) { echo "Igual a 100"; // ¡Imprimirá "Igual a 100"!}?>La cadena "100 apples" se convierte implícitamente al número 100, por lo que la condición es verdadera. Utilice la comparación estricta (===) y la tipificación estricta en proyectos modernos:
Recomendaciones
- Declare
declare(strict_types=1);al inicio de cada archivo. - Utilice la comparación estricta
===y!==en lugar de==y!=. - Indique explícitamente los tipos de los argumentos y los valores de retorno de las funciones.
<?phpdeclare(strict_types=1);
function calculateTotal(float $price, int $quantity): float { return $price * $quantity;}?>3. Fugas de memoria y gestión ineficiente de recursos
Los principiantes a menudo olvidan cerrar archivos, conexiones a la base de datos o liberar memoria después de trabajar con grandes cantidades de datos. En PHP, el recolector de basura funciona automáticamente, pero eso no significa que se pueda ignorar la gestión de recursos.
Error típico: Conexión no cerrada
<?php$conn = new mysqli($host, $user, $pass, $db);// ... mucho código ...// Se olvidó de llamar a $conn->close();?>Enfoque correcto: Uso de try-finally o gestores de recursos
<?php$conn = new mysqli($host, $user, $pass, $db);try { // trabajo con la BD} finally { $conn->close();}?>Para trabajar con archivos, use fopen()/fclose() en pareja, y para arrays grandes, use unset() después de usarlos. En versiones modernas de PHP, se pueden usar generadores (yield) para procesar grandes conjuntos de datos sin cargarlos todos en la memoria.