|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Daten über RPC-XML
|
Seitenanfang |
| Hallo Ich habe folgendes Problem: Ich würde gerne Daten über XML-RPC in eine mysql-Datenbank importieren. Die Daten kann ich saugen und stehen dann wie folgt zur Verfügung bzw. mit "print Dumper" gibt es folgenden Screen-Print: $VAR1 = [ { 'languages' => [ 'en' ], 'area' => 'Europe', 'time' => { 'to' => '15:00', 'from' => '14:00' }}, { 'languages' => [ 'en' ], 'area' => 'Europe', 'time' => { 'to' => '15:00', 'from' => '14:00' }}, { 'languages' => [ 'en' ], 'area' => 'Europe', 'time' => { 'to' => '15:00', 'from' => '14:00' }} ]; Wie bringe ich jetzt die Datensätze in einzelne Variablen, damit ich die Werte in die Datenbank übernehmen kann? Ich stell mir vor dass das mit einem foreach loop zu machen ist.. foreach (???) { $languages = ??; $area = ??; $time_to = ??; $time_from = ??; DB_QUERY } PS: Der mysql DB Task ist klar, bloss wie ich an die Variabelwerte komme nicht.
Datum: 23.05.2007-17:34

|
re: Daten über RPC-XML
|
Seitenanfang |
Du musst die Daten einfach nur dereferenzieren
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect( # ... ) or die $DBI::errstr; my @data = ( { 'languages' => ['en'], # ... }, { # ... }, ); my $sth = $dbh->prepare( "INSERT INTO mytable('lang', 'area', 'time_to', 'time_from') VALUES ( ?, ?, ?, ? )" ); foreach my $data (@data) { $sth->execute( join(',', @{$data->{'languages'}}), $data->{'area'}, $data->{'time'}->{'to'}, $data->{'time'}->{'from'} ); }
Zum Beispiel zeigt 'languages' auf ein anonymes Array, also musst du es so dereferenzieren
@{ $data->{'languages'} }
um an die Werte zu kommen. join() verbindet dann die Werte mit einen 'Komma' um sie in einer Tabellenspalte speichern zu koennen.
Datum: 23.05.2007-19:57

|
re: Daten über RPC-XML
|
Seitenanfang |
| Tolle Antwort! Vielen Dank, werds gleich mal versuchen und dann ein Feedback geben. Gruss
Datum: 23.05.2007-20:29

|
re: Daten über RPC-XML
|
Seitenanfang |
| Hab den Code übernommen, krieg aber den folgenden error zurück: Pseudo-hashes are deprecated at /home/www/xml_rpc/script.cgi line 30. Can't use an undefined value as an ARRAY reference at /home/www/xml_rpc/script.cgi line 31.
Datum: 23.05.2007-23:52

|
re: Daten über RPC-XML
|
Seitenanfang |
Der Fehler in Zeile 31 ist simpel, angenommen in einen Teil der XML-Daten ist 'languages' nicht gesetzt also undefiniert,
$data->{'languages'} = undef;
An der Stelle an der man versucht 'languages' zu einen Array zu dereferenzieren
@{ $data->{'languages'} };
tritt die Warnmeldung auf, denn an dieser Stelle enthaelt 'languages' keine Arrayreferenz sondern den Wert 'undef' und der laesst sich nicht dereferenzieren.Zum Fehler in Zeile 30, da ist es notwendig dass du zwei, drei Zeilen Code um die Zeile 30 postest. Ich gehe mal stark davon aus, dass der Fehler von Zeile 31 ein Folgefehler von Zeile 30 ist.
Datum: 24.05.2007-13:50

|
re: Daten über RPC-XML
|
Seitenanfang |
| Hallo dash, Dann liegt der Fehler vermutlich hier: @{$data->{'country'}->{'languages'}}), ? "languages" kann ja mehrere Ergebnisse haben, nur wie definiert man das? Zeile 30 beginnt mit "join.." ... foreach my $data (@data) { $sth->execute( join(',', @{$data->{'country'}->{'languages'}}), $data->{'country'}->{'area'}, $data->{'country'}->{'name'}, $data->{'country'}->{'code'} ); } $sth->finish(); $dbh->disconnect(); Der Dumper output von @data ist wie folgt: $VAR1 = [ { 'languages' => [ 'en' ], 'area' => 'Europe', 'name' => 'Andorra', 'code' => 'ad' }, { 'languages' => [ 'en' ], 'area' => 'Middle East', 'name' => 'United Arab Emirates', 'code' => 'ae' }, { 'languages' => [ 'en', 'es' ], 'area' => 'South America', 'name' => 'Argentina', 'code' => 'ar' }, { .... RPC Server details: Signatures: array struct [country]{area} [country]{code} [country]{languages}[languagecode] [country]{name}
Datum: 24.05.2007-14:50

|
re: Daten über RPC-XML
|
Seitenanfang |
| Die Ursache fuer beide Meldungen ist $data->{'country'}, wie du im Dump von @data sehen kannst existiert kein Hashelement 'country'. Die Meldung 'Pseudo-hashes are deprecated ...' entsteht dadurch, da $data->{'country'} nicht existiert aber durch die weitere Verwendung $data->{'country'}->{'languages'} wird $data->{'country'} automatisch angelegt, das ist eigentlich syntaktischer Zucker von Perl, an dieser Stelle aber ein Fehler.
Datum: 24.05.2007-16:58

|
re: Daten über RPC-XML
|
Seitenanfang |
Aendere deinen Code wie folgt ab.
foreach my $data (@data) { my $lang = ''; if(defined $data->{'languages'} and ref($data->{'languages'}) eq 'ARRAY') { $lang = join ',' => @{$data->{'languages'}}; } $sth->execute( $lang, $data->{'area'}, $data->{'name'}, $data->{'code'}, ); }
$lang wird zusaetzlich auf einen Leerstring gesetzt und nur dann auf die Werte aus $data->{'languages'} wenn $data->{'languages'} auch definiert und eine Arrayreferenz ist, du kannst auch einen else-Block anhaengen der eine entsprechende Fehlermeldung ausgibt sollte 'languages' mal keine Arrayreferenz sein. Das kann spaeter einmal ganz nuetzlich sein.PS: Forum kam mit der Laenge der Antwort nicht klar, deshalb 2 Antworten
Datum: 24.05.2007-16:59

|
re: Daten über RPC-XML
|
Seitenanfang |
| Ich bin baff! Sehr aufmerksam.. $data->{'languages'} war nämlich tatsächlich in einigen rows nicht definiert und hätte unweigerlich erneut zum bereits genannten error geführt. Herzlichen Dank! *beeindruckt ab so viel Kompetenz* :o)
Datum: 25.05.2007-14:04

|
re: Daten über RPC-XML
|
Seitenanfang |
| Bedank mich auch weil man dir nicht alle Infos aus der Nase ziehen musste ;)
Datum: 25.05.2007-15:40

|
|

|

|

|
 |

|

|
|