2009-05-18 8 views
7

J'ai utilisé PHP depuis un moment maintenant et je me suis toujours demandé comment représenter une forme unique pour gérer les mises à jour et les insertions dans une base de données. Pour l'instant, j'utilise 2 formulaires séparés pour faire cela et ils ont tous deux les mêmes informations et les mêmes zones de texte, etc. Je sais qu'il existe une meilleure façon de gérer cela, mais je ne suis pas sûr de ce que c'est.Meilleure pratique de conception de formulaire PHP

J'ai essayé d'utiliser une seule forme dans le passé, mais le code HTML mélangé avec le php a l'air terrible et est vraiment difficile à maintenir. Je suis après "propre" et soigné.

Quelqu'un peut-il me mettre sur la bonne voie s'il vous plaît. Une des choses que je dois utiliser sont des valeurs POST si l'utilisateur soumet le formulaire et que la validation n'a pas réussi, l'actualisation ne devrait pas effacer les valeurs déjà entrées.

Répondre

5

Vous pouvez utiliser un formulaire unique, avec un champ masqué pour id. Si ce champ est défini, vous devez mettre à jour l'enregistrement $_POST['id'] avec le reste du formulaire. Si le champ n'est pas défini (c'est-à-dire qu'il a valeur = ""), vous devez insérer les données du formulaire dans un nouvel enregistrement.

Vous définissez le champ id selon l'action, par exemple /data/edit/1 met le champ id-, and/data/new` valeur définie sera pas.

Par exemple, votre point de vue pourrait être

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

Dans le cas d'un nouvel enregistrement, appelez votre point de vue avec les données suivantes

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

Dans le cas d'un enregistrement connu, simplement initialiser le $data objet avec les données

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

Salut Elazar, merci pour votre aide. Y at-il un exemple ou pouvez-vous fournir un lien pour que je puisse voir exactement ce que vous voulez dire? Cela a du sens mais je ne peux pas l'imaginer. Je ne vois pas que votre suggestion soit très différente de ce que je faisais en premier lieu. –

+2

N'oubliez pas de vérifier que l'utilisateur actuel possède cet ID –

+0

Pourquoi même avoir un champ d'identification si l'action pour l'édition contient quand même l'ID? – rojoca

1

Voici comment je le ferais probablement sans t en utilisant d'autres cadres/bibliothèques, etc. C'est essentiellement ce qu'a dit 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> 
Questions connexes