XML mit PHP einlesen und in mySQL abspeichern?

kwmaster

Mitglied
Hallo zusammen,

ich möchte eine Twitter-Abfrage starten und das Ergebnis (ATOM-Feed) in eine mySQL-DB schreiben, jedoch klappt es nicht. Das hier ist mein Code:

PHP:
<?php

// Verbindung aufbauen, auswählen einer Datenbank
$link = mysql_connect("localhost", "root", "")
    or die("Keine Verbindung möglich: " . mysql_error());

echo "Verbindung zum Datenbankserver erfolgreich";

mysql_select_db("atomtest") or die("Auswahl der Datenbank fehlgeschlagen");

// Verbindung aufbauen zu ATOM-Feed

$feed =  simplexml_load_file('http://search.twitter.com/search.atom?q=twitter');
$children =  $feed->children('http://base.google.com/ns/1.0');

$entries = $children->entry;
foreach ($entries as $entry) {

  $details = $entry->children(http://base.google.com/ns/1.0');

  echo  $details->title ;


// Ausführen einer SQL-Anfrage
$query = "INSERT INTO atomfeed (id, published, title,
content, updated, author) VALUES ('$details->id', '$details->published',
$details->title', '$details->content','$details->updated','$details->author->name')";

$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
}


// Schließen der Verbinung
mysql_close($link);
?>

Und hier ist ein Ausschnitt aus der einzulesenen XML-Datei:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:google="http://base.google.com/ns/1.0" xml:lang="en-US" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.w3.org/2005/Atom" xmlns:twitter="http://api.twitter.com/">
<id>tag:search.twitter.com,2005:search/twitter</id>
<link type="text/html" rel="alternate" href="http://search.twitter.com/search?q=twitter"/>
<link type="application/atom+xml" rel="self" href="http://search.twitter.com/search.atom?q=twitter"/>
<title>twitter - Twitter Search</title>
<link type="application/opensearchdescription+xml" rel="search" href="http://search.twitter.com/opensearch.xml"/>
<link type="application/atom+xml" rel="refresh" href="http://search.twitter.com/search.atom?q=twitter&amp;since_id=1172659661"/>
<updated>2009-02-03T11:43:44Z</updated>
<openSearch:itemsPerPage>15</openSearch:itemsPerPage>
<link type="application/atom+xml" rel="next" href="http://search.twitter.com/search.atom?max_id=1172659661&amp;page=2&amp;q=twitter"/>
<entry>
<id>tag:search.twitter.com,2005:1172659661</id>
<published>2009-02-03T11:43:44Z</published>
<link type="text/html" rel="alternate" href="http://twitter.com/x_bacon/statuses/1172659661"/>
<title>@brunobelon Bom dia. Also, pago derreáu, dois chicletes e um cartão magnético de fiperama no teu Twitter. :D</title>
<content type="html">&lt;a href="http://twitter.com/brunobelon"&gt;@brunobelon&lt;/a&gt; Bom dia. Also, pago derreáu, dois chicletes e um cartão magnético de fiperama no teu &lt;b&gt;Twitter&lt;/b&gt;. :D</content>
<updated>2009-02-03T11:43:44Z</updated>
<link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/60834142/DSC00030-1_normal.jpg"/>
<link type="application/atom+xml" rel="thread" href="http://search.twitter.com/search/thread/1172659661.atom"/>
<author>
<name>x_bacon (Felipe Vicente)</name>
<uri>http://twitter.com/x_bacon</uri>
</author>
</entry>

Das Problem ist, dass sich das Programm zwar zur DB verbindet, aber dann war es das... Parse Error line 19:

PHP:
$details = $entry->children(http://base.google.com/ns/1.0');

Ich muß gestehen, ich bin kein guter Coder - habe mir alles aus dem Internet zusamengesucht und versucht nach bestem Wissen und Gewissen zusammenzusetzen :confused:

Ich hoffe, ihr habt eine Idee...

Gruß

Kai
 
Hi Doc,

danke für die erste Hilfe (tja, wenn man als Dau auch sein PHP einfach im Notepad schreibt...:rolleyes:)

Die Fehlermeldung ist nun weg, jedoch macht das Programm trotzdem nichts.

Nach der Meldung: Verbindung zum Datenbankserver erfolgreich ist mein Programm fertig, ohne weitere Ausgabe und ohne, dass irgend etwas in meiner Datenbank landet :confused:

Vielleicht hast Du (oder jemadn anderes) noch eine Idee, woran es leigen kann!

Die XML-Datei existiert definitiv und enthält auch Einträge...

Danke nochmals und Gruß

Kai
 
Ich weiß nicht, welche Daten genau in den Variablen stehen, aber diese sollten zumindest mit mysql_escape_string() für die sichere
Verwendung einer MySQL-DB maskiert werden:
PHP:
$query = "INSERT INTO atomfeed (id, published, title, content, updated, author) VALUES ('";
$query .= mysql_escape_string($details->id)."','";
$query .= mysql_escape_string($details->published)."','";
$query .= mysql_escape_string($details->title)."','";
$query .= mysql_escape_string($details->content)."','";
$query .= mysql_escape_string($details->updated)."','";
$query .= mysql_escape_string($details->author->name)."')";
Das könnte Dein Problem evtl. lösen...
Falls das Feld id der DB-Tabelle ein INT ist, mußt Du evtl. die Hochkomma für $details->id weglassen:
PHP:
$query = "INSERT INTO atomfeed (id, published, title, content, updated, author) VALUES (";
$query .= mysql_escape_string($details->id).",'";
... // den Rest spar ich mir jetzt mal

Hab mir mal die XML-Manipulation auf php.net kurz angesehen.
Habe zwar noch nie damit gearbeitet, aber ich könnte mir vorstellen, daß Du da etwas falsch verwendest?
Ist aber nur ne Vermutung
 
Zuletzt bearbeitet:
Leg dir bitte einen Editor mit Syntax-Highlighting zu!

Ich meine im Sinne aller von uns zu sprechen, das wir nicht hier sind um irgendwelche fehlenden Kommas oder Punkte zu ergänzen.

Allein durch das grobe überfliegen deines Codes sehe ich schon ein fehlenden single quote..

Such einfach mal hier im Forum, mitlerweile gibt es ca. eine Hand voll ganz guter Editoren, die relative viele der im Web vertretenen Sprachen unterstützen. :)
 
Hallo zusammen,

danke erstmal für die Antworten, werden den Code heute ändern und testen.

@DeluXe

Kannst Du mir einen Editor empfehlen? Reicht da ein Editor oder sollte man evtl. das PDT von Eclipse nutzen als komplette Entwicklungsumgebung


Gruß

Kai
 
Moin,

mit simplexml_load_file() erhältst du bereits einen Zeiger auf das Root-Element, du musst also nur die <entry>'s abfischen.


PHP:
  $feed     =  simplexml_load_file('http://search.twitter.com/search.atom?q=twitter');
  $entries  =  $feed->entry;
  
  foreach ($entries as $entry) 
  {
    echo  '<br>'.$entry->title ;
     
    //Hier weiter mit dem DB-Gedöns

  }
 
Zurück