Veri doğrulama başarısız olduğunda formlarda değerleri İstinat alanlar

5 Cevap php

Ben sorunları doğrulama başarısız olduğunda kullanıcıların verileri korumak için nasıl sergiyi yaşıyorum. Benim mantık bazı büyük hatalar yapıyor olabilir bu yüzden PHP için biraz yeni duyuyorum.

Doğrulama başarısız olursa şu anda tüm alanları temiz sildi ve $ _POST verileri de gitti.

Burada kullanıcı ben Adı alanı muhafaza olmak istiyorum geçersiz e-posta girer varsayarak bazı kodudur. Bu kod çalışmıyor.

<?php
if($_POST['doSubmit'] == 'Submit') {

   $usr_name = $data['Name'];
   $usr_email = $data['Email'];

   if (isEmail($usr_email)==FALSE){
       $err = "Email is invalid.");
       header("Location: index.php?msg=$err");
       exit();
    }

   //do whatever with data

}

if (isset($_GET['msg'])) {
   $msg = mysql_real_escape_string($_GET['msg']);
   echo "<div class=\"msg\">$msg</div><hr />";
}
if (isset ($_POST['Name'])){
   $reusername = $_POST['Name'];}
else{$reusername = "NOTHING";}//to test

 ?>
 <form action="index.php" method="post" >
 <input name="UserName" type="text" size="30" value="<?echo $reusername;?>">
 <input name="Email" type="text" size="30">
 <input name="doSubmit" type="submit" value="submit">
 </form>




 }

5 Cevap

= $ _POST Sonra başarısız olursa değerine benzer bir şey yapabileceğini ['değer']

Ama Vivin cevabı en iyisidir. AJAX hakkında çok şey bilmiyorum ve bu yönetmek mümkün olmaz.

Tamam, öncelikle header("Location: index.php?msg=$err"); gerçekten gerekli değildir. Bu hata, bu gibi yönlendirmek, ama aynı sayfada hataları görüntülemek için değil iyi bir uygulamadır. Ayrıca, bu gibi yönlendirme geri girişlerine içine yazdırabilirsiniz asla böylece formda sonrası tüm verileri kaybetmek anlamına gelir.

Ne yapmanız gereken şudur:

<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>">

Burada herhangi bir hata mevcut olup olmadığını kontrol ediyorum, sonra $usr_email değişkeni ayarlanmış olup olmadığını. Bu iki koşul eşleştirilir sonrası veri alanının değeri özniteliği yazdırılır.

Aksi takdirde, bir kullanıcı sayfasına zararlı kod enjekte çünkü ben fonksiyonunu htmlentities() istimal nedenidir.

Size form olarak aynı sayfada yazı işleme gibi görünür. Bu şeyler yapmak için bir ok yoldur ve neredeyse orada demektir. Yapmanız gereken tüm doğrulama başarısız olursa başarılı olur ama eğer yönlendirmek olduğunu. Böyle

<?php
if( isset( $_POST['number'] ) ) {
    $number = $_POST['number'];
    // validate
    if( $number < 10 ) {
        // process it and then;
        header('Location: success_page.php');
    } else {
        $err = 'Your number is too big';
    }
} else {
    $number = '';
    $err = '';
}

?>


<form method="POST">
    Enter a number less than 10<br/>
    <?php echo $err ?><br/>
    <input name="number" value="<?php echo $number ?>"><br/>
    <input type="submit">
</form> 

Eğer PHP komut dosyası için form verilerini göndermek ve doğrulama başarılı olup olmadığını belirten JSON veri döndürmek için AJAX kullanabilirsiniz. Bu şekilde, alanları temiz sildi olmayacaktır.

Başka bir yol gönderme sayfasına kaydedilen parametreleri geri göndermek için, ve gönderme sayfasında, PHP kullanarak alanları doldurmak.

Ancak, ilk çözüm daha iyi olduğunu düşünüyorum.

UPDATE

Düzenleme kodunuzu net yapar ve bu yüzden bir şey fark ettim. Sizin giriş alanı UserName HTML denir, ama Name PHP başvuruyorsunuz. Işe yaramıyor yüzden muhtemelen. Lütfen alan her zaman değeri ile dolu olan NOTHING? Emin giriş alanının adı ve $_POST aynı kullandığınız simge olun.

Ayrıca, bir hata varsa (header kullanarak) başka bir sayfaya yönlendirmek için gerek yoktur. Aynı sayfada hata iletileri yazdırmak için $errors dizi veya değişken korumak. Daha önce de bahsettiğim gibi Ama sonra PHP (denetleyici katmanı) gelen görünümü katman (html) ayırabilirsiniz beri JSON yaklaşımı kullanmak muhtemelen daha iyi. Yani tek bir dosyada HTML koymak ve başka bir dosyada PHP istiyorum.

EDIT:

Vivin ilgili benim varsayım header yanlış olduğunu yorumladı ve o doğru bu oldu. Dahası ne OP yapıyor i daha az yapılandırılmış bir şekilde de olsa aşağıda koydu aslında ne gibi görünüyor. Dahası Vivin - burada büyük olasılıkla gerçek sorunun ne olduğunu yakalandı - html isim ve dizi anahtarı $ _POST eşleşmiyor.


Eğer header başka bir sayfaya yönlendirmek için kullanıyor, çünkü onun temiz sildi. Typicaly Eğer Tamam onunla bir şeyler yapar ve bazı tür bir başarı görünüm verir, ya da doğrudan tekrar formunu gösteren bir hata görünüm verir eğer verileri doğrular ve tek bir sayfa olurdu. header sen aslında (yani tamamen yeni bir isteği çalıştırmadan) başka bir sayfaya yönlendirme tarayıcıyı kullanarak.

Örneğin:

/ / Myform.php

  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get')
  {
      ob_start();
      include('form.inc.php'); // we load the actual view - the html/php file
      $content = ob_get_clean();
      print $content;  // we print the contents of the view to the browser
      exit;
  }
  elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post')
  {
     $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc..
     if($data = is_valid($form))
     {
       process_data($data); // this would insert it in the db, or email it, etc..
     }
     else
     {
        $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form
        ob_start();
        include('form.inc.php'); // we load the actual view - the html/php file
        $content = ob_get_clean();
        print $content;  // we print the contents of the view to the browser
        exit;

     } 
   }

yani bu sizin form.inc.php hep içine kodlu hata mesajlarının çıkışı var olduğunu varsayar - bu sadece onları göstermek değildir. Yani bu dosyada Senin gibi bir şey görebilirsiniz:

<fieldset>
  <label for="item_1">
    <?php echo isset($error['item_1']) ? $error['item_1'] : null; ?>
    Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" />
  </label>
</fieldset>