MySQL DB yardım INSERT Kayıt (lar) ihtiyacınız var

3 Cevap php

Ben çok uzun bir MySQL veritabanı içine üye (ler) bilgi ve saklar bunu toplayan bir online formu var. Biz kadar 16 üyeler tek seferde kayıt ve aslında bu izin DB yapılandırılmış sağlar.

For example:

1 Üye kaydolur ise, onun kişisel bilgilerini (ad, soyad, adres, telefon, e-posta) tek bir satırda saklanır.

15 Üye (tek seferde) kayıt varsa, kendi kişisel bilgiler aynı tek satırda saklanır.

Satır tüm 'olası' girişler için bilgi konut sütun vardır. Ben bu kodu pekiştirmek için çalışıyor ve veritabanı içinde yeni bir rekor üzerine koymak kaydolur her n üyesi yaşıyorum.

Ben gibi birden fazla kayıt eklemek için önce Sugestions gördük:

INSERT INTO tablename VALUES (('$f1name', '$f1address', '$f1phone'), ('$f2name', '$f2address', '$f2phone')...

The issue with this is two fold:

  1. I do not know how many records are being enrolled from person to person so the only way to make the statement above is to use a loop
  2. The information collected from the forms is NOT a single array so I can't loop through one array and have it parse out. My information is collected as individual input fields like such: Member1FirstName, Member1LastName, Member1Phone, Member2Firstname, Member2LastName, Member2Phone... and so on

Bir döngü kullanarak (ve bu nedenle geri dönmek ve tamamen benim form alan adları nedeniyle geçerlilik kuralları inşa edilir şekilde olamaz (ki böyle. Yeniden zorunda) OLMADAN ayrı satırlara bilgi depolamak mümkün mü

3 Cevap

Bir "Isim # 1" tüm diğer "# 1" numaralı alanlar ile eşleştirilir, böylece tüm alanları doğru numaralandırılmış böylece en yapılandırılmış formu ise, o zaman bir döngü basit bir çözümdür.

start_transaction();
$errors = false;
for ($i = 1; $i <= 16; $i++) {
   if (... all $i fields are properly filled in ...) {
      $field = $_POST["field$i"];
      $otherfield = $_POST["otherfield$i"];
      vb..

      ... insert into database ...
   } else {
      ... handle error condition here
      $errors = true;
   }
}
if (!$errors) {
   commit_transaction();
} else {
   rollback();
}

Firstname1 lastname42 ve address3.1415927 ile eşleştirilir, böylece onlar, rasgele sayılı ediyorsanız, o zaman birlikte tüm rastgele adlandırmaları eşleştirmek için bir arama tablosu oluşturmak zorunda ve bu üzerinde döngü olur

Yorumlarınız başına takibine:

Kesinlikle her satır tekrarlanan firstname / soyad / etc .. kayıtları 16 setleri içeren bu veritabanı yapısı, korunması üzerinde ısrar eğer iyi, o zaman böyle bir şey yapmak istiyorum:

$first = true;
for ($i = 1; $i <= 16; $i++) {
    if (fields at position $i are valid) {
       $firstname = mysql_escape_real_string($_POST["F{$i}name"]);
       $lastname = mysql_real_escape_string($_POST["F{$i}lastname"]);
       if ($first) {
          $dbh->query("INSERT INTO table (f{$i}name, f{$i}lastname) VALUES ($firstname, $lastname);"
          $recordID = $dbh->query("SELECT last_insert_id();");
          $first = false;
       } else {
          $dbh->query("UPDATE table SET f{$i}name=$firstname, f{$i}lastname=$lastname WHERE idfield=$recordID");
       }
    }
}

Bu çirkin, ama temelde:

  1. loop through the form field sets until you find a valid set (all required fields filled in, valid data entered, vb.
  2. Yeni kayıt oluşturmak için veritabanına veri setini takın
  3. yeni kayıt kimliğini almak
  4. alanların geri kalanı üzerinde döngü devam
  5. Geçerli kayıt sonraki her set için, önceden oluşturulmuş kaydının bir güncelleme yapmak ve yeni fieldset veri eklemek.

Eğer tekrarlanan sütun 16 setleri ile tek bir tabloyu korumak için bazı son derece sıradışı tasarım ihtiyacı var sürece rağmen, dürüst, sen biraz normalleşmesi daha iyi olacak ve iki ayrı tablo korumak istiyorum. Bir veli "Kayıt" masa ve bir çocuk "üyeler" tablosu. Eğer şeklinde onları karşılaşmak gibi ana kayıt tablosu oluşturabilirsiniz Bu şekilde, o sadece yeni çocukları takın.

2. güncelleme:

iyi, bir normalleştirilmiş düzen basitleştirilmiş şekli olacaktır:

signups (id, name, vb..)
signup_members (id, signup_id, firstname, lastname)

ve aşağıdaki sorgu ile belirlenen tam kayıt kayıt çekmek istiyorum:

SELECT signups.id, signups.name, signup_members.id, firstname, lastname
FROM signups
LEFT JOIN signup_members ON signups.id = signup_members.signup_id
ORDER BY ...

O, size her 'üye' kaydolma için bir satır bir dizi verecek. CSV, henüz yeni bir kayıdı ulaştınız olmadığını görmek için kontrol bazı devlet ile basit bir döngü oluşturmak için:

$oldid = null;
$csv = ... put column headers here if you want ...
while ($signup = $result->fetchrow()) {
    if ($signup['signups.id'] != $oldid) {
        // current signup doesn't match previous seen id, so got a new signup record
        $csv .= "\n"; // start new line in CSV
        $csv .= ... add first few columns to new csv row ...
        $oldid = $signup['signups.id']; // store new record id
    } else {
        $csv .= ... add extra member columns to current csv row ...
    }
 }   

Ne yapmaya çalışıyorsun sen seçtiğiniz bir karakter ile ayrılmış bir değişken içine kullanıcı bilgilerini katılmak ve MySQL DB gönderebilir, basit olabilir, ama sorunu çözmek için ...

$user1 = $f1name . ';' . $f1address . ';' . $f1phone;
$user2 = $f2name . ';' . $f2address . ';' . $f2phone;
$user3 = $f3name . ';' . $f3address . ';' . $f3phone;

INSERT INTO table-name VALUES('$user1','$user2','$user3')

To extract, just "explode" the value by the ";". If you use the same order for all users data, and if you send a verification string in case one user leaves a field blank, works just fine :) humm... this work's just fine if the user isn't allowed to use ";" as "personal data" :)

O U yardımcı olur umarım!

Sana "değişken değişkenler" bakmak isteyebilirsiniz düşünüyorum:

http://php.net/manual/en/language.variables.variable.php

Sonra form alanlarını yeniden adlandırmak zorunda kalmadan 1-15 yoluyla makul döngü, yapamadım.