2009-05-18 22 views
7

He estado usando PHP desde hace un tiempo y siempre me he preguntado cómo representar un solo formulario para manejar las actualizaciones y las inserciones en una base de datos. En este momento, estoy usando dos formularios separados para hacer esto y ambos tienen básicamente la misma información y cuadros de texto, etc. Sé que hay una mejor manera de manejar esto, pero no estoy seguro de qué es eso.Práctica recomendada de diseño de formulario PHP

He tratado de usar una sola forma en el pasado, pero el html mezclado con el php se ve terrible y es realmente difícil de mantener. Estoy después de "limpio" y ordenado.

¿Puede alguien por favor ponerme en el camino correcto.

Una de las cosas que tengo que usar son valores POST si el usuario envía el formulario y la validación no se aprueba, la actualización no debería eliminar los valores ya ingresados.

Respuesta

5

Puede usar un formulario único, con un campo oculto para id. Si este campo está configurado, entonces debe actualizar el registro $_POST['id'] con el resto del formulario. Si el campo no está establecido (es decir, tiene valor = ""), debe insertar los datos del formulario en un nuevo registro.

deberá definir el campo id acuerdo a la acción, por ejemplo /data/edit/1 va a establecer el campo id a , and/datos/new` no va a establecer el valor a la misma.

Por ejemplo, la vista podría ser

<form action="/data/edit/1"> 
<input type="hidden" value="<?php echo $data->id; ?>" /> 
<input type="text" value="<?php echo $data->name; ?>" /> 
</form> 

En caso de un nuevo registro, llame a su punto de vista con los datos siguientes

$data->id = ''; 
$data->name = ''; 

En caso de un registro conocido, sólo tiene que inicializar el $data objeto con los datos

$data->id = $record_id; 
$data->name = $record_name; 
+0

Hola Elazar, gracias por la ayuda. ¿Hay algún ejemplo o puedes proporcionar un enlace para que pueda ver exactamente lo que quieres decir? Tiene sentido, pero no puedo imaginarlo. No veo que tu sugerencia sea muy diferente a como lo estaba haciendo en primer lugar. –

+2

No olvide comprobar que el usuario actual posee esa ID –

+0

¿Por qué incluso tener un campo de id si la acción para la edición contiene la id de todos modos? – rojoca

1

Así es como yo probablemente lo haría sin ti usando cualquier otro framework/biblioteca, etc. Básicamente es lo que dijo Elazar Leibovich.

<?php 
    //id is zero or a record id depending on whether updating or inserting 
    //an existing record could be edited using edit.php?id=10 
    //if the id GET parameter is omitted a new record will be created 
    $id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0; 
    $error = ''; 

    if ($id) { 
     //this array would be in the same format as the one below 
     $record = fetchRecordFromDb($id);  
    } else { 
     $record = array('field1' => 'default value', 'field2' => 'some other default');  
    } 

    //allow POST data to override what is already in the form 
    foreach ($record as $key => $value) { 
     if (isset($_POST[$key])) { 
      $record[$key] = $_POST[$key]; 
     } 
    } 

    if (isset($_POST['submit'])) { 
     if (!validateForm()) { 
      $error = 'Some form error'; 
     } else { 
      if ($id) { 
       updateRecord($id, $record); 
      } else { 
       insertRecord($record); 
      } 

      //ok, redirect somewhere else 
      header('Location: http://somewhere'); 
      exit(); 
     } 
    } 

    ?> 

    <form method="post"> 
     <?php echo $error; ?> 
     <input type="hidden" name="id" value="<?php echo $id; ?>"> 
     <input type="text" name="field1" value="<?php echo htmlspecialchars($record['field1']); ?>"><br /> 
     <input type="text" name="field2" value="<?php echo htmlspecialchars($record['field2']); ?>"><br /> 
     <input type="submit" name="submit"> 
    </form> 
Cuestiones relacionadas