$ _POST Isteğe bağlı alanlar için nasıl kontrol

4 Cevap php

Şu anda benim kod şöyle görünür:

# Assign values for saving to the db
$data = array(
    'table_of_contents' => $_POST['table_of_contents'],
    'length' => $_POST['length']
);

# Check for fields that may not be set
if ( isset($_POST['lossless_copy']) )
{
   $data = array(
       'lossless_copy' => $_POST['lossless_copy']
    );
}

// etc.

Ifadeleri olsa ... Hatta üçlü sözdizimi ile hala dağınık ise, bu sonsuz yol açacak. Daha iyi bir yolu var mı?

4 Cevap

Buna ne dersiniz:

// this is an array of default values for the fields that could be in the POST
$defaultValues = array(
    'table_of_contents' => '',
    'length' => 25,
    'lossless_copy' => false,
);
$data = array_merge($defaultValues, $_POST);
// $data is now the post with all the keys set

array_merge() daha sonra değerleri bir önceki olanları geçersiz olan, değerleri birleştirmek olacaktır.

Eğer güven istemiyorsanız array_merge() sonra bir foreach() döngü yapabilirsiniz.

İsteğe bağlı alanlarda bir dizi inşa olabilir:

$optional = array('lossless_copy', 'bossless_floppy', 'foo');
foreach ($optional as $field) {
    if (isset($_POST[$field])) {
        $data[$field] = $_POST[$field];
    }
}
foreach ($_POST as $key => $value) {
  $data[$key] = $value;
}

Lütfen $ _POST değerleri sterilize unutmayın!

edit: Sizin veya tabloda mevcut olmayabilir alanlar ile isteğe bağlı $ _POST değerleri maç arıyorsanız, böyle bir şey (Ben mysql kullanarak varsayarak yaşıyorum) yapabilirdi:

$fields = array();
$table  = 'Current_Table';

// we are not using mysql_list_fields() as it is deprecated
$query  = "SHOW COLUMNS from {$table}";
$result = mysql_query($query);
while ($get = mysql_fetch_object($result) ) {
  $fields[] = $get->Field;
}

foreach($fields as $field) {
  if (isset($_POST[$field]) ) {
    $data[$field] = $_POST[$field];
  }
}
$formfields = $_POST;
$data = array();
foreach(array_keys($formfields) as $fieldname){
  $data[$fieldname] = $_POST[$fieldname];
}

Bu teslim dahil döndürülen tüm alanları ekleyecektir. Bir onay kutusu işaretli değil bilmek gerekiyorsa, deftere gibi bir kod kullanmak zorunda gidiyoruz. Yalnızca kontrol edilir onay kutularını umurumda varsa, yukarıdaki kodu kullanabilirsiniz.

Bu muhtemelen radyo düğmeleri gibi aynı adı kullanarak birden formfields için işe yaramaz.

EDIT: Kullanım Owen'ın kod, bu temizleyici, benimki aynı şey bir daha ayrıntılı bir versiyonu.