2011-01-24 14 views
5

Cómo se puede procesar un formulario en la misma página en vez de usar una página de proceso separada. Ahora mismo para suscripciones, comentarios, etc. Uso una segunda página que verifica los datos y luego envía y vuelve a home.php. ¿Cómo puedo hacerlo para que, al enviar, la página verifique en lugar de usar una segunda página?Procesamiento de la misma página

+1

¿por qué no solo incluye esa segunda página? –

+3

es un tipo de trabajo sucio, ¿no crees? Se verá limpio si está en la misma página. – AAA

Respuesta

11

Puede indicarle al formulario que lo envíe al auto de PHP, luego verifique las variables $_POST para procesar el formulario. Este método es muy bueno para la comprobación de errores, ya que puede establecer un error y luego volver a cargar el formulario con toda la información que el usuario haya enviado previamente (es decir, no pierda su envío).

Cuando se hace clic en el botón "enviar", se ENVIARÁ la información a la misma página, ejecutando el código PHP en la parte superior. Si se produce un error (en función de sus comprobaciones), el formulario se volverá a cargar para el usuario con los errores mostrados y cualquier información que el usuario haya proporcionado aún en los campos. Si no se produce un error, aparecerá una página de confirmación en lugar del formulario.

<?php 
//Form submitted 
if(isset($_POST['submit'])) { 
    //Error checking 
    if(!$_POST['yourname']) { 
    $error['yourname'] = "<p>Please supply your name.</p>\n"; 
    } 
    if(!$_POST['address']) { 
    $error['address'] = "<p>Please supply your address.</p>\n"; 
    } 

    //No errors, process 
    if(!is_array($error)) { 
    //Process your form 

    //Display confirmation page 
    echo "<p>Thank you for your submission.</p>\n"; 

    //Require or include any page footer you might have 
    //here as well so the style of your page isn't broken. 
    //Then exit the script. 
    exit; 
    } 
} 
?> 

<form method="post" action="<?=$_SERVER['PHP_SELF']?>"> 
    <?=$error['yourname']?> 
    <p><label for="yourname">Your Name:</label><input type="text" id="yourname" name="yourname" value="<?=($_POST['yourname'] ? htmlentities($_POST['yourname']) : '')?>" /></p> 
    <?=$error['address']?> 
    <p><label for="address">Your Address:</label><input type="text" id="address" name="address" value="<?=($_POST['address'] ? htmlentities($_POST['address']) : '')?>" /></p> 
    <p><input type="submit" name="submit" value="Submit" /></p> 
</form> 
+0

Gracias Michael. Justo lo que estaba buscando. Sin embargo, en lugar de agradecerle por su envío, ¿cómo puedo actualizar esa página para que la página pueda cargar la nueva información? No puedo hacer Ajax en este punto, ¡nuevo en el juego de programación! – AAA

+0

Si procesa el formulario antes de obtener los datos (como sugerí), los nuevos datos se tendrán en cuenta automáticamente. – Jonas

+2

@AAA No entiendo tu pregunta. El método anterior es el modelo exacto que uso en el 90% de mis formularios y es más o menos un ejemplo extendido de lo que ha proporcionado @NeqO. ¿Qué estás tratando de lograr en términos de "actualizar" la página? –

6

La construcción es más fácil de detectar si la matriz $_POST no está vacío

if(isset($_POST['myVarInTheForm'])) { 
    // Process the form 
} 

// do the regular job 
1

se puede comprobar si se trataba de solicitud POST dentro del código de la página y luego comprueba los datos. Si se trata de una solicitud GET, simplemente muestre el formulario.

Pero recuerde que es una buena práctica mostrar los resultados de envío de formularios exitosos en una página diferente servida a través de la solicitud GET, es decir, cualquier formulario exitoso POST se debe responder con redirigir a la página de éxito.

+1

¿Por qué lo recomienda como un buen proceso? – diagonalbatman

+0

porque cuando se muestra una página normal en respuesta a POST, los datos se reenviarán al actualizar la página. La mayoría de los navegadores advertirán a los usuarios sobre eso (y la mayoría de los usuarios estarán realmente confundidos con esta advertencia), algunos, como Opera, reenviarán silenciosamente todos los datos POST. En cualquier caso, eso probablemente no sea el comportamiento deseado. Es por eso que recomiendo redirigir a la página de resultados si la solicitud fue exitosa. Está bien, sin embargo, mostrar resultados de validación inmediatamente después del POST, si hubo algún error con los datos y pedirle al usuario que corrija su entrada. –

+0

:-) La única razón por la que pregunté es porque cuando estás aprendiendo, a menudo es útil entender por qué se hace un comentario en particular. – diagonalbatman

1

Por supuesto, puede explorar las solicitudes de AJAX, donde realizaría una llamada asíncrona a su secuencia de comandos del controlador y luego actualizar y luego actualizar la página de envío con un mensaje de éxito. Esto da la impresión de "Procesamiento de la misma página", es decir, la página no tiene que actualizarse.

Sin embargo, realmente depende del efecto que intenta lograr.

+0

Gracias Andy. Intenté implementar Ajax. No pude entender mi cabeza. – AAA

+0

Hay muchos recursos buenos en línea, un sitio que recomendaría sería http://net.tutsplus.com: montones de tutoriales en video para ayudarlo. – diagonalbatman

0

@ Michael Irigoyen: Funciona bien, pero en la primera rn/carga, se muestra:

"Aviso: Undefined variable: error en C: \ xampp \ htdocs \ same_page.php en línea 28 "

¿Cómo gestionar este aviso?

Conseguílo ahora: "isset usado, @ etc. para suprimir errores ..." "Funciona como un encanto!" "Ahora lo probaré en mi código ..."

0

He guardado un mensaje de agradecimiento y actualizado utilizando variables de sesión.

if(!is_array($error)){ 
    $_SESSION['message'] = 'Thank You!'; 
    header('Location: yourpage.php'); 
    exit(); 
} 

y luego usar esto en la parte superior de la forma:

if(isset($_SESSION['message'])){ 
    echo $_SESSION['message']; 
    unset($_SESSION['message']; 
} 

debería Esto actualiza la página y mostrar el mensaje y si actualizar la página de la variable de sesión está vacía por lo que el agradecimiento no se mostrará Esto se llama un mensaje flash.

Cuestiones relacionadas