Robím takú vačšiu databázu a tak som rozmýšlal, ako ju čo najlahšie dostať do mySQL no a našiel som jednoduché riešenie.
Všetko si presne pripravím tak ako to chcem aby to vyzeralo v mySQL a jednoducho si uložím súbor z excelu vo formáte csv , je tam taká možnosť, a potom si ho tam jednoducho naexportujem takto:
<?
$handle = fopen("spreadsheet.csv", "r");
if ($handle) {
$array = explode("\n", fread($handle, filesize("spreadsheet.csv")));
} $total_array = count($array);
$i = 0;
while($i < $total_array) {
$data = explode(",", $array[$i]);
$sql = "SELECT * FROM `table` WHERE id='" . $data[0] . "' LIMIT 1";
$result = mysql_query($sql);
if(mysql_num_rows($result) == 0) {
// Put SQL insert statement here
}
$i++;
}
?>
tento skrypt som nekontroloval, možno je tam nejaká chyba, ale dá sa upraviť podľa potrieb každého.
V podstate to každý pochopí, keď si pozrie zdroják toho csv v textpade.
A co my s tím? Neznám smysl tohoto vlákna.
Ale jestli má jít o co nejlepší kód, pak má ten tvůj stejně nedostatky.
První věc je už samotné csv. Za prvé jde o to, kolik položek (řádků) obsahuje. A za druhé csv nemá univerzální formát, takže nemusí správně parsovat.
V prvním případě počet položek. Pokud se očekává tak do 200 položek, pak stačí to co je uvedeno. První dvě funkce se dají zredukovat funkcí file().
Problém nastane pokud se očekává víc jak 1000 řádků. Ne, že by to nešlo, ale zde už nastává problém s dostupnosti paměti. Proto je v tomto směru lepší použít proudovou metodu. Tedy číst soubor po řádku a aplikovat mysql.
O vhodném použití mysql zase rozhoduje způsob. V tomto případě je si položit otázku, zda je nutné testovat existenci záznamu. Každý dotaz zdržuje zpracování. Pokud je to nutné, fajn. Jinak vyhodit. Další možnosti je nastavit tabulku na unikátní záznam. Pak stačí jen insert. Pokud je potřeba záznam aktualizovat, lze to ošetřit na duplicate entry.
Přenést 3000 řádku do mysql není žádná sranda. U mne to, i přes optimální kód, zabralo víc jak 5 minut.
Není třeba kontrolovat existenci záznamu. Pokud je pole id primárním klíčem (zpravidla je splněno), databáze sama odmítne vložit duplicitní záznam.
Operace vkládání záznamu musí být atomická, což výše uvedený příklad nesplňuje.
Jen mala poznamka (kdyz uz se mluvilo o te optimalizaci) - pokud by id nebylo primarnim klicem a ani unique, tak nez pouzit zminovany sql dotaz, je databazove mene narocne pouzit count:
$sql = "SELECT COUNT(*) FROM `table` WHERE id='" . $data[0] . "' LIMIT 1";
Otazkou je pak jiz zminovana velikost souboru - protoze provadet dotaz ke kazdemu radku je ve velkych souborech obravdu dost silene :))
A jen takova poznamka na zaver, kdyz poskytujes nejaky svuj kod, tak je lepsi jej uzavirat do funkci ;) uz napr, ze csv muze vypadat ruzne .. (oddelovacem muze byt prakticky jakykoliv znak), tak se mohl oddelovas pouzit jako parametr fce.. :)
zmysel vlákna je jednoduchý, keďže som tu nič podobné nenašiel a práve som to začal riešiť, tak som to sem dal, keď niekto bude niečo také potrebovať. Navyše ako vidím vždy sa to dá vylepšiť.
Ten kód ako som už spomenul, som našiel na nete, ešte som ho sám nekontroloval, len tak zbežne som ho mrkol.
S vašimi dotazmi súhlasím, nedostatok pamäte ale treba riešiť keď nastane error, a dá sa obísť rozdelením si databáze na menšie časti.
Spôsobov ako to zapísať je predsa veľa.
Inak dík za dotazy.
goodstyle.sk: Smysl vlákna je jednoduchý, ale stejně až za týden přijde nějaký nováček, který nezná pořádně ani HTML a PHP, zeptá se na to samé. Přitom tyto postupy jsou popsané v různých učebnicích a tutoriálech, které tito lidé nečtou.
Bylo to však užitečné vlákno, protože zúčastněným určitě něco přineslo.
Kit,
tak neviem, lebo ja som začal s SQL len nedávno, vlastne som, si kúpil knihu a prečítal pár kapitol, sadol k počítaču a spravil čo treba. Vlastne som bol veľmi prekvapený že to je všetko také ľahké, PHP si myslím že je zložitejšie.
Ja doporučujem si najskôr v klude z knihy prečítať celú problematiku a potom si prejsť jednotlivé úkony a netreba potom roky hladať návody na internete.
No a keď príde ten nováčk, tak už ho stačí len odkázať na nejaké to vlákno. Mne tiež chvíľu trvalo sa naučiť, že najskôr hľadaj a keď nenájdeš, až potom otravuj ostatných.
Tomík,
inak naozaj nechápem ako ti mohlo trvať preniesť 3000 záznamov 5 minút, ja som teraz pomocou tohto skriptu , (samozrejme som si ho upravil podla seba, tak aby mohol obslúžiť viac kombinovaných tabuliek) preniesol podobné množstvo údajov a trvalo to asi stotinu sekundy, len som klikol a výpis z tabuľky bol hneď kompletne plný.
Myslím že si to asi robil po riadkoch priamo zo súboru a to bolo to hlavné zdržanie.
Tak teď jsem si vzpomněl, že on ten kód vlastně ani nebyl vůbec optimalizovaný. To spíše naopak. Dělal jsem pro zákazníka importní modul z aplikace ZenCart. Tato aplikace je teda dosti blbě napsaná. Vykonání jednoho sql dotazu podle jejich funkce, si vyžádalo 4X víc času než použitím jednoduché mysql_query(). Takže se omlouvám. Skleróza ;)