einlesen von sql-file

  • hallo!

    kenn mich noch nicht so gut aus, drum frage ich mal hier

    ich möchte eine php-seite erstellen, mit der ich ein file zum beispiel über "durchsuchen"-button auswählen kann und dann uploade. beim file handelt sich um ein *.sql mit inserts. das file soll eingelesen werden und die inserts in die datenbank hinzugefügt, als bestätigung hab ich mir vorgestellt, das die anzahl der hinzugefügten datensätze sowie die anzahl der falschen datensätze(falls welche vorkommen sollten)

    da wollt ich wissen, ist das realisierbar? wenn ja wie muss man dabei vorgehen
    wäre für tipps und links dankbar

  • Du brauchst zunächst mal eine HTML-Datei, welche ein Formular zum Dateiupload enthält. Beim Klick auf "Submit" führst du dann das PHP-Skript aus, in dem du

  • Zitat von KiteRider

    wenn ja wie muss man dabei vorgehen

    Sehr vorsichtig. Stelle Dir mal vor, jemand tut statt der INSERT Statements DELETE statements rein. Ich würde die Vorgehensweise von Paulchen übernehmen, aber eher CSV Dateien als Input annehmen. Die dann parsen und daraus Insert Statements zusammenbauen.

    Außerdem würde ich das Formular zum Übersenden der Input-Dateien absichern, zumindst via .htaccess, wenn nicht über ein Portal / Authorisierungssystem.

  • Zitat von rck

    Sehr vorsichtig. Stelle Dir mal vor, jemand tut statt der INSERT Statements DELETE statements rein. Ich würde die Vorgehensweise von Paulchen übernehmen, aber eher CSV Dateien als Input annehmen. Die dann parsen und daraus Insert Statements zusammenbauen.

    Außerdem würde ich das Formular zum Übersenden der Input-Dateien absichern, zumindst via .htaccess, wenn nicht über ein Portal / Authorisierungssystem.

    Wenn nur die INSERT-Funktionalität erforderlich ist, könnte man ja auch DELETEs o.ä. auf der Ebene der Datenbankberechtigungen abfangen...oder?

  • Zitat von Paulchen

    Du brauchst zunächst mal eine HTML-Datei, welche ein Formular zum Dateiupload enthält. Beim Klick auf "Submit" führst du dann das PHP-Skript aus, in dem du



    formular hab ich erstellt, fürs einlesen hab ich file() benutzt, mit einer foreach-schleife geh ich das sql-file zeilenweise durch, kann mir sogar die zeilen ausgeben

    nur wie krieg ich die daten in die datenbank?
    mysql_query($variable wo die zeilen drinnen sind);

    steh grad voll an

  • Für den Fall, dass in $variable mehrere Abfragen enthalten sind, musst du zunächst sicherstellen, dass du Zeichenketten erhältst, die jeweils nur eine Abfrage enthalten (MySQL verweigert die Abarbeitung mehrerer Abfragen in einer Wurst); das kannst du zum Beispiel mit Hilfe von explode machen, siehe PHP-Manual. Wenn du das gemacht hast, kannst du, nachdem du eine Verbindung zum MySQL-Server mit mysql_open hergestellt hast und mit mysql_select_db eine Datenbank ausgewählt hast, die Abfragen mit

    PHP
    mysql_query($variable);

    ausführen. mysql_error() liefert dann genau dann einen Wert, wenn bei der Ausführung der Abfrage ein Fehler aufgetreten ist.

  • habe es mal mit explode versucht, funkt aber irgendwie nicht
    weiss nicht weiter mit dem mysql

    poste mal meinen code, vielleicht gibt wer weitere denkanstösse
    den mysql-teil hab ich mal ausgelassen

    SQL
    INSERT INTO 'tabelle' VALUES("ich", "blah", "datum",...);
    INSERT INTO 'tabelle' VALUES("du", "blap", "datum",...);
    INSERT INTO 'tabelle' VALUES("er", "blop", "datum",...);
    ...



    HTML
    //Formular
    <form action="<?php echo$_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
    Datei: <input name="Datei" type="file"><br>
    <input name="Send" type="submit" value="Speichern">
  • So gehts nicht?

    PHP
    $zeilen=explode("\n",$data);
    for($a=0;$a<count($zeilen);$a++) {
        mysql_query($zeilen[$a]);
    }
    mysql_close();

    Da gibts sicher auch irgendeine foreach-Schleife, da kenn ich aus dem Stegreif aber nicht die genaue Syntax.

    Btw. wieso kopierst du die hochgeladene Datei? Kannst du nicht direkt darauf zugreifen? Außerdem bleibt die hochgeladene Datei übrig - wenn du das öfter machst, wirst du bald ziemlich viel Müll am Server haben.

  • kopiere die hochgeladene datei, wegen schreib und lesen-rechte, beim direkten zugriff hab ich fehlermeldungen bekommen

    hab gedacht mit unlink(temporäre datei) lösche ich eh alles, wie kann ich die übrige hochgeladene datei entfernen?

  • Zitat von KiteRider

    hab gedacht mit unlink(temporäre datei) lösche ich eh alles, wie kann ich die übrige hochgeladene datei entfernen?

    Naja, ich würd mal sagen mit

    PHP
    unlink($_FILES['Datei']['tmp_name']);


    Oder geht das nicht?

  • danke für eure hilfreichen tipps

    PHP
    foreach ($zeilen as $z)
                      {
                         $result = mysql_query($z);
                      }


    so hatt es geklappt

    jetzt muss ich noch schauen, wie es mit dem löschen der hochgeladenen datei ausschaut, weil wenn ich auf aktualisieren der seite gehe, dann wird versucht diesselbe datei in die datenbank einzutragen, natürlich meldet sich mysql_error, dass die datensätze schon vorhanden sind

  • Zitat von rck

    Es schadet nicht, beides zu machen. Aber Whitelists sind im allgemeinen sicherer als Blacklists. Und gerade das Parsen der Eingabe ist eine sehr wichtige Technik beim Bauen von sicheren Webanwendungen.

    Naja beim GRANT werden ja auch Rechte für bestimmte Aktionen vergeben...

    Ja das mit dem Parsen stimmt wohl. Das ist allgemeiner verwendbar.

  • sorry, hab es schlecht formuliert
    habe in meiner sql-datei 5 inserts, als ausgabe mit mysql_affected_rows() bekomm ich 5mal die zahl 1, jetzt möchte ich die summe davon, leider find ich im manual keine sum() funktion

  • Ähm, Addition gibts aber schon, oder?

    PHP
    $sum=0;
    foreach ($zeilen as $z) {
        $result = mysql_query($z);
        $sum+=mysql_affected_rows();
    }
  • danke paulchen für den tipp, aber geht irgend wie nicht

    bei fehlerfreien sqls ist klar, dass keine fehler sind
    aber bei fehlerhaften sqls, krieg ich in summe nur 1 Fehler
    wo liegt da mein denkfehler?
    ich habe in meiner test-datei, 3 delete statements, welche versuchen, datensätze zu löschen, die noch gar nicht existieren - fasst mysql_error() das als 1 Fehler zusammen?

  • Nehmen wir an, wir verwenden eine Datenbank, in der keine Tabellen mit den Bezeichnungen nix1, nix2 und nix3 enthalten sind:

    Dieses Skript liefert bei mir

    Code
    Datensätze geändert.<br />
    3 Fehler gefunden.<br />

    Das, was in $zeilen[0] steht, erzeugt nur einen Fehler, und zwar "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 '; delete from nix1; delete from nix1' at line 1" (MySQL erlaubt nur eine Abfrage pro Aufruf von mysql_query() ); $zeilen[1] und $zeilen[2] liefern jeweils einen Fehler ("Table 'database.nix1' doesn't exist") - macht in Summe drei Fehler

    Ich frag mich also, wo hier das Problem ist. Wie schauen denn konkret die "falschen" Abfragen aus? Wie oft wird mysql_query() tatsächlich ausgeführt und liefert einen Fehler?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!