Xml block feldolgozás php-vel.

Xml block feldolgozás php-vel.
2015-01-24T13:00:45+01:00
2015-01-24T15:19:58+01:00
2022-10-15T23:05:22+02:00
xcomp
Van egy xml adatbázisom a következő: http://xcomp.hu/cpl/kategoriak/kategoriak.xml
Ezt szeretném feldolgozni és adatbázisba írni.

Az xml felépítése a következő:

 TERMEKCSOPORT (külön blokkokban)
o KOD (Termékcsoport kódja)
o MEGNEV (Termékcsoport neve)
o TERMEKJELLEMZO (külön blokkokban)
 KOD (Termékjellemző kódja)
 MEGNEV (Termékjellemző neve)



Ez pedig a jelenlegi kódom:


<?php
$dbhost = 'localhost';
$dbuser = 'xxxx';
$dbpass = 'xxxx';


$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Nem sikerült a csatlakozás: ' . mysql_error());
}
echo 'Sikeres csatlakozás<br />';

$xml=simplexml_load_file("kategoriak.xml");
foreach ($xml->TERMEKCSOPORT as $TERMEKCSOPORT) {

$megnev = $TERMEKCSOPORT->MEGNEV;
$kod = $TERMEKCSOPORT->KOD;
$megnev2 =$TERMEKCSOPORT->TERMEKJELLEMZOK->TERMEKJELLEMZO->MEGNEV;
$kod2 =$TERMEKCSOPORT->TERMEKJELLEMZOK->TERMEKJELLEMZO->KOD;
$megnev = iconv("UTF-8", "ISO-8859-2", "$megnev");
$megnev2 = iconv("UTF-8", "ISO-8859-2", "$megnev2");
$sql = "INSERT INTO ssx_jshopping_categories (category_id, category_image, category_parent_id, category_publish, category_ordertype, category_template, ordering, category_add_date, products_page, products_row, access) VALUES ('$kod2', '$megnev2', '$kod', 1, 1, NULL, 1, NULL, 12, 3, 1)";
mysql_select_db( 'xxxx' );
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('nem sikerült a kategoriák feltöltése: ' . mysql_error());
}
}

echo "a kategoriák feltöltése sikerült\n";
mysql_close($conn);
?>

A gondom az vele, hogy az xml blokkokból csak 1 adatot ír be az adatbázisba, nem tudom, hogy ezeket, hogyan kellene leválogatni, hogy mind bekerüljön. Értelem szerűen a category_id be minden id kell a category_parent_id-be pedig csak a termékcsoport id.
Másképp: A Termékcsoport blokk több termékjellemző-t tartalmaz, de csak az elsőt írja be. 

Azt, hogy  a megnevezést a category_image mezőbe íratom be az azért van, mert nem tudom, hogyan kell a name_hu-HU mezőbe beíratni, de ez egy másik téma és egyenlőre ezt szeretném megoldani. Persze az is érdekes lesz majd, de egy téma 1 kérdés. 

A
Mutasd a teljes hozzászólást!
Szerintem kellene még egy belső ciklus is, amivel a termékjellemzőkön lépkedsz:

foreach ($xml->TERMEKCSOPORT as $TERMEKCSOPORT) { $megnev = iconv("UTF-8", "ISO-8859-2", "{$TERMEKCSOPORT->MEGNEV}"); $kod = $TERMEKCSOPORT->KOD; foreach($TERMEKCSOPORT->TERMEKJELLEMZOK->TERMEKJELLEMZO as $TERMEKJELLEMZO) { $megnev2 = iconv("UTF-8", "ISO-8859-2", "{$TERMEKJELLEMZO->MEGNEV}"); $kod2 = $TERMEKJELLEMZO->KOD; $sql = "INSERT INTO ssx_jshopping_categories (category_id, category_image, category_parent_id, category_publish, category_ordertype, category_template, ordering, category_add_date, products_page, products_row, access) VALUES ('$kod2', '$megnev2', '$kod', 1, 1, NULL, 1, NULL, 12, 3, 1)"; // mysql_select_db('xxxx'); $retval = mysql_query($sql, $conn); if (!$retval) { die('nem sikerült a kategoriák feltöltése: ' . mysql_error()); } } }

tanácsok:
- ha végig ugyanazon az adatbázison dolgozol, akkor nem kell a ciklusba a mysql_select_db() - elég a kapcsolódás után kiadni egyszer
- ha így működik, akkor próbáld meg átírni bulk insert-re - a különbség az, hogy amíg itt végrehajtasz vagy 1000 insertet, azt 1 darab insertben is el tudod küldeni és sokkal gyorsabb lesz (végig egy stringbe vagy tömbbe gyűjtöd a beszúrandó VALUES értékeket és csak a legvégén rakod össze és futtatod le az insert parancso(ka)t).
- nézz utána a tranzakciókezelésnek
- ha natív mysql-t használsz, akkor használd a mysql_real_escape_string()-et - ha becsúszik egy ' valahova, akkor máris megáll a feltöltés
- érdemes megfontolni a PDO-ra vagy mysqli-re való átállást - natív mysql már deprecated állapotban van
Mutasd a teljes hozzászólást!

  • Esetleg valami hasonlóra gondoltál vagy erre?
    Ha tévedtem bocsi.
    Mutasd a teljes hozzászólást!
  • Szerintem kellene még egy belső ciklus is, amivel a termékjellemzőkön lépkedsz:

    foreach ($xml->TERMEKCSOPORT as $TERMEKCSOPORT) { $megnev = iconv("UTF-8", "ISO-8859-2", "{$TERMEKCSOPORT->MEGNEV}"); $kod = $TERMEKCSOPORT->KOD; foreach($TERMEKCSOPORT->TERMEKJELLEMZOK->TERMEKJELLEMZO as $TERMEKJELLEMZO) { $megnev2 = iconv("UTF-8", "ISO-8859-2", "{$TERMEKJELLEMZO->MEGNEV}"); $kod2 = $TERMEKJELLEMZO->KOD; $sql = "INSERT INTO ssx_jshopping_categories (category_id, category_image, category_parent_id, category_publish, category_ordertype, category_template, ordering, category_add_date, products_page, products_row, access) VALUES ('$kod2', '$megnev2', '$kod', 1, 1, NULL, 1, NULL, 12, 3, 1)"; // mysql_select_db('xxxx'); $retval = mysql_query($sql, $conn); if (!$retval) { die('nem sikerült a kategoriák feltöltése: ' . mysql_error()); } } }

    tanácsok:
    - ha végig ugyanazon az adatbázison dolgozol, akkor nem kell a ciklusba a mysql_select_db() - elég a kapcsolódás után kiadni egyszer
    - ha így működik, akkor próbáld meg átírni bulk insert-re - a különbség az, hogy amíg itt végrehajtasz vagy 1000 insertet, azt 1 darab insertben is el tudod küldeni és sokkal gyorsabb lesz (végig egy stringbe vagy tömbbe gyűjtöd a beszúrandó VALUES értékeket és csak a legvégén rakod össze és futtatod le az insert parancso(ka)t).
    - nézz utána a tranzakciókezelésnek
    - ha natív mysql-t használsz, akkor használd a mysql_real_escape_string()-et - ha becsúszik egy ' valahova, akkor máris megáll a feltöltés
    - érdemes megfontolni a PDO-ra vagy mysqli-re való átállást - natív mysql már deprecated állapotban van
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd