Autor Zpráva
Andrej.B
Profil
Zdravim,

rad by som vyriesil Upload a Update do DB z CSV. Mam jednoduchy kod pre zaciatok, ze ako mi bude generovat zostavu na Insert:

$insert = "INSERT into sklad 
(`polozka`, `miesto_sklad`, `miesto_sklad2`, `lot`, `miesto_sklad3`, `mnozstvo_sklad`) 
values \n";
    
$row = 0;

$filename=$_FILES["file"]["tmp_name"];  


     $file = fopen($filename, "r");
   
          while (($getData = fgetcsv($file, False, ";")) !== FALSE)
  {


if($row == 0){ $row++; continue; } // hlavicky alebo bez
$num = count($getData);
$row++; 

$insert .= "(";    
    
for ($c=0; $c < $num; $c++) {
    
$insert .= "'".$getData[$c]."', "; 
                
}
$i++; 
$insert = rtrim($insert, ', '); // poslednu ciarku vo values odstranime
  
  $insert .= "),"; // uzavrieme  riadok values

  $insert .= "\n"; // aby to bolo pekne pri teste

}    
 

echo $insert;
fclose($file);

Vygeneruje mi to tento kod

INSERT into sklad 
(`polozka`, `miesto_sklad`, `miesto_sklad2`, `lot`, `miesto_sklad3`, `mnozstvo_sklad`) 
values 
('00015/30A0-EIR', 'A', 'A08BL4', 'R000102200', 'A', '19'),
('10062/07Z', 'J', 'J00', 'I000012165', 'A', '25745'),
('14202/15/10', 'B', 'B03CP1', 'I000014475', 'A', '1142'),
('92030/01/09A0', 'A', 'A03IL1', '1,70706E+11', 'A', '62'),
('92030/02/09A0', 'B', 'B05CP4', '1,70706E+11', 'A', '108'),
('92030/02/09S0', 'A', 'A11AP1', 'I000008175', 'A', '19'),
('AC004PIET7040/BUR', 'A', 'A00EXP', 'M000054499', 'A', '100'),
('AC004PIET7040/BUR', 'B', 'B01BL3', 'R000152705', 'A', '218'),
('AC004PIET7040/BUR', 'C', 'IFSBAL', 'R000093255', 'A', '45'),

skoro dokonale, len sa potrebujem zbavit poslednej cirky ako som sa dokazal zbavit poslednej ciarky priamo pre ten ktory Values
$insert = rtrim($insert, ', '); // poslednu ciarku vo values

('AC004PIET7040/BUR', 'C', 'IFSBAL', 'R000093255', 'A', '45'),

Ako na to?


Diky
anonym_
Profil *
Andrej.B:
A otázka, problém, cokoliv je kde? Funguje to, nefunguje (a co to případně vyhazuje za chybu)?
Andrej.B
Profil
anonym:
som klikol miesto nahladu na Poslat spravu
Kajman
Profil
anonym:

Když dáte formátovací enter z řádku 32 na začátek dat - tedy před závorku na řádku 20, tak řádku 36 můžete použít zase rtrim na čárku.
Edit: nebo klidně jen
$insert =  rtrim($insert, ",\n");
na řádek 36

Data musíte escapovat na řádku 24 a hodnota '1,70706E+11' taky nevypadá úplně dokonale.
Andrej.B
Profil
Kajman:

tak to som nepredpokladal veru takto. Formátoval som si to len pre vizuál a netušil som, ze si to takto skomplikujem.

Data sa este budu kontrolovat.
Inak takto vypada cislo 170705650002 /1,70706E+11/, ked sa preulozi v Exceli /holt excel :)/, hodi to ako scientific number. Len som si vymazaval riadky, aby som to pri testoch nemal velke.

Diky moc
Kajman
Profil
Ještě si musíte kontrolovat, že jeden insert není delší než povoluje nastavení serveru.

Takže při hodně řádcích musíte data rozdělit na více insertů a nemít jen jeden.


Osobně bych ale data tahal rovnou z csv, je to jednodušší na programování (je menší šance, že tam zanesete chybu třeba tím chybějícím escapováním) a nemusí se řešit limit délky dotazu. Navíc by to mělo být rychlejší.
dev.mysql.com/doc/refman/8.0/en/load-data.html
Andrej.B
Profil
csv ma tych riadkov max cca 10 000, takze celkom v pohode vladze. 0.588 sekundy

Skusil som to priamo cez ten Load DATA a ten ukazuje 0.092 sekundy. Musim sa na to pozriet blizsie. Dakujem
LOAD DATA INFILE './sklad.csv' INTO TABLE sklad

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0