2009-05-27 16 views
0

In meiner PHP-Datei, ich lese Großteil der Informationen Abfrage wie folgt:Was ist das am einfachsten zu parsene Format für PHP?

SELECT GROUP_CONCAT(CONCAT('<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>') SEPARATOR '') 
         FROM idiscussion 
         LEFT JOIN 
           users 
         ON  idiscussion.uid=users.id 
         WHERE idiscussion.iask_id = 1 

ja, es ist wie xml-Format, aber scheint es in PHP, zu analysieren, nicht am einfachsten

Jede Empfehlung Welches Format soll verwendet werden, um später leicht analysiert zu werden?

AS für meine ich brauche sie alle zusammen zu verketten,

Sie diesen Fall denken: 1 Thema und Diskussionen zu einem Zeitpunkt unter diesem Thema zu erhalten. 1 Thema entspricht mehreren Diskussionen. Wie können Sie es in 1 Abfrage tun, ohne es miteinander zu verketten?

Antwort

0

Abhängig von der Datenstruktur, aber eine Liste von Werten kann leicht als Semikolon getrennte Liste von Einträgen mit Join() gespeichert werden, und dann leicht mit Split() geparst werden.

Dies ist extrem einfach, aber möglicherweise nicht ideal für etwas komplexere Daten.

Antwort zum Kommentar: Wenn die Daten ein Semikolon enthalten, muss es entsprechend maskiert werden.

+0

Was ist, wenn die Daten ein Semikolon enthalten? – elcuco

+0

ja, ich denke, Ihre Vorgehensweise ist nett, aber scheint das Trennzeichen ein wichtiger Punkt ist. – omg

0

Sie könnten DOM oder SimpleXML verwenden, um XML-Dateien zu analysieren, aber auch JSON oder YAML. Alle sind recht einfach zu verwenden, da Sie sich auf High-Level-Parser für PHP verlassen können. Sie haben Vor- und Nachteile, je nachdem, wie Sie das Format verwenden möchten.

+0

Sie weisen also darauf hin, dass XML das einfachste Format zum Parsen in PHP ist? – omg

2

Wenn Sie Daten aus einer SQL-Datenbank erhalten, ist es viel einfacher, SQL nicht zu verwenden, um es in ein Textformat zu überführen, sondern stattdessen eine normale Abfrage auszuführen und die SQL-Funktionen zu verwenden. re gegeben.

Wenn Sie am Ende Daten zu anderen PHP-Clients serialisieren müssen, würde ich PHP's standard serialization format empfehlen.

+0

Ich bin es in ein Textformat Clobbering, um alle Informationen in 1 Abfrage zu erhalten, haben Sie Recht, aber wenn nicht, so müssen mehrere Zeit abfragen, zumindest die Umlaufzeit ist verschwendet. – omg

+1

Wenn diese einzelne Abfrage in der Lage ist, alle Daten abzurufen, um die Zeichenkette zu erstellen ... was lässt Sie glauben, dass sie nicht einfach dieselben Daten an php weitergeben kann?Angenommen, Sie können keinen einfachen JOIN schreiben, um alle Ihre Daten in einer einzigen Abfrage abzurufen, gibt es noch andere Optionen, die viel besser sind als das Erstellen (und später das Parsen) einer XML-Zeichenkette. Sie können eine gespeicherte Prozedur, eine Sicht erstellen oder eine temporäre Tabelle erstellen. –

0

Kann ich fragen, warum Sie nicht nur die Daten abrufen ohne Verkettung alles zusammen?

SELECT body, 
     IF(screen_name IS NOT NULL AND !anonymous, screen_name, '') AS replier, 
     created 
FROM idiscussion 
LEFT JOIN 
     users 
ON  idiscussion.uid = users.id 
WHERE idiscussion.iask_id = 1 

Dies sollte so schnell wie Ihre ursprüngliche Abfrage ausführen, und Sie ihre Daten zugreifen können, wie Sie jedes andere Ergebnis gesetzt würde. Angenommen, Sie sind mit MySQL und nicht PDO mit:

$result = mysql_query($sql); 
if ($result) { 
    while ($row = mysql_fetch_assoc($result)) { 
     // $row is an associative array containing the current row's data. 
    } 
} 

Wenn Sie die XML erstellen müssen, sondern wollen auch die Daten in seiner Rohform zuzugreifen, erstellen Sie es nur in der PHP.

$xml = 
    '<comment>' . 
     '<body><![CDATA[' . $row['body'] . ']]></body>' . 
     '<replier>' . $row['replier'] . '</replier>' . 
     '<created>' . $row['created'] . '</created>' . 
    '</comment>'; 

Möglicherweise müssen Sie die Daten aus dem Speicher entfernen, wenn sie nicht bereits bereinigt wurden. Sie könnten auch einen XML-Builder wie XMLWriter verwenden, obwohl das den Rahmen dieser Frage sprengen würde.

+0

Sie können über diesen Fall denken: Um 1 Thema und Diskussionen unter diesem Thema auf einmal abrufen. 1 Thema entspricht mehreren Diskussionen.Wie können Sie es in 1 Abfrage tun, ohne es miteinander zu verketten? – omg

+0

Mehrere Zeilen, vielleicht? Der Form: topic_id, discussion_id, diskussion_name, diskussion_body, diskussion_replier, diskussion_erzeugt. Die Themen-ID wird in allen Zeilen immer gleich sein, der Rest jedoch nicht. –

Verwandte Themen