Conexión a Base de Datos y Subida de Archivos en PHP: Funciones CRUD con MySQLi

Informática y Telecomunicaciones8,93 KB

Funciones de conexión y consultas con MySQLi

Función para abrir la conexión

La función openConnection() abre la conexión con la base de datos. Recibe los datos de acceso: servidor, nombre de usuario, contraseña y nombre de la base.

function openConnection()
{
    // Función para abrir la base de datos
    // Variable con la conexión a la base
    $mysqli = new mysqli('link a la conexión', 'nombre de usuario', 'contraseña', 'nombre de la base');
    // Ejemplo 1
    $mysqli = new mysqli('localhost', 'root', '12345', 'tp5');
    // Ejemplo 2
    $mysqli = new mysqli('mysql.hostinger.com.ar', 'u954706900_iluol', 'contraseña', 'u123456_base');
    if (mysqli_connect_errno()) { // Si hay un error en la conexión
        printf("Connect failed: %s\n", mysqli_connect_errno());
        exit;
    }
    return $mysqli;
}

Función para cerrar la conexión

La función closeConnection() cierra la conexión recibida desde openConnection().

function closeConnection($mysqli)
{
    // Función para cerrar la base de datos, recibe la conexión de openConnection()
    $mysqli->close();
}

Consultar un solo dato

La función obtener1Dato() ejecuta una consulta SELECT con una condición y devuelve un único registro en un array.

function obtener1Dato($dato)
{
    $mysqli = openConnection();
    // El array que voy a devolver
    $devol = array();
    $query = "SELECT dato1, dato2, dato3 // Qué datos, todos los datos: *
    FROM tabla1 // De qué tabla
    INNER JOIN tabla2 ON dato2 = dato3 // Combinando el dato de otra tabla
    WHERE dato4 = ? // Condición. ? va a ser reemplazado por una variable. Más condiciones: AND condición
    ORDER BY dato1 DESC // Ordenado de forma descendente (si no pongo DESC se ordenan ascendentemente por default)
    LIMIT 1 // Límite de resultados";
    // Ejemplo
    $query = "SELECT titulo, copete, cuerpo, fecha, secciones.descripcion
    FROM noticias
    INNER JOIN secciones ON noticias.idseccion = secciones.id
    WHERE idseccion = ?
    ORDER BY fecha DESC
    LIMIT 1";
    // Preparo el query para ser ejecutado
    if ($stmt = $mysqli->prepare($query)) {
        // Reemplazo el ? por $dato
        $stmt->bind_param('s', $dato); // (en orden, i (int) o s (string) de las variables que voy a pasar, todas las variables)
        // Ejecuto
        $stmt->execute();
        // Le doy nombre a los resultados, en orden de como los pido
        $stmt->bind_result($valor1, $valor2, $valor3);
        // Los obtengo
        $stmt->fetch();
        // Los guardo en mi array
        $devol['dato1'] = $valor1;
        $devol['dato2'] = $valor2;
        $devol['dato3'] = $valor3;
        $stmt->close();
    }
    // Cierro la conexión a la base
    closeConnection($mysqli);
    // Devuelvo mi array
    return $devol;
}

Nota: la metodología es la misma para todas las funciones: abrir conexión, query, if, bind_param, execute, bind_result (solo SELECT), close, cerrar base, return (solo SELECT).

Consultar varios datos

La función obtenerVariosDatos() utiliza un while con fetch() para devolver todos los registros encontrados.

function obtenerVariosDatos($dato)
{
    $mysqli = openConnection();
    $devol = array();
    $query = "SELECT titulo, copete, cuerpo, fecha, secciones.descripcion
    FROM noticias
    INNER JOIN secciones ON noticias.idseccion = secciones.id
    WHERE idseccion = ?
    ORDER BY fecha DESC";
    if ($stmt = $mysqli->prepare($query)) {
        $stmt->bind_param('s', $dato);
        $stmt->execute();
        $stmt->bind_result($valor1, $valor2, $valor3);
        // Para obtener varios datos hago un while del fetch
        while ($stmt->fetch()) {
            // Guardo mi fetch actual en un array
            $actual = array(
                  'dato1' => $valor1, 'dato2' => $valor2, 'dato3' => $valor3
            ); // Y lo guardo en mi array para devolver
            $devol[] = $actual;
        }
        $stmt->close();
    }
    closeConnection($mysqli);
    return $devol;
}

Insertar, actualizar y eliminar registros

Estas funciones modifican la tabla noticias mediante INSERT, UPDATE y DELETE.

function agregar($valor1, $valor2, $valor3)
{
    $mysqli = openConnection();
    $query = "INSERT INTO noticias (dato1, dato2, dato3) VALUES (?, ?, ?)";
    if ($stmt = $mysqli->prepare($query)) {
        $stmt->bind_param('iss', $valor1, $valor2, $valor3); // Los datos los ingreso como string excepto el primero
        $stmt->execute();
        // Si quiero obtener un dato automático, como es el id
        $id = $stmt->insert_id;
        $stmt->close();
    }
    closeConnection($mysqli);
}

function actualizar($valor1, $valor2, $valor3, $id)
{
    $mysqli = openConnection();
    $query = "UPDATE noticias SET dato1 = ?, dato2 = ?, dato3 = ? WHERE id = ?"; // No olvidarse de pasar el id: si no, se cambian todos los campos de la tabla
    if ($stmt = $mysqli->prepare($query)) {
        $stmt->bind_param('issi', $valor1, $valor2, $valor3, $id);
        $stmt->execute();
        $stmt->close();
    }
    closeConnection($mysqli);
}

function eliminar($id)
{
    $mysqli = openConnection();
    $query = "DELETE FROM noticias WHERE id = ?"; // No olvidarse de pasar el id: si no, se borran todos los campos de la tabla
    if ($stmt = $mysqli->prepare($query)) {
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $stmt->close();
    }
    closeConnection($mysqli);
}
?>

Subida de archivos en PHP

Formularios para subir uno o varios archivos

Se puede subir un archivo o varios archivos desde un formulario. También pueden usarse varios inputs con distinto nombre, sin necesidad de usarlos como un vector.

Variable global $_FILES

La variable $_FILES contiene la información de los archivos cargados:

  • $_FILES['miArchivo']['name']: el nombre original del archivo en la máquina cliente.
  • $_FILES['miArchivo']['type']: el tipo MIME del archivo, si el navegador proporciona esta información. Un ejemplo podría ser "image/gif". Este tipo MIME no se verifica en el lado de PHP, por lo tanto no se garantiza su valor.
  • $_FILES['miArchivo']['size']: el tamaño, en bytes, del archivo subido.
  • $_FILES['miArchivo']['tmp_name']: el nombre temporal del archivo en el cual se almacena el archivo cargado en el servidor.
  • $_FILES['miArchivo']['error']: el código de error asociado a esta carga de archivo.

Función move_uploaded_file

Con nombre elegido

if (move_uploaded_file($_FILES['miArchivo']['tmp_name'], "ruta/al/directorio/de/archivo-server.jpg")) {
    echo "El archivo es válido y fue cargado exitosamente.\n";
} else {
    echo "¡Posible ataque de carga de archivos!\n";
}

Con el nombre que le puso el usuario en su PC

for ($i = 0; $i < count($_FILES["miArchivo"]["name"]); $i++) {
    $tmp_name = $uploadedFile["tmp_name"][$i];
    $name = basename($_FILES["pictures"]["name"][$i]);
    move_uploaded_file($tmp_name, "ruta/al/directorio/" . $name);
}

Con ID del usuario en la carpeta img

if (move_uploaded_file($_FILES['foto']['tmp_name'], "img/".$_SESSION['id'].".jpg")) {
    echo "El archivo es válido y fue cargado exitosamente.\n";
} else {
    echo "¡Posible ataque de carga de archivos!\n";
}

Descargar

PDF Word HTML