Conexión a Base de Datos y Subida de Archivos en PHP: Funciones CRUD con MySQLi
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";
}