Problem mit PHP und MySQL
Manuel S
- php
0 Vinzenz Mai0 Manuel S
0 dedlfix
Hallo,
folgendes Problem habe ich mit meiner Datenbank. Ich möchte ein komplettes Backup per php script erzeugen, das funtzt auch insofern, dass ich ne Datei erstelle und dort alle Befehle richtig drin habe. Zumindest sieht sie genauso aus wie eine Datei die von phpMyAdmin erzeugt wird.
Nun bin ich dabei die Restore-Funktion zu schreiben und zwar prüfe ich zu erst ob die Datenbank existiert, wenn ja dann lösche ich sie, wenn nein dann mache ich weiter. Lese die exportierte Datei ein, schreibe sie in ne Variable und führe mysql_query() mit dieser Variable aus. Leider funktioniert das nicht! er macht einfach gar nichts. Wenn ich jedoch direkt in phpMyAdmin mit dem SQL editor den Code, den ich per "copy" dort einfüge, ausführen lasse funktioniert er insofern, dass alles wiederhergestellt wird.
Das hier ist der Inhalt der exportierten Datei:
--
-- Tabellenstruktur ta_config
--
CREATE TABLE IF NOT EXISTS ta\_config
(
ID
int(10) unsigned NOT NULL auto_increment,
name
varchar(50) NOT NULL,
wert
varchar(100) NOT NULL,
PRIMARY KEY (ID
),
UNIQUE KEY ID
(ID
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Einstellungen' AUTO_INCREMENT=2;
INSERT INTO ta\_config
(ID
, name
, wert
) VALUES
(1, 'maxanzahltapes', '10');
--
-- Tabellenstruktur ta_genre
--
CREATE TABLE IF NOT EXISTS ta\_genre
(
id
int(10) unsigned NOT NULL auto_increment,
genre
varchar(150) NOT NULL,
info
varchar(250) NOT NULL,
PRIMARY KEY (id
),
UNIQUE KEY id
(id
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Genre' AUTO_INCREMENT=10;
INSERT INTO ta\_genre
(id
, genre
, info
) VALUES
(1, 'POP', '-'),
(2, 'Rock', '-'),
(3, 'Metal', '-'),
(4, 'Hard-Rock', '-'),
(5, 'POP-Rock', '-'),
(8, 'Hip-Hop', '-'),
(9, 'Techno', '-');
--
-- Tabellenstruktur ta_music
--
CREATE TABLE IF NOT EXISTS ta\_music
(
id
int(10) unsigned NOT NULL auto_increment,
date
int(10) NOT NULL,
tape
int(10) NOT NULL,
author
varchar(100) NOT NULL,
title
varchar(100) NOT NULL,
album
varchar(100) NOT NULL,
year
int(10) NOT NULL,
info
varchar(250) NOT NULL,
genre
int(10) NOT NULL,
length
varchar(10) NOT NULL,
PRIMARY KEY (id
),
UNIQUE KEY id
(id
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Music' AUTO_INCREMENT=4;
INSERT INTO ta\_music
(id
, date
, tape
, author
, title
, album
, year
, info
, genre
, length
) VALUES
(1, '1215257905', 1, 'Blühen', 'Pferdkotzen', 'Zum kotzen', 1999, '-', 1, '3:19'),
(2, '1215258108', 2, 'Beach Boys', 'Surfin USA', 'The Best Ever', 1995, '-', 1, '-'),
(3, '1215258042', 2, 'BeachBoys', 'Barbara-Ann', 'The Best Ever', 1995, '-', 1, '-');
--
-- Tabellenstruktur ta_tapes
--
CREATE TABLE IF NOT EXISTS ta\_tapes
(
id
int(10) unsigned NOT NULL auto_increment,
date
int(10) NOT NULL,
name
varchar(50) NOT NULL,
info
varchar(250) NOT NULL,
genre
int(10) NOT NULL,
year
int(10) NOT NULL,
dateiname
varchar(250) NOT NULL,
PRIMARY KEY (id
),
UNIQUE KEY id
(id
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Music' AUTO_INCREMENT=5;
INSERT INTO ta\_tapes
(id
, date
, name
, info
, genre
, year
, dateiname
) VALUES
(1, 1215257870, 'Bravo Hits 1', '-', 1, 2000, '/musik/bravo1.mp3'),
(2, 1215258085, 'The Compilation', 'Beach Boys', 1, 1995, '/musik/beach18989.mp3'),
(3, 1215258063, 'The Best', '-', 1, 0, '-'),
(4, 1215365701, 'Tape 38', 'Das beste der Neunziger', 1, 2000, '/musik/tape4.mp3');
Ach bei der Ausführung meldet phpMyAdmin noch diesen fehler:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
INS' at line 11
aber ich glaube, dass der nicht viel zu sagen hat. jedenfalls habe ich das so aus anderen foren gelesen.
Ich komme echt nicht weiter ...
Gruß Manuel
PS: Mittlerweile habe ich den Teil der die Datenbank neu erstellt schon raus genommen und lasse diese im "wiederherstellen-script" direkt ausführen, dann klappt das mit der Datenbank, nur nicht mit den Tabellen und Inhalten.
Vielleicht ist es auch eine Lösung, wenn ich die Datei einlese und aufspalte in die einzelnen Querys und diese dann getrennt von einander ausführe. Leider habe ich aber keine Ahnung wie ich das machen soll ;-)
Hallo,
Nun bin ich dabei die Restore-Funktion zu schreiben und zwar prüfe ich zu erst ob die Datenbank existiert, wenn ja dann lösche ich sie, wenn nein dann mache ich weiter. Lese die exportierte Datei ein, schreibe sie in ne Variable und führe mysql_query() mit dieser Variable aus. Leider funktioniert das nicht! er macht einfach gar nichts.
Wirklich "gar nichts"? Ich gehe davon aus, dass die erste Anweisung ausgeführt wird.
Vielleicht ist es auch eine Lösung, wenn ich die Datei einlese und aufspalte in die einzelnen Querys und diese dann getrennt von einander ausführe. Leider habe ich aber keine Ahnung wie ich das machen soll ;-)
Du könntest Dich einfach von den veralteten und beschränkten mysql_*-Funktionen verabschieden und Dich der verbesserten MySQL-Erweiterung mysqli zuwenden. Diese kann bei einem Aufruf mehrere SQL-Statements ausführen, mit mysql_* geht das nicht.
Freundliche Grüße
Vinzenz
Hi,
Du könntest Dich einfach von den veralteten und beschränkten mysql_*-Funktionen verabschieden und Dich der verbesserten MySQL-Erweiterung mysqli zuwenden. Diese kann bei einem Aufruf mehrere SQL-Statements ausführen, mit mysql_* geht das nicht.
Boah danke du bist meine Rettung. Jetzt klappt alles. Stelle gleich mal alles darauf um!! DANKE
Freundliche Grüße
Zurück!
echo $begrüßung;
Vinzenz hat ja schon geantwortet. Ich kommentiere auch noch ein bisschen.
Nun bin ich dabei die Restore-Funktion zu schreiben und zwar prüfe ich zu erst ob die Datenbank existiert, wenn ja dann lösche ich sie, wenn nein dann mache ich weiter.
Es gibt auch für DROP DATABASE den Zusatz IF EXISTS, sowie IF NOT EXISTS für CREATE DATABASE.
Lese die exportierte Datei ein, schreibe sie in ne Variable und führe mysql_query() mit dieser Variable aus. Leider funktioniert das nicht! er macht einfach gar nichts.
Wer ist "er"? Hat "er" einen Rückgabewert, der einen Fehler signalisiert? Hat "er" eine Funktioon, mit der der Wortlaut des Fehlers abfragbar ist?
Ach bei der Ausführung meldet phpMyAdmin noch diesen fehler:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).INS' at line 11
aber ich glaube, dass der nicht viel zu sagen hat. jedenfalls habe ich das so aus anderen foren gelesen.
Der Text zwischen ; und INS ist Ausgabe von phpMyAdmin, die entsteht, wenn man mehrere Statements ausführt und "SQL-Befehl hier wieder anzeigen" markiert hat, und dann diese Ausgabe weiterverwendet. Mal abgesehen, dass das ein Fehler in der deutschen Sprachdatei ist, mann man diese Kommentare vor dem Weiterverwenden löschen. Ansonsten ist das die typische Meldung (der bemängelte Teil fängt mit ; an), wenn man versucht, mehrere Statements mit einem mysql_query()-Aufruf abzusetzen.
Vielleicht ist es auch eine Lösung, wenn ich die Datei einlese und aufspalte in die einzelnen Querys und diese dann getrennt von einander ausführe. Leider habe ich aber keine Ahnung wie ich das machen soll ;-)
Die einfachste Lösung wäre ein Explodieren am ;. Allerdings birgt das die Gefahr, SQL-Statements auseinanderzureißen, wenn darin das ; als Datenbestandteil vorkommt. Parsen und Strings erkennen wäre die bessere Lösung.
Warum machst du dir den Aufwand einer Restore-Prozedur, wenn es doch für diese eher seltenen Fälle bereits geeignete Tools (z.B. phpMyAdmin) gibt? Reicht es nicht, wenn du den Resore-Vorgang mit phpMyAdmin dokumentierst?
echo "$verabschiedung $name";