1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

einlesen von sql-file

  • KiteRider
  • 25. Juni 2006 um 11:22
  • Unerledigt
  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 25. Juni 2006 um 11:22
    • #1

    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

  • Paulchen
    1
    Paulchen
    Gast
    • 25. Juni 2006 um 11:45
    • #2

    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

    • Informationen über den Dateiupload ausliest (http://at.php.net/manual/en/feat…upload.post-met),
    • die hochgeladene Datei mit fopen, fread und fclose ausliest (siehe http://at.php.net/manual/en/ref.filesystem.php) und mit unlink wieder entfernst und
    • dann eine Datenbankverbindung öffnest (mysql_open, mysql_select_db), Zeile für Zeile die Statements aus der Datei mit mysql_query ausführst (mysql_error sagt dir, ob dabei ein Fehler aufgetreten ist, mysql_affected_rows sagt dir, wie viele Datenbankzeilen verändert wurden), siehe http://at.php.net/manual/en/ref.mysql.php; schließen solltest du die Datenbankverbindung dann auch wieder mit mysql_close.
  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 26. Juni 2006 um 15:16
    • #3
    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.

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • psycho
    6
    psycho
    Mitglied
    Reaktionen
    1
    Punkte
    296
    Beiträge
    57
    • 28. Juni 2006 um 01:21
    • #4
    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?

  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 28. Juni 2006 um 01:25
    • #5

    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.

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 5. Juli 2006 um 12:15
    • #6
    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

    • Informationen über den Dateiupload ausliest (http://at.php.net/manual/en/feat…upload.post-met),
    • die hochgeladene Datei mit fopen, fread und fclose ausliest (siehe http://at.php.net/manual/en/ref.filesystem.php) und mit unlink wieder entfernst und
    • dann eine Datenbankverbindung öffnest (mysql_open, mysql_select_db), Zeile für Zeile die Statements aus der Datei mit mysql_query ausführst (mysql_error sagt dir, ob dabei ein Fehler aufgetreten ist, mysql_affected_rows sagt dir, wie viele Datenbankzeilen verändert wurden), siehe http://at.php.net/manual/en/ref.mysql.php; schließen solltest du die Datenbankverbindung dann auch wieder mit mysql_close.



    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

  • Paulchen
    1
    Paulchen
    Gast
    • 5. Juli 2006 um 12:52
    • #7

    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.

  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 6. Juli 2006 um 14:31
    • #8

    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",...);
    ...



    PHP
    <?php
    $CONST_server = "localhost"; //Datenbank-Server
    $CONST_DB_user = "root"; //Datenbank-Benutzer
    $CONST_DB_pwd = ""; //DB-Passwort
    $CONST_DB_name = "v094562";//DB-Name
    if($_POST['Send'])
    {
    $link = mysql_connect($CONST_server,$CONST_DB_user,$CONST_DB_pwd) or die("Could not connect: " . mysql_error());
    //echo "Connected successfully";
    mysql_select_db($CONST_DB_name, $link) or die ('Could not select database');
     
    // Temporäre Datei schreiben 
    move_uploaded_file($_FILES['Datei']['tmp_name'], "./tempfile.tmp");
    chmod("./tempfile.tmp", 0644);
    // Daten aus Temp-Datei einlesen
    $zeiger = fopen("./tempfile.tmp", "rb");
    $size = $_FILES['Datei']['size'];
    // den Dateiinhalt in $data speichern
    $data = fread($zeiger, $size);
     
    fclose($zeiger);
     
    // Temporäre Datei löschen
    unlink("./tempfile.tmp");
    }
    echo $data; //Testausgabe
    ?>
    Alles anzeigen
    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">
  • Paulchen
    1
    Paulchen
    Gast
    • 6. Juli 2006 um 14:46
    • #9

    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.

  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 6. Juli 2006 um 15:48
    • #10

    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?

  • Paulchen
    1
    Paulchen
    Gast
    • 6. Juli 2006 um 16:08
    • #11
    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?

  • duracell
    5
    duracell
    Mitglied
    Punkte
    220
    Beiträge
    40
    • 9. Juli 2006 um 13:45
    • #12

    ad foreach:

    Code
    foreach ($z in $zeilen)
    {
       mysql_query($z);
    }
  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 10. Juli 2006 um 17:04
    • #13

    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

  • psycho
    6
    psycho
    Mitglied
    Reaktionen
    1
    Punkte
    296
    Beiträge
    57
    • 10. Juli 2006 um 17:14
    • #14
    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.

  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 12. Juli 2006 um 13:29
    • #15

    wie bekomme ich die summe der affected_rows?
    leider gibt es keine SUM() funktion in php

  • Paulchen
    1
    Paulchen
    Gast
    • 12. Juli 2006 um 13:32
    • #16

    Vielleicht damit?

    PHP
    mysql_affected_rows();
  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 12. Juli 2006 um 13:59
    • #17

    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

  • Paulchen
    1
    Paulchen
    Gast
    • 12. Juli 2006 um 14:07
    • #18

    Ähm, Addition gibts aber schon, oder?

    PHP
    $sum=0;
    foreach ($zeilen as $z) {
        $result = mysql_query($z);
        $sum+=mysql_affected_rows();
    }
  • KiteRider
    13
    KiteRider
    Mitglied
    Punkte
    1.655
    Beiträge
    268
    • 17. Juli 2006 um 11:54
    • #19

    danke paulchen für den tipp, aber geht irgend wie nicht

    PHP
    foreach ($zeilen as $z)
    {
        $result = mysql_query($z);
    
    
        if (!$result) {
        //echo('Ungültige Abfrage: ' . mysql_error())."<br />\n";
    
           $err++;
    
    
           } else{
    
    
    
             $sum++;
    
    
           }
    
    
    }
        echo $sum . " Datensätze geändert.<br />\n";
        echo $err . " Fehler gefunden.<br />\n";
    Alles anzeigen

    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?

  • Paulchen
    1
    Paulchen
    Gast
    • 17. Juli 2006 um 12:15
    • #20

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

    PHP
    unset($zeilen); // if anything is saved in $zeilen
    $zeilen[0]="delete from nix1; delete from nix1; delete from nix1;";
    $zeilen[1]="delete from nix2;";
    $zeilen[2]="delete from nix3;";
    foreach ($zeilen as $z)
    {
        $result = mysql_query($z);
    
    
        if (!$result) {
        //echo('Ungltige Abfrage: ' . mysql_error())."<br />\n";
    
    
           $err++;
    
    
           } else{
    
    
    
    
             $sum++;
    
    
    
    
           }
    
    
    }
        echo $sum . " Datensaetze geaendert.<br />\n";
        echo $err . " Fehler gefunden.<br />\n";
    Alles anzeigen

    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?

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung