Stack Overflow en español Asked by wlf dk on February 16, 2021
Estoy tratando de generar un archivo PDF a partir de un formulario, pero al generar el PDF no me genera los datos, me marca el siguiente error en cada linea del archivo PDF donde debería de aparecer los datos ingresados por el usuario: (Notice: Undefined variable: dep in /Applications/XAMPP/xamppfiles/htdocs/Form/calcular.php on line 25).
El objetivo es generar un PDF con los datos ingresados por el usuario
pero estos no se almacenan, espero puedan ayudarme y gracias de antemano.
Archivo index.html:
<html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="estilos.css">
<title>Datos</title>
</head>
<body>
<div>
<form action="calcular.php" method="POST">
<h1>Formulario</h1>
<div class ="dpto">
<label for="dpto">Departamento:</label>
<select name="dep" id="">
<option value="1">1</option>
<option value="2">2</option>
<option value="Otra">Otra</option>
<option value="Otra">Otra</option>
</select>
</div>
<div class ="campRest">
<label for="">nombre: </label>
<input type="text" name="nom">
<label for="">Ciudad: </label>
<input type="text" name="Ciudad">
<label for="">Sobre mi: </label>
<input type="text" name="mi">
<label for="">Metas:</label>
<input type="text" name="meta">
<label for="">fecha de nacimiento: </label>
<input type="date" name="fecha">
<label for="">apodo: </label>
<input type="text" name="apodo">
<label for="">Comentarios: </label>
<textarea cols="66" rows="5" wrap="hard" name="comentario">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Repellat laboriosam deserunt ullam tenetur error, sunt consectetur repudiandae magni. Repellat hic dolore commodi, inventore consequatur libero sapiente voluptatibus expedita illo cum.</textarea>
<input type="submit" value="Enviar">
</div>
</form>
</div>
</body>
</html>
Archivo calcular.php
<?php
// Inicializar sesión solo si no se ha iniciado
if(!defined('SESSION_STARTED')) {
session_start();
}
if($_SERVER['REQUEST_METHOD']=='POST'){
// Si se va a procesar el formulario
$dep = $_POST['dep'];
$nom = $_POST['nom'];
$Ciudad = $_POST['Ciudad'];
$mi = $_POST['mi'];
$meta = $_POST['meta'];
$fecha = $_POST['fecha'];
$apodo = $_POST['apodo'];
$comentario = $_POST['comentario'];
// Crear variable de sesión para que se pueda generar el PDF
$_SESSION['pdf'] = [
'dep' => $dep,
'nom' => $nom,
'ciudad' => $Ciudad,
'mi' => $mi,
'meta' => $meta,
'fecha' => $fecha,
'apodo' => $apodo,
'comentario' => $comentario
];
// Enlace de descarga solo si se procesa formulario
$descarga = '<a class="btn btn-primary" href="crearPdf.php"><i class="fa fa-download"></i> Descargar archivo PDF</a>';
} elseif(isset($_SESSION['pdf'])) {
// Se va a crear el PDF
$dep = $_SESSION['pdf']['dep'];
$nom = $_SESSION['pdf']['nom'];
$Ciudad = $_SESSION['pdf']['Ciudad'];
$mi = $_SESSION['pdf']['mi'];
$meta = $_SESSION['pdf']['meta'];
$fecha = $_SESSION['pdf']['fecha'];
$apodo = $_SESSION['pdf']['apodo'];
$comentario = $_SESSION['pdf']['comentario'];
// No hay enlace de descarga al crear PDF
$descarga = '';
} else {
die('No hay datos para procesar.');
}
// Salida con sintaxis HEREDOC
echo <<<HTML
<html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Datos2</title>
<link rel="stylesheet" href="style.css">
</head>
<div class ="contenedor">
<h1>Formulario</h1>
<p><h4>Departamento</h4>$dep</p><br>
<p><h4>nombre:</h4>$nom</p><br>
<p><h4>Ciudad::</h4>$Ciudad</p><br>
<p><h4>Sobre mi:</h4>$mi</p><br>
<p><h4>Metas:</h4>$meta</p><br>
<p><h4>fecha de nacimiento:</h4>$fecha</p><br>
<p><h4>apodo:</h4>$apodo</p><br>
<p><h4>Comentarios:</h4>$comentario</p><br>
</div>
$descarga
</html>
HTML; // Esta línea debe estar en la primera columna o va a generar error
Archivo que renderiza el PDF:
<?php
// Iniciar sesión
session_start();
// Verificar que existe la variable de sesión
if(!isset($_SESSION['pdf'])) {
die('Primero debes realizar el cálculo.');
}
// Definir constante para no duplicar inicio de sesión
define('SESSION_STARTED', 1);
// Cargamos la librería dompdf que hemos instalado en la carpeta dompdf
require_once 'dompdf/autoload.inc.php';
use DompdfDompdf;
// Inicializar buffer de salida
ob_start();
// Incluir script que genera HTML
include 'calcular.php';
// Obtener HTML y limpiar buffer
$html = ob_get_clean();
// Instanciamos un objeto de la clase DOMPDF.
$pdf = new DOMPDF();
// Define el tamaño y orientación del papel.
$pdf->set_paper("letter", "portrait");
// Carga el contenido HTML.
$pdf->load_html(utf8_decode($html));
// Renderiza el documento PDF.
$pdf->render();
// Enviamos el fichero PDF al navegador.
$pdf->stream('notaPdf.pdf');
// Eliminar variable de sesión
unset($_SESSION['pdf']);
El problema es que en calcular.php
siempre esperas recibir los datos por $_POST
, sin embargo, al crear el PDF ejecutas $html=file_get_contents("http://localhost/Formulario2/calcular.php");
con la petición por método $_GET
y, por supuesto, las variables no existen. Podrías crearlas como variables de sesión.
Respecto al consejo que te dieron en comentarios de no mezclar salida HTML con etiquetas de apertura y cierre de PHP, puedes usar la sintaxis HEREDOC, donde se interpretan variables y se remplazan con el valor correspondiente.
<?php
// Inicializar sesión solo si no se ha iniciado
if(!defined('SESSION_STARTED') {
session_start();
}
if($_SERVER['REQUEST_METHOD']=='POST'){
// Si se va a procesar el formulario
$dep = $_POST['dep'];
$nom = $_POST['nom'];
$Ciudad = $_POST['Ciudad'];
$mi = $_POST['mi'];
$meta = $_POST['meta'];
$fecha = $_POST['fecha'];
$apodo = $_POST['apodo'];
$comentario = $_POST['comentario'];
// Crear variable de sesión para que se pueda generar el PDF
$_SESSION['pdf'] = [
'dep' => $dep,
'nom' => $nom,
'ciudad' => $Ciudad,
'mi' => $mi,
'meta' => $meta,
'fecha' => $fecha,
'apodo' => $apodo,
'comentario' => $comentario
];
// Enlace de descarga solo si se procesa formulario
$descarga = '<a class="btn btn-primary" href="crearPdf.php"><i class="fa fa-download"></i> Descargar archivo PDF</a>';
} elseif(isset($_SESSION['pdf'])) {
// Se va a crear el PDF
$dep = $_SESSION['pdf']['dep'];
$nom = $_SESSION['pdf']['nom'];
$Ciudad = $_SESSION['pdf']['Ciudad'];
$mi = $_SESSION['pdf']['mi'];
$meta = $_SESSION['pdf']['meta'];
$fecha = $_SESSION['pdf']['fecha'];
$apodo = $_SESSION['pdf']['apodo'];
$comentario = $_SESSION['pdf']['comentario'];
// No hay enlace de descarga al crear PDF
$descarga = '';
} else {
die('No hay datos para procesar.');
}
// Salida con sintaxis HEREDOC
echo <<<HTML
<html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Datos2</title>
<link rel="stylesheet" href="style.css">
</head>
<div class ="contenedor">
<h1>Formulario</h1>
<p><h4>Departamento</h4>$dep</p><br>
<p><h4>nombre:</h4>$nom</p><br>
<p><h4>Ciudad::</h4>$Ciudad</p><br>
<p><h4>Sobre mi:</h4>$mi</p><br>
<p><h4>Metas:</h4>$meta</p><br>
<p><h4>fecha de nacimiento:</h4>$fecha</p><br>
<p><h4>apodo:</h4>$apodo</p><br>
<p><h4>Comentarios:</h4>$comentario</p><br>
</div>
$descarga
</html>
HTML; // Esta línea debe estar en la primera columna o va a generar error
En crearPdf.php
agregas session_start();
como primera línea y, al terminar, eliminas la variable de sesión con unset($_SESSION['pdf']);
En lugar de obtener el HTML con file_get_contents()
, incluye directamente calcular.php, capturando el contenido con buffer de salida:
ob_start()
: Para decirle a PHP que almacene la salida en vez de enviarla al navegadorob_get_clean()
: Para obtener la salida, limpiar el buffer y volver al proceso normal de salidaCon esto te aseguras de que el contenido es realmente lo que deseas y evitas petición por URL que, por alguna razón, no te está devolviendo lo que esperas.
<?php
// Iniciar sesión
session_start();
// Verificar que existe la variable de sesión
if(!isset($_SESSION['pdf'])) {
die('Primero debes realizar el cálculo.');
}
// Definir constante para no duplicar inicio de sesión
define('SESSION_STARTED', 1);
// Cargamos la librería dompdf que hemos instalado en la carpeta dompdf
require_once 'dompdf/autoload.inc.php';
use DompdfDompdf;
// Inicializar buffer de salida
ob_start();
// Incluir script que genera HTML
include 'calcular.php';
// Obtener HTML y limpiar buffer
$html = ob_get_clean();
// Instanciamos un objeto de la clase DOMPDF.
$pdf = new DOMPDF();
// Define el tamaño y orientación del papel.
$pdf->set_paper("letter", "portrait");
// Carga el contenido HTML.
$pdf->load_html(utf8_decode($html));
// Renderiza el documento PDF.
$pdf->render();
// Enviamos el fichero PDF al navegador.
$pdf->stream('notaPdf.pdf');
// Eliminar variable de sesión
unset($_SESSION['pdf']);
Answered by Triby on February 16, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP