2009-05-18 23 views
7

Şimdilik bir süredir PHP kullanıyordum ve her zaman güncellemeleri ele almak ve veritabanına eklemek için tek bir formu nasıl temsil ettiğimi merak ettim. Şu anda, bunu yapmak için 2 ayrı form kullanıyorum ve her ikisi de temelde aynı bilgi ve metin kutularına sahipler, vs. Bunu daha iyi ele aldığımı biliyorum ama bunun ne olduğundan emin değilim.PHP form tasarımı en iyi uygulama

Geçmişte tek bir form kullanmayı denedim ama php ile karıştırılan html korkunç görünüyor ve bakımı gerçekten zor. "Temiz" ve temizim.

Lütfen birisi beni doğru yola sokabilir.

Kullanmam gereken şeylerden biri, kullanıcı formu gönderir ve doğrulama geçmediyse POST değerleridir, yenileme zaten girilmiş değerleri silmemelidir.

cevap

5

id için gizli bir alana sahip tek bir form kullanabilirsiniz. Bu alan ayarlanırsa - formun geri kalanıyla $_POST['id'] kaydını güncelleştirmelisiniz. Alan ayarlanmamışsa (yani, değeri = ""), form verilerini yeni bir kayda eklemelisiniz.

Örneğin /data/edit/1 için kendisine değeri olmaz , and/veri/new` için id alanını belirleyecektir, eyleme göre id alanını belirleriz.

Örneğin, görünüm, yeni bir rekor durumunda

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

, aşağıdaki verilere bilinen kaydının durumunda

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

ile görünümünüzü çağrı olabilir, basitçe $data init veri ile nesne

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

Merhaba Elazar, yardımlarınız için teşekkürler. Bir örnek var mı yoksa tam olarak ne demek istediğimi görebilmem için bir link verebilir misiniz? Mantıklı ama resmini çekemiyorum. Önerin, ilk etapta yaptığımdan çok farklı olduğunu görmüyorum. –

+2

Geçerli kullanıcının o kimliğe sahip olduğunu kontrol etmeyi unutma –

+0

Düzenleme eylemi yine de kimliği içeriyorsa neden bir kimlik alanı var? – rojoca

1

Muhtemelen bunu nasıl yapacağım Diğer herhangi bir çerçeveyi/kütüphaneyi kullanmak vb. Bu, Elazar Leibovich'in söylediği şeydir.

<?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>