bir dizi olarak $ _POST oluştururlar

5 Cevap

i bir formu gönderme zaman alanları bir dizi olarak çıkıp fark ettim.

i gibi yaparsanız

if(isset($_POST['submit'])) {
print_r($_POST);
}

ne ben genelde form alanları için yapılacak şudur.

(Bu ben genellikle bunu nasıl) ben böyle bir şey var diyelim

<form method="POST" action="">
<label>First Name: </label>
<input type="text" name="fname">

<label>Last Name: </label>
<input type="text" name="lname">

<label>Phone: </label>
<input type="text" name="phone">

<input type="submit" name="submit" value="submit">
</form>

sonra (net görünmesi için im hariç alan doğrulaması) olacak

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

$fname = $_POST['fname'];
$lname = $_POST['lname'];
$phone = $_POST['phone'];

mysql_query("insert into table(fname,lname,phone) values('$fname','$lname','$phone')");

header("Location: gosomewhere.php");

}

sonrası çıkışlar bir dizi formatında olduğu im 100 alanları ile uğraşırken başka nasıl ben bu yazabilirim?

nasıl büyük çocuklar orada yapıyorsun? ya da bunu nasıl yapıyorsun?

edit: ile en ive durulmuştur yaklaşık 60 alanlar olduğunu. im müşteri bilgileri bir araya koymak için form başına veri sürü alır bu CMS bina.

5 Cevap

Ben hiç tek bir formda "100'den fazla alanları ile ilgili" kimseyi gördüm sanmıyorum. Bu durumda ise, yol boyunca veri bölümlerini otomatik olarak kaydeder bir tasarım değişikliği düşünebilirsiniz. Form verileri her zaman sunucu ucunda bir diziye kendini sunacağını, bu etrafında hiçbir yolu yoktur.

(Eğer formunuzda birden çok olay-tarih kabul varsayalım) bir kerede birçok alanı üzerinde yineleme yapmak istiyorsanız, sen-ebil kullanma array-style naming-convention:

<input type="text" name="events[]" />

Eğer sunucu ucunda bu verilere erişmek sonra, basit bir döngü içinde bitti hızlı yineleme yapabilirsiniz:

foreach ($_POST["events"] as $event) {
  echo $event;
}

Ben sizin sorunuzu missunderstood üzgünüm.

Jonathan dediği gibi, bir form 100 alanlar çok yoludur. Ama her zaman dinamik SQL inşa edebilirsiniz.

Örn:

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

  // allow only entries that are database fields
  $allow = array(/*whatever*/);

  $fields = array();
  $values = array();

  foreach($_POST as $field => $value) {
     if(in_array($field, $allow) {
        // Do correct output escaping etc. here !!
        $fields[] = $field;
        $values[] = mysql_real_escape_string($value);
     }
  }

  mysql_query('insert into table(' . join(',', $fields) . ' values(' . join(',', $values) . ')');
}

Bu form alanları adları DB sütun adları olarak aynı olduğunu varsayar.

Cyro dediği gibi, array_keys ve array_values düzenini korumak, varsa, bu bile güzel yapılabilir:

function clean($value, $field, &$params) {
    if(in_array($field, $params['allow']) {
       // custom validation goes here
       $params['data'][$field] = mysql_real_escape_string($value);
    }
} 

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

  // allow only entries that are database fields
  $allow = array(/*whatever*/);

  $params = array('allow' => $allow, 'data' => array());

  array_walk($_POST, 'clean', $params);

  if(!empty($params['data'])) {
      mysql_query('insert into table(' . join(',', array_keys($params['data'])) . ' values(' . join(',', array_values($params['data'])) . ')');
  }
}

Bkz array_walk

Form 100 üzerinde alanları içeriyorsa, ben sunucu tarafında daha istemci tarafında hakkında çok daha fazla endişe ediyorum. jQuery UI Tabs birden çok alanda formu bölmek gibi bir şey kullanmayı düşünün, kullanılabilirliğini artırmak için, fieldset kullanılarak ayrıldı.

Dizi soruna tek yolu, PHP'nin extract fonksiyonu gibi bir şey kullanmak olacaktır, ama gerçekten çalışmak için veri daha kolay yapmak olmaz çünkü güvenlik nedeniyle bu tavsiye ve etmem.

Çok alanları ile ilgili en iyi yolu alanlarının sayısını azaltmaktır. Kimse alanları puanları doldurmak istiyor.

PDO destekleyerek sunmak çok şey var, o başarısız prepared statements. Bir şey (sizin örnek kod aksine) SQL injection karşı savunmasız değildir parametreler vardır. Parametreler, aynı zamanda daha kolay bir diziden değerlerini kullanarak bir sorgu oluşturmak için de kullanılabilir.

$query = $db->prepare("INSERT INTO table (surname, given_name, main_phone, ...) 
    VALUES (:fname, :lname, :phone, ...)");

$values = array()
foreach($_POST as $key => $val) {
    $values[':' + $key] = $val;
}
try {
    $query->execute($values);
} catch (PDOException $exc) {
    ...
}

Hazırlanmış deyimi oluştururken sütun isimleri listesi implode d sonra, başka bir yerde tanımlanmış, ya da otomatik olarak oluşturulabilir.

Form alan adları doğrudan veritabanı tablo sütununa ilişkin ise dinamik $ _POST diziden sorgu oluşturabilirsiniz. Örnekten bunu yapabilirsiniz:

$allowed_fields = array('fname', 'lname', 'phone');
foreach($_POST as $key => $value) {
  // if this isn't an expected field (user-injection) ignore it
  if(!in_array($key, $allowed_fields))
    continue;

  // do validation checks and data clean up here in a switch
  $data[$key] = mysql_real_escape_string($value);
}
mysql_query("INSERT INTO table(`" . implode('`, `', array_keys($data)) . "`) VALUES('" . implode("', '", array_values($data)) . "')");

Gerçekten de, 100 + alanları ile form şimdiye kadar doldurun bir şey değil ve ben o yalnız değilim inanmıyorum. Başkalarına tavsiye veya yeniden yaklaşırken sizin ilk tasarımını denemek gibi çoklu adımlarla içine kesiliyor düşünün.