PHP declarar(tipos_estrictos=1); require_once __DIR__ . '/config.php'; $dbHost = 'localhost'; $dbName = 'u385429974_libros'; $dbUser = 'u385429974_libros'; $dbPass = 'Iliass1983&&&&&&'; $dbCharset = 'utf8mb4'; $opciones = [ PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPCIÓN, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => falso, ]; función create_pdo(cadena $host, ?cadena $base de datos, cadena $usuario, cadena $contraseña, cadena $conjunto de caracteres, matriz $opciones): PDO { $dsn = "mysql:host={$host};charset={$charset}"; si ($base de datos! == nulo) { $dsn = "mysql:host={$host};dbname={$database};charset={$charset}"; } devolver nuevo PDO($dsn, $usuario, $contraseña, $opciones); } función install_database(PDO $pdo): nulo { $rutaesquema = __DIR__ . '/../base de datos/base de datos.sql'; si (!is_file($schemaPath)) { throw new RuntimeException('Falta base de datos/database.sql.'); } $hasAdminsTable = $pdo->query("MOSTRAR TABLAS COMO 'admins'")->fetchColumn(); si ($hasAdminsTable) { regresar; } $esquema = (cadena) file_get_contents($schemaPath); $esquema = preg_replace('/^\s*CREATE\s+DATABASE\b.*?;\s*$/mi', '', $esquema)?? $esquema; $esquema = preg_replace('/^\s*USE\s+`?[\w-]+`?\s*;\s*$/mi', '', $esquema)?? $esquema; $esquema = str_replace('CREAR TABLA ', 'CREAR TABLA SI NO EXISTE ', $esquema); $esquema = str_replace('INSERT INTO ', 'INSERT IGNORE INTO ', $schema); foreach (array_filter(array_map('recortar', explotar(';', $esquema))) como $declaración) { $pdo->exec($declaración); } } prueba { prueba { $pdo = create_pdo($dbHost, $dbName, $dbUser, $dbPass, $dbCharset, $opciones); } captura (PDOException $e) { $serverPdo = create_pdo($dbHost, null, $dbUser, $dbPass, $dbCharset, $opciones); $serverPdo->exec("CREAR BASE DE DATOS SI NO EXISTE `{$dbName}` CONJUNTO DE CARACTERES utf8mb4 COLLATE utf8mb4_unicode_ci"); $pdo = create_pdo($dbHost, $dbName, $dbUser, $dbPass, $dbCharset, $opciones); } install_database($pdo); } captura (PDOException $e) { http_response_code(500); exit('Error de conexión a la base de datos: ' . $e->getMessage()); } captura (tirable $e) { http_response_code(500); exit('Error de instalación de base de datos: ' . $e->getMessage()); } PHP declarar(tipos_estrictos=1); función e(?cadena $valor): cadena { return htmlspecialchars((cadena) $valor, ENT_QUOTES, 'UTF-8'); } texto de función (? cadena $ valor): cadena { $decodificado = html_entity_decode((cadena) $valor, ENT_QUOTES | ENT_HTML5, 'UTF-8'); devolver htmlspecialchars($decodificado, ENT_QUOTES, 'UTF-8'); } función is_valid_real_email(cadena $correo electrónico): bool { if (!filter_var($correo electrónico, FILTER_VALIDATE_EMAIL)) { devolver falso; } // Verifica si el dominio tiene registros MX para asegurar que pueda recibir correos electrónicos $dominio = substr(strrchr($correo electrónico, "@"), 1); si (!$dominio) { devolver falso; } si (function_exists('checkdnsrr')) { devolver checkdnsrr($dominio, 'MX'); } devolver verdadero; } función render_markdown_inline(cadena $texto): cadena { $texto = e($texto); $texto = preg_replace_callback( '/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/i', fn estática(matriz $match): cadena = ''. $coincidencia[1] . '', $texto ) ?? $texto; $texto = preg_replace('/\*\*([^*]+)\*\*/', '$1', $texto)?? $texto; $texto = preg_replace('/`([^`]+)`/', '$1', $texto)?? $texto; $texto = preg_replace('/(?\*)\*([^*]+)\*(?!\*)/', '<em$1', $texto)?? $texto; devolver $texto; } función render_markdown(cadena $markdown): cadena { $líneas = preg_split('/\R/', trim($markdown))?: []; $html = []; $párrafo = []; $tipo de lista = nulo; $flushParagraph = función estática () uso (&$párrafo, &$html): void { si ($párrafo) { $html[] = '

'. render_markdown_inline(implode(' ', $párrafo)) . '

'; $párrafo = []; } }; $closeList = función estática () uso (&$listType, &$html): void { si ($tipo de lista! == nulo) { $html[] = ''. $tipo de lista. ''; $tipo de lista = nulo; } }; foreach ($líneas como $línea) { $línea = recortar($línea); si ($línea === '') { $flushParagraph(); $cerrarLista(); continuar; } if (preg_match('/^(#{1,4})\s+(.+)$/', $línea, $match)) { $flushParagraph(); $cerrarLista(); $nivel = strlen($partido[1]); $html[] = "" . render_markdown_inline($match[2]) . ""; continuar; } if (preg_match('/^[-*]\s+(.+)$/', $línea, $match)) { $flushParagraph(); si ($tipo de lista! == 'ul') { $cerrarLista(); $listType = 'ul'; $html[] = 'PHP declarar(tipos_estrictos=1); función csrf_token(): cadena { si (vacío($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } devolver $_SESSION['csrf_token']; } función csrf_field(): cadena { devuelve '<tipo de entrada="oculto" nombre="csrf_token" valor="' . e(csrf_token()) . '"'; } función verificar_csrf(): nulo { $token = $_POST['csrf_token'] ?? ''; if (!is_string($token) || !hash_equals($_SESSION['csrf_token'] ?? '', $token)) { http_response_code(419); exit('Token CSRF no válido.'); } }