PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Tabelle in Datei schreiben, aber wie?


G. Kramer
28.05.2003, 10:13
Hallo,

hat Jemand von euch schon ein PHP-Script. mit welchem man eine MySQL-Tabelle auslesen und als Textdatei auf dem Server ausgeben kann? Ich brauche nicht alle Felder dieser Tabelle, nur bestimmte. Das Script, sofern es eines gibt, passe ich mir gerne dann selbst an. Ich frage nur, da ich das Rad nicht neu erfinden möchte.

G. Kramer
28.05.2003, 16:31
Lasst gut sein, ich habe mir was gebastelt (PHP und Access-VBA) und habe die Daten in der Zwischenzeit in Access. :)

Stadler
29.05.2003, 19:33
Hallo,

Zwar hast du ja schon 'ne Lösung, aber wenn Du willst, kannst Du dir auch mal die Exportfunktionen von phpMyAdmin anschauen. Damit lässen sich die Daten zum Beispiel im XML, CSV oder LaTeX-Format abspeichern.

MfG
Christian Stadler

G. Kramer
30.05.2003, 07:43
Hallo,

danke für die Antwort, aber das habe ich ja schon versucht.
Siehe dazu bitte folgenden Beitrag:
http://www.vbulletin-germany.com/forum/showthread.php?threadid=5784

Das Problem ist, dass dabei die Spalten verschoben werden, da ich kein eindeutiges Feldtrennzeichen habe. Egal welches Zeichen ich nehme, es kommt immer in irgendeinem Datensatz als Inhalt vor und wird dann als Trennzeichen interpretiert und schon verhaut es mir alle Spalten. Das bringt mich dann so nicht weiter.

D|ver
30.05.2003, 11:22
hmm, hast du es mit dem mysqlcommander auch schon versucht ?

vielleicht bringt der dich da weiter

G. Kramer
30.05.2003, 11:38
Nein, habe ich nicht.
Ich wüsste auch nicht, was der anders machen sollte, aber ich werde mir das Teil gerne mal ansehen.
Fakt ist, dass ich Feldtrennzeichen brauche, die in keinem Feldinhalt vor kommen. Ich habe nun mal meine ganzen Datensätze durchsuchen lassen und es gibt kein Zeichen, welches nicht irgendwo in einem Feld enthalten ist. Also musste ich mir eine Zeichenfolge ausdenken, die unter normalen Umständen (eher habe ich einen 6. in Lotto), nicht vorkommt. Per VBA lese ich dann die Datei ein, suche dabei nach diesen Feldtrennzeichen und weisen den Tabellenfeldern die Inhalte zu. Das klappt recht gut und ich werde dieses auch weiterhin so machen, da es sicher ist. Zudem werde ich das Teil samt PHP-Script ja dann zur Verfügung stellen und Andere sollen den Import ja einfach durchführen können.

s.molinari
30.05.2003, 12:24
Hi G.Kramer,

Hast du ein Pipe "|" versucht als Feldtrenzeichen?

Scott

G. Kramer
30.05.2003, 13:14
Hallo Scott,

danke für die Nachfrage, aber glaube mir, ich habe alle Zeichen der normalen (nicht der erweiterten) ASCII-Tabelle gesucht und leider auch gefunden. Ich trenne nun die Felder mit "|¦|" und das Satzende mit "|¦¦|". Ich gehe mal davon aus, dass diese Kobination nicht gepostet wird.

Gruß
Günther
PS: Hast du noch eine andere (evtl. bessere Idee)?

Znaper
30.05.2003, 13:26
Übirgens MySQL bringt die Funktion Datensätze in ne File zu schreiben schon mit.
Hier ein kleiner Auszug aus der MySQL Doku:


Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt die ausgewählten Zeilen in eine Datei. Die Datei wird auf dem Server-Host erzeugt und darf nicht bereits bestehen (das verhindert unter anderem, dass Datenbanktabellen und Dateien wie `/etc/passwd' zerstört werden). Sie benötigen die file-Berechtigung auf dem Server-Host, um diese Form von SELECT auszuführen. SELECT ... INTO OUTFILE ist hauptsächlich dafür vorgesehen, um eine Tabelle auf der Server-Maschine schnell zu dumpen. Wenn Sie die resultierende Datei auf einem anderen Host als dem Server-Host haben wollen, können Sie SELECT ... INTO OUTFILE nicht benutzen. In diesem Fall sollten Sie statt dessen ein Client-Programm wie mysqldump --tab oder mysql -e "SELECT ..." > outfile benutzen, um die Datei zu erzeugen. SELECT ... INTO OUTFILE ist das Komplement von LOAD DATA INFILE; die Syntax für den export_optionen-Teil des Statements besteht aus denselben FIELDS- und LINES-Klauseln, die beim LOAD DATA INFILE-Statement benutzt werden. See section 7.4.9 LOAD DATA INFILE-Syntax. In der resultierenden Textdatei werden nur folgende Zeichen durch das ESCAPED BY-Zeichen escapet:
Das ESCAPED BY-Zeichen
Das erste Zeichen in FIELDS TERMINATED BY
Das erste Zeichen in LINES TERMINATED BY
Zusätzlich wird ASCII 0 in ESCAPED BY, gefolgt von 0 (ASCII 48), umgewandelt. Der Grund hierfür ist, dass Sie jegliche FIELDS TERMINATED BY-, ESCAPED BY- oder LINES TERMINATED BY-Zeichen escapen MÜSSEN, um die Datei zuverlässig wieder einlesen zu können. ASCII 0 wird escapet, um das Lesen mit einigen Pagern zu erleichtern. Weil sich die resultierende Datei nicht nach der SQL-Syntax richten muss, muss nicht weiter escapet werden. Im Folgenden ein Beispiel, wie man eine Datei in einem Format erhält, das von vielen alten Programmen benutzt wird:
SELECT a,b,a+b INTO OUTFILE "/tmp/resultat.text"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM tabelle;
Wenn Sie INTO DUMPFILE anstelle von INTO OUTFILE benutzen, schreibt MySQL nur eine Zeile in die Datei, ohne jede Spalten- oder Zeilen-Begrenzer und ohne jedes Escapen. Das ist nützlich, wenn Sie ein Blob in eine Datei speichern wollen.
Beachten Sie, dass jede Datei, die von INTO OUTFILE und INTO DUMPFILE erzeugt wird, für alle Benutzer lesbar ist! Der Grund liegt darin, dass der MySQL-Server keine Datei erzeugen kann, die jemandem anderen gehört als dem Benutzer, unter dem er läuft (Sie sollten mysqld nie als Root laufen lassen), daher muss die Datei für jedermann lesbar sein, damit Sie die Zeilen abrufen können.


mfg Znaper

G. Kramer
30.05.2003, 15:31
Hallo Znaper,

kann ich den Befehl per PHP-Scrip absetzen oder innerhalb von phpMyAdmin?

Ich merke gerade, dass mein PHP-Script nicht alle Datensätze aus der Tabelle post exportiert. Weshalb kann ich mir nicht erklären. Ich poste mal das Scrip.

Ach, wenn ich innerhalb von phpMyAdmin den "... INTO OUTFILE"-Befehl eingebe, kommt eine Fehlermeldung, dass ich keine Berechtigung zum Schreiben auf die Platte (o.s.ä) habe.


<html>
<body>
<?php
include("dbini.inc");

// SQL-Anfrage
$tabelle = "post";

$fp = fopen("mof_post.txt", "w");
if ($fp)
{
flock($fp,2);
$result = mysql_query("SELECT postid, threadid, username, title, dateline, pagetext, iconid, userid, attachmentid FROM $tabelle") or die(mysql_error());
$row = mysql_fetch_array($result);
$gesamt = mysql_affected_rows();
while($row = mysql_fetch_array($result))
{
$sql_str = "";
$sql_str .= $row['postid'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['threadid'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['username'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['title'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['dateline'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['pagetext'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['iconid'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['userid'];
$sql_str .= chr(124) . chr(166) . Chr(124);
$sql_str .= $row['attachmentid'];
$sql_str .= chr(124) . chr(166) . chr(166) . Chr(124) . Chr(13);

fputs ($fp, $sql_str);
}

/* Verbindung mit SQL-Server beenden */
MYSQL_CLOSE();

flock($fp,3);
fclose($fp);
echo "Die Datei <b>mof_post.txt</b> wurde erstellt.<br>".$gesamt." Datensätze";
}
else
{
echo "Die Datei <b>mof_post.txt</b> konnte nicht zum Schreiben geöffnet werden!";
}
?>
</body>
</html>


Ich finde eigentlich immer mehr gefallen am Export über PHP, da ich hier später den Zeitraum der Beiträge per SQL steuern kann und hierbei verschiedene SQL-Befehle (Abhängigkeit der Tabelle treads zur post - Thema lastedit) auf einmal absetzen kann.

Gruß
Günther

G. Kramer
30.05.2003, 22:41
Hallo,

folgenden Fehler erhalte ich, wenn ich über phpMyAdmin -> Exportieren -> CSV-Datei die Tabelle "post" exportieren möchte.

Warning: MySQL: Unable to save result set in /homepages/38/d72425252/htdocs/forum_vb/dbadmin/libraries/mysql_wrappers.lib.php on line 92
Fehler

SQL-Befehl :


SELECT * FROM `db72955922`.`post` LIMIT 217779


MySQL meldet:

MySQL client run out of memory


Wenn ich die Datei mit dem Befehl ausgeben will, welchen mir Znaper vorgeschalgen hat, dann erhalte ich folgende Meldung:
Access denied for user: 'p_________@localhost' (Using password: YES)
Zurück
Was beduetet das?