Nez pouzivat fopen a slozite cteni, muzes to udelat jednoduse pres Dom document: Urcite se s tim pracuje lepe a rychleji. Insert urcite nedavat do foru, kdyz muzes vkladat jednim dotazem. Dotaz si udelas jednoduse napriklad takto: Doufam ze tam nebude moc chyb, napsal jsem to jenom rychle.
Zdravím Tě Zaachi!Začal jsem se teď po krátké odmlce zabývat čtečkou xml feedů a insertem z nich do databáze MySQL. Vyzkoušel jsem ten Tvůj návod, ale nějak mi to nezafungovalo, nejspíš proto, že jsem to nějak špatně zapsal. Nicméně jsem si vzal návod od Honzaa a ten mi zafungoval. Níže uvádím syntax kódu, který potřebuji rozšířit o insert (ten se mi daří), ale za podmínky, že se záznam již v databázi nenachází. Pokud v databázi již je tak potřebuji aby se mi provedl update u daného záznamu výrobku. Nedaří se mi napsat syntax tak aby zafungovala podmínka. Můžeš mi prosím poradit. Děkuji Ti předem.
// ************************************* Vytvoření funkce ******************************function GetElementByName ($xml, $start, $end) { global $pos; $startpos = strpos($xml, $start); if ($startpos === false) { return false; } $endpos = strpos($xml, $end); $endpos = $endpos+strlen($end); $pos = $endpos; $endpos = $endpos-$startpos; $endpos = $endpos - strlen($end); $tag = substr ($xml, $startpos, $endpos); $tag = substr ($tag, strlen($start)); return $tag;}// ***************************** Nastavení informací k připojení jako konstant ***************************define ('db_user', 'root');define ('db_password', 'root');define ('db_host', 'localhost');define ('db_database', 'testshop');// ***************************** Připojení a výběr databáze ***************************** $dbc = mysql_connect (localhost, root, root) or die ('Nelze se připojit k databázovému serveru : '.mysql_error());mysql_select_db (testshop);// ************************************ Otevření a přečtení souboru xml. *********************************$data="";$file = "http://localhost/prestashop/xml/xml.xml"; // Cesta k xml souboru *************************$pos = 0;$Nodes = array();if (!($fp = fopen($file, "r"))) { // Jestliže se soubor neotevře zahlásí chybu viz. řádek níže *************************** die("Nebyl nalezen vstupní XML soubor!");}while ($getline = fread($fp, 4096)) { // Načte data ze souboru xml do velikosti viz. údaj v závorce v 'Kb' *********************** $data = $data . $getline;}$count = 0;$pos = 0;// ****************************** Uzavře xml soubor a vytvoří pole (array) pro všechny tegy **********************while ($node = GetElementByName($data, "", "")) { $Nodes = $node; $count++; $data = substr($data, $pos);}// Načtení dat z tagůfor ($i=0; $i<$count; $i++) { $prod = GetElementByName($Nodes, "", ""); $desc = GetElementByName($Nodes, "", ""); $url = GetElementByName($Nodes, "", ""); $price = GetElementByName($Nodes, "", ""); $pricev = GetElementByName($Nodes, "", ""); $dues = GetElementByName($Nodes, "", ""); $itemt = GetElementByName($Nodes, "", ""); $kat = GetElementByName($Nodes, "", "");}// ************************************ Selekt existujících záznamů zboží *********************************** $sqls = ("SELECT name FROM ps_product_lang");mysql_query($sqls);if ($sqls = $prod){ echo ("Tento materiál již v databázi existuje!"); // Materiál již v databázi nalezen} $sqli = ("INSERT INTO ps_product_lang (id_lang, description, name) VALUES (3, '$desc', '$prod')");mysql_query($sqli); ?>
Úplně univerzální čtečka to není. Dokáže přečíst pouze jednoduché elementy bez parametrů. Ale je velmi jednoduchá a pro většinu XML souborů dostačuje. Jinak ve zdrojovém kódu je vlastně vše vysvětleno i to, jak načíst elementy do proměnných. Chce to ale trochu umět PHP a pokud to chceš importovat do databáze, stačí udělat jednoduchý insert do smyčky FOR
Zdravím Honzaa,čtečka od Tebe je funkční, ale potřeboval bych poradit z následujícím.Začal jsem se teď po krátké odmlce zabývat čtečkou xml feedů a insertem z nich do databáze MySQL. Níže uvádím syntax kódu, který potřebuji rozšířit o insert (ten se mi daří), ale za podmínky, že se záznam již v databázi nenachází. Pokud v databázi již je tak potřebuji aby se mi provedl update u daného záznamu výrobku. Nedaří se mi napsat syntax tak aby zafungovala podmínka. Můžeš mi prosím poradit. Děkuji Ti předem.
// ************************************* Vytvoření funkce ******************************function GetElementByName ($xml, $start, $end) { global $pos; $startpos = strpos($xml, $start); if ($startpos === false) { return false; } $endpos = strpos($xml, $end); $endpos = $endpos+strlen($end); $pos = $endpos; $endpos = $endpos-$startpos; $endpos = $endpos - strlen($end); $tag = substr ($xml, $startpos, $endpos); $tag = substr ($tag, strlen($start)); return $tag;}// ***************************** Nastavení informací k připojení jako konstant ***************************define ('db_user', 'root');define ('db_password', 'root');define ('db_host', 'localhost');define ('db_database', 'testshop');// ***************************** Připojení a výběr databáze ***************************** $dbc = mysql_connect (localhost, root, root) or die ('Nelze se připojit k databázovému serveru : '.mysql_error());mysql_select_db (testshop);// ************************************ Otevření a přečtení souboru xml. *********************************$data="";$file = "http://localhost/prestashop/xml/xml.xml"; // Cesta k xml souboru *************************$pos = 0;$Nodes = array();if (!($fp = fopen($file, "r"))) { // Jestliže se soubor neotevře zahlásí chybu viz. řádek níže *************************** die("Nebyl nalezen vstupní XML soubor!");}while ($getline = fread($fp, 4096)) { // Načte data ze souboru xml do velikosti viz. údaj v závorce v 'Kb' *********************** $data = $data . $getline;}$count = 0;$pos = 0;// ****************************** Uzavře xml soubor a vytvoří pole (array) pro všechny tegy **********************while ($node = GetElementByName($data, "", "")) { $Nodes = $node; $count++; $data = substr($data, $pos);}// Načtení dat z tagůfor ($i=0; $i<$count; $i++) { $prod = GetElementByName($Nodes, "", ""); $desc = GetElementByName($Nodes, "", ""); $url = GetElementByName($Nodes, "", ""); $price = GetElementByName($Nodes, "", ""); $pricev = GetElementByName($Nodes, "", ""); $dues = GetElementByName($Nodes, "", ""); $itemt = GetElementByName($Nodes, "", ""); $kat = GetElementByName($Nodes, "", "");}// ************************************ Selekt existujících záznamů zboží *********************************** $sqls = ("SELECT name FROM ps_product_lang");mysql_query($sqls);if ($sqls = $prod){ echo ("Tento materiál již v databázi existuje!"); // Materiál již v databázi nalezen} $sqli = ("INSERT INTO ps_product_lang (id_lang, description, name) VALUES (3, '$desc', '$prod')");mysql_query($sqli); ?>
truncate je vhodny, pokud nepotrebujete sledovat historii, nebo treba datum pridani zaznamu...
jinak to mozna to chce udelat ve 2 - 3 krocich, update na existujici zaznamy (pokud mas ID) a pak insert novych zaznamu, pripadne jeste ve tretim kroku smazat uz neplatne zaznamy...
Zdravím,
čtečka od Honzaa funguje výborně.
Problém však nastává pokud jsou xml data v trochu jiném formátu
Helma
Dostat z name slovo Helma není problém.
Ale jak dostat z OPTION NAME slovo Barva a parametr černá ?
A dále Velikost s parametrem L (59-61) ??
No me by zajimala nevic ctecka nebo jak naimportovat tohle http://www.intimia.cz/xml_zbozi.php do PrestaShopu nebo do jakekoliv free shopu :) Kdyz tam prosim do PM, mateli reseni ci tip jak na to