(Tüm boşluklar da dahil) boş form gönderimleri yakalayın

7 Cevap php

Onlar alanı kullanmak, kullanıcıların boş mesaj gönderebilir sitemde bir sorun varsa.

Code:

if (isset($_POST['submit'])) {

  // check for empty fields
  if (empty($_POST['headline']) || empty($_POST['text']) ||
      empty($_POST['forum_id'])) {
      header("Refresh: 2; url=/add-thread"); 
      die('You must fill out every field.');
  }

// No errors? Save.
else {
$headline = mysql_real_escape_string($_POST['headline']);
$text = mysql_real_escape_string($_POST['text']);

mysql_query("INSERT INTO threads (headline, text, date, forum_id, user_id)
             VALUES ('$headline', '$text', NOW(), '$_POST[forum_id]', '$user[id]')");

header("Location: /thread/".mysql_insert_id()."");
}

}

Bunu nasıl düzeltebilirim?

7 Cevap

trim() metin girişleri. Kolayca bu gibi yapabilirsiniz:

// get input vars and trim space
$callback = array('filter' => FILTER_CALLBACK, 'options' => 'trim');
$fields = filter_input_array(INPUT_POST, array(
    'headline' => $callback,
    'text'     => $callback,
    'forum_id' => $callback,
));

// check for empty fields by counting how many are set
if ( count($fields) != count(array_filter($fields)) ) {
    // something was unset
}

the manual bir dizi kriterlere uygun değişkenler için boş fonksiyon kontrolleri

Var olmayan bir boş ve sıfır değeri varsa YANLIŞ döndürür.

Aşağıdakiler boş olarak kabul edilir:

  • "" (Boş dize)

  • 0 (bir tamsayı olarak 0)

  • "0" (bir dizge olarak 0)

  • NULL

  • YANLIŞ

  • array () (boş bir dizi)

  • var $ var; (Değişken bildirilmiş, ancak bir sınıfta bir değeri olmayan)

Sizin $ _POST alanları gerçekte böyle bir şey içerir

"   ";

Bu değil ve boş bir dize, ancak boşluk karakterleri ile dolu bir dize.

Boş () kullanmadan önce, sizin POSTed değerlerinden) white-space (Döşeme

$trimmed_post = array();
foreach($_POST as $key=>$value){
    $trimmed_post[$key] = $value;
}
if(!empty($trimmed_post['headline'])){
    //...
}

Yeni bir diziye yeni değerler koymak gerekmez, ama ben otomatik oluşturulan superglobals içinde ne değişen büyük bir hayranı değilim.

Son bir not, böyle bir şey yapamaz

if(!empty(trim($_POST['headline']))){
   //...
}

Boş fonksiyonu gerçek bir değişkeni geçirilmesini bekliyor çünkü. Bunun yerine böyle bir şey yapabileceğini

if('' != trim($_POST['headline'])){
//...
}

Bu muhtemelen almak için en iyi yaklaşımdır. Eğer aramak için gereken işlevleri sayısını azaltmak, kullanıcıların 0 değeri ile girişlerini gönderebilir ve kod ne yapar hakkında daha açık olduğunu. Görürsünüz başka bir şeklidir

if(trim($_POST['headline'])){

}

PHP yanlış olarak boş bir dize ('') değerlendirir ve boş olmayan bir dize gibi gerçek Bu çalışıyor çünkü. Ben PHP bir sürü böcek eşitlik operatörleri belirli tiplerinin dışında boolean değerleri almak nasıl yanlış anlamalar etrafında kırpma buldum çünkü bu formu önlemek eğilimindedir. Açık olma hataların bu tür oluşumları azaltmaya yardımcı olur.

Sadece hızlı bir notu: SQL içine $_POST['forum_id'] değerini enjekte ediyoruz; istediğiniz gibi bir kullanıcı bu değeri işlemek olabilir çünkü o gizli bir alandan geliyor olsa bile, iyi bir fikir değil. Bu değer kaçmak için akıllıca olacaktır, ya da en azından intval() geçmek ve (İntegral yazılan tanımlayıcı varsayarak) bir tamsayı var sağlayacaktır.

Ben kırparak gitmek için yol olduğunu kabul. İşte bu konuda gitmek için çok daha kolay bir yolu var:

$_POST = array_map('trim', $_POST);

Denemek

if (!empty($_POST['headline']) && !empty($_POST['text']) &&
!empty($_POST['forum_id']))

Mantığı için.

Sen sanki etrafında geçmek gerekiyor.

Netleştirmek için GÜNCELLEME:

if (isset($_POST['submit']) && !empty($_POST['headline']) && 
!empty($_POST['text']) && !empty($_POST['forum_id'])) {

    $headline = mysql_real_escape_string($_POST['headline']);
    $text = mysql_real_escape_string($_POST['text']);

    mysql_query("INSERT INTO threads (headline, text, date, forum_id, user_id)
         VALUES ('$headline', '$text', NOW(), '$_POST[forum_id]', '$user[id]')");

    header("Location: /thread/".mysql_insert_id()."");
}
else
{
  header("Refresh: 2; url=/add-thread"); 
  die('You must fill out every field.');    
}

}

Ben süs her $_GET & Kısa sürede uygulama başlar başlamaz $_POST değişken. Böyle bir şey deneyin:

function trimArray(&$array) {
    if (empty($array)) {
        return;
    }

    foreach ($array as $k => $v) {
        if (! is_array($v)) {
            $array[$k] = trim($v);
        } else {
            trimArray($v);
        }
    }
}

if (! empty($_GET)) {
    trimArray($_GET);
}
if (! empty($_POST)) {
    trimArray($_POST);
}

Doğru bir başvuru için kontrol ettikten sonra:

foreach ( $_POST as $key => &$value ) $value = trim($value);

edit in response to asker's comment:

Yukarıdaki gibi işe yaramadı garip. İşte benim egzersiz it would onaylamak oldu.

tbramble@wayfarer:~$ php -a
Interactive shell

php > $arr = array('one',' two', ' three ');
php > print_r($arr);
Array
(
    [0] => one
    [1] =>  two
    [2] =>  three 
)
php > foreach ( $arr as $key => &$value ) $value = trim($value);
php > print_r($arr);
Array
(
    [0] => one
    [1] => two
    [2] => three
)

Bunun yerine normal bir dizinin bir süper küresel üzerinde çalışma ile ilgili bir şey olmalı.