Kaldırmak veya PHP kullanarak bir veritabanına ayrılmış değer dosyasını alırken sütun başlıkları takarak önlemek için nasıl?

3 Cevap php

I .dat dosya ayrılmış-noktalı virgül var ve ben bu dosyayı okumak ve bir veritabanına içeriğini saklamak istiyorum.

.dat dosyasının yapısı:

PARTYID;PARTYCODE;CONNECTION
256;319;234
879;435;135

.dat dosyasını almak için SQL:

     $sql_qry = "INSERT INTO DatTable (PARTYID,PARTYCODE,CONNECTIONID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
                $stmt = $this->connection->prepare($sql_qry);
                $stmt->execute();
                $this->checkForErrors($stmt);

Şimdi Db yapı gibi görünüyor daha komut dosyası çalıştırırsanız:

  PARTYID PARTYCODE CONNECTION
------------------------------
1 PARTYID PARTYCODE CONNECTION
2 256     319       234
3 879     435       135

Açıkçası, ben tablodaki sütun başlıklarını (PARTYID PARTYCODE BAĞLANTI satır) gerek yok ... Peki nasıl ben onları kaldırmanız gerekir?

Interesting Answer:

Just Insert fgetcsv($fp, 1000, ","); at the first line and while loop will start from second line.

3 Cevap

İki çözüm var:

  • You can either not use the first line of your .dat file
    • Ben satır satır okuyor herhalde ...
    • Ben bu yüzden, sadece (sen ilk satırda olup olmadığını bilmek için bir sayaç olarak bir değişken kullanabilirsiniz) ilk satırı kullanmayın
  • Mevcut hat veritabanına verileri takmadan önce sadece tamsayılar / numaraları içeriyorsa Yoksa test edebilir.


Here is a portion of code that could serve as a starting point, if you choose the second solution :

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    $sql_qry = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
    $stmt = $this->connection->prepare($sql_qry);
    $stmt->execute();
    $this->checkForErrors($stmt);
}


Also, note that you are using prepare and execute, which seem to indicate you are trying to use prepared statements.

Hazırlanmış deyimleri kullanırken yapıyorsun gibi, yapmanız gereken; yapmanız gerekenler:

  • Bir ve yalnızca bir kez: veri yer tutucuları kullanarak, deyimi hazırlamak
  • For each line, bind the values
    • ve deyim yürütmek

Bunu yapmamalısın:

  • Her hat için bildirimde hazırlayın
  • Yerine yer tutucular kullanarak, SQL sorgu içine veri enjekte.

Kodunuzu bu gibi biraz görünmelidir anlamına gelir (not tested, so you might have to change a few things):

// First, prepare the statement, using placeholders
$query = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
          VALUES (:party_id, :party_code, :connection_id)";
$stmt = $this->connection->prepare($query);

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    // Then, for each line : bind the parameters
    $stmt->bindValue(':party_id', $data[0], PDO::PARAM_INT);
    $stmt->bindValue(':party_code', $data[1], PDO::PARAM_INT);
    $stmt->bindValue(':connection_id', $data[2], PDO::PARAM_INT);

    // And execute the statement
    $stmt->execute();

    $this->checkForErrors($stmt);
}

Bu DBA tarafından yapılan bir günlük ortak bir görevdir. Bu LOAD komutu ile mysql yapılabilir. PHP kullanmaya gerek yoktur.

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

LOAD DATA LOCAL INFILE 'file.dat' 
INTO TABLE table_name
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
(PARTYID, PARTYCODE, CONNECTIONID)
IGNORE 1 LINES;

Sadece doğru veri türü üzerinde ekleme uygula.

if(is_numeric($data[0])){ ... your code ... }

Daha doğrusu, sen sütunları veritabanı düzeyinde kötü veri takılmasına izin vermez zorlanarak olmalı, böylece listelenen sütunlar onlar kimlikleri madem tamsayı tipte olması değil, şu anda ne olursa olsun türü (varchar, belki de) olmalıdır . Ve sonra, örneğin, uygun hataları ele verebilir uygunsuz verileri gözardı ve atarak.