XML import zu Mysql

kollo2411

Mitglied
Hey leute,

hab hier ein problem mit meinem Xml import der zwar soweit läuft, aber nun noch abgeändert werden soll das beim import die geänderten Daten per update in die datenbank geschrieben werden hat da jemand ne Idee****

Hier mal mein Code:
PHP:
if(isset($_POST['xml']))
{
	
 	$dbhost = 'localhost'; 
    $dbuser = 'root'; 
    $dbpass = 'pass'; 
    $dbdata = 'adresse';
    $dbtabelle = $_POST['tabellenname'];
    

    mysql_connect($dbhost,$dbuser,$dbpass) or die(mysql_error());
    mysql_select_db($dbdata) or die(mysql_error());	
    mysql_query("SET names utf8");
   
    
function  Objekt2Array($Objekt)
{
	    $Rueckgabewert = NULL;

	   if(is_array($Objekt))
	   {
	       foreach($Objekt as $Schluessel => $Wert)
	       {
	           $Rueckgabewert[$Schluessel] = Objekt2Array($Wert);
	       }
	    }
	    else
	   {
       $Objektelemente = get_object_vars($Objekt);
 
        if($Objektelemente)
       {
            foreach($Objektelemente as $Schluessel => $Wert)
            {
                $Rueckgabewert[$Schluessel] = Objekt2Array($Wert);
            }
        }
        else
        {
            return strval($Objekt);
        }
    }
 
    return $Rueckgabewert;
}
 
$DateinameXML = "/Daten/fb_servers/adb/Page/test.xml";

 
$objekt = simplexml_load_file($DateinameXML);
$array = Objekt2Array($objekt);
$array = array_values($array);
 
 
// Generierung der Data Modeling Language (DML)
 
for($i = 0, $MySQLSpalten = "", $MySQLWerte = ""; $i < count($array[0]); $i++)
{
    foreach($array[0][$i] as $Schluessel => $Wert)
    {
        $MySQLSpalten .= $Schluessel . ", ";
        $MySQLWerte .= "'" . $Wert . "', ";
    }
 
    $arrMySQLDML[] = "INSERT INTO $dbtabelle (" . substr($MySQLSpalten, 0, -2) . ") VALUES (" .   substr($MySQLWerte, 0, -2) . ");";
 
    $MySQLSpalten = "";
    $MySQLWerte = "";
}
 
// Ausgabe von DML
 
	for($i = 0; $i < count($arrMySQLDML); $i++)
	{
	//echo$arrMySQLDML[$i],"\n";
    mysql_query($arrMySQLDML[$i]);
	} 

    
}
 
Zuletzt bearbeitet:
item: Bitte den Code formatiert in [PHP]mein Code[/PHP] setzen.
So wie er jetzt da steht kann man das Ding kaum lesen

item: Was funktioneirt den nicht?
 
Hey danke für den tipp mit der Formatierung,

ja im moment kann ich nur leere Tabellen importieren, aber ich möchte das so machen das wenn die Tabelle gefüllt ist geänderte Daten per update eingetragen werden und neue dran gehängt werden.
 
Zuletzt bearbeitet:
Setze mal die Strings nicht von Hand zusammen sondern über implode() und Arrays und etwa so könnte es am Schluss aussehen (Der Teil ind er For-Schleife)
PHP:
	$MySQLSpalten = array();
	$MySQLWerte = array();
	$MySQLUpdate= array();
    foreach($array[0][$i] as $Schluessel => $Wert){
    	$MySQLSpalten[] = $Schluessel;
    	$MySQLWerte[] = "'{$Wert}'";
    	$MySQLUpdate[] = "{$schluessel} = '{$Wert}'";
	}

    $arrMySQLDML[] = "
    	INSERT INTO {$dbtabelle} (". implode(', ', $MySQLSpalten) .") 
    	VALUES (".   implode(',', $MySQLWerte) .")
    	ON DUPLICATE KEY UPDATE". implode(',', $MySQLUpdate) .";";

Nachtrag:
Falls das SQL nicht das macht was du willst, hier ein Tutorial zum debugen von MySQL-Queries in Kombination mit PHP
PHP MySQL Debug Queries
 
Zuletzt bearbeitet:
Hab das mal so übernommen mit meiner funktion aber da tut sich nix im moment
Was hat das mit den dreien auf sich ****
PHP:
$MySQLSpalten = array();
    $MySQLWerte = array();
    $MySQLUpdate= array();
 
Initialisieren als array. zurücksetzen auf ein leeres Array bei jedem Durchgang der for-Schleife.

Um das Problem zu finden solltest du mal debugen und den generierten SQL-Code hier posten. (Anleitung siehe mein letztes Posting)

Nachtrag:
Hab grad gesehen, dass nach dem SQL-Befehl UPDATE noch ein Leerzeichen hin sollte...
 
hier die Meldung die nun kommt :

arning: simplexml_load_file(): /Daten/fb_servers/adb/Page/test.xml:33: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xF6 0x72 0x67 0x3C in /Daten/fb_servers/adb/Page/import.php on line 86 Warning: simplexml_load_file(): J?rg in /Daten/fb_servers/adb/Page/import.php on line 86 Warning: simplexml_load_file(): ^ in /Daten/fb_servers/adb/Page/import.php on line 86 Warning: array_values(): The argument should be an array in /Daten/fb_servers/adb/Page/import.php on line 88 Warning: implode(): Invalid arguments passed in /Daten/fb_servers/adb/Page/import.php on line 129 Warning: implode(): Invalid arguments passed in /Daten/fb_servers/adb/Page/import.php on line 130

PHP:
function  Objekt2Array($Objekt)
{
	    $Rueckgabewert = NULL;

	   if(is_array($Objekt))
	   {
	       foreach($Objekt as $Schluessel => $Wert)
	       {
	           $Rueckgabewert[$Schluessel] = Objekt2Array($Wert);
	       }
	    }
	    else
	   {
       $Objektelemente = get_object_vars($Objekt);
 
        if($Objektelemente)
       {
            foreach($Objektelemente as $Schluessel => $Wert)
            {
                $Rueckgabewert[$Schluessel] = Objekt2Array($Wert);
            }
        }
        else
        {
            return strval($Objekt);
        }
    }
 
    return $Rueckgabewert;
}
 
$DateinameXML = "/Daten/fb_servers/adb/Page/test.xml";

 
$objekt = simplexml_load_file($DateinameXML);
$array = Objekt2Array($objekt);
$array = array_values($array);
	
	$mysqlspalten = array();
	$mysqlwerte = array();
	$mysqlupdate = array();

	for($i = 0, $mysqlspalten = "", $mysqlwerte = ""; $i < count($array[0]); $i++)
	{
		foreach($array[0][$i] as $Schluessel => $Wert)
		{
			$mysqlspalten[] = $Schluessel;
			$mysqlwerte[] = "'{$Wert}'";
			$mysqlupdate[] = "{$Schluessel} = '{$Wert}'";
		}
	}
	$arrmysqldml[] = "INSERT INTO $dbtabelle (". implode(', ', $mysqlspalten) .")
	VALUES (". implode(',', $mysqlwerte) .")
	ON DUPLICATE KEY UPDATE" . implode(',', $mysqlupdate) .";";
	
	for($i = 0; $i < count ($arrmysqldml); $i++)
	{
		mysql_query($arrmysqldml[$i]);
	}
 
Zuletzt bearbeitet:
item: Da gibts ein Fehler beim Einlesen des XML

item: Eine Fehlermeldung über array_values(): Das seh ich in deinem Script noch nicht.

item: Es fällt mir schwer dir zu sagen was falsch ist, wenn ich nicht weiss was auf den in den Fehlermeldungen angegebenen Zeilen steht.

item: Das SQL zusammensetzen sollte innerhalb der for-Schleife stehen. Ansonsten gibts nur ein INSERT und zwar den letzten.

Tipp: PHP-Fehlermeldungen in der HTML-Source-Ansicht anschauen. Es ist meistens lesbarer formatiert.

Code:
warning: simplexml_load_file(): 
/Daten/fb_servers/adb/Page/test.xml:33: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xF6 0x72 0x67 0x3C
in /Daten/fb_servers/adb/Page/import.php on line 86 Warning: simplexml_load_file(): J?rg in /Daten/fb_servers/adb/Page/import.php
on line 86 Warning: simplexml_load_file(): ^ 
in /Daten/fb_servers/adb/Page/import.php 
on line 86 Warning: array_values(): The argument should be an array in /Daten/fb_servers/adb/Page/import.php 
on line 88 Warning: implode(): Invalid arguments passed 
in /Daten/fb_servers/adb/Page/import.php 
on line 129 Warning: implode(): Invalid arguments passed 
in /Daten/fb_servers/adb/Page/import.php on line 130
 
Zuletzt bearbeitet:
Zurück