kostenloser Webspace werbefrei: lima-city


MySQL Problem mit load data

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Hallo,

    ich habe gerade von der MySQL-Funktion "LOAD DATA INFILE" erfahren und wollte diese nutzen, weil sie genau den Zweck erfüllt (Laden einer Textdatei in die Datenbank), deutlich schneller ist und durchaus täglich aufgerufen werden kann.

    Das Problem ist allerdings, dass ich das ganze nicht so ganz zum Laufen bekomme.
    Ich nutze diesen Code (beachtet bitte auch die Kommentare):
    <?php
    require('mysql_login.php'); //Aufruf von mysql_connect() und mysql_select_db(), das funktioniert einwandfrei!
    echo mysql_num_rows(mysql_query("SELECT * FROM players_test"))." deleted<br>"; //Anzahl der aktuellen Daten anzeigen
    mysql_query("TRUNCATE players_test"); //alte Daten aus der Datenbank löschen
    mysql_query("LOAD DATA INFILE '".$_SERVER['DOCUMENT_ROOT']."/admin/players.txt' INTO TABLE players_test (name, id)"); // <-----
    echo mysql_error(); //Error ausgeben, Ausgabe: Access denied for user 'USER######'@'%' (using password: YES)
    echo "LOAD DATA INFILE '".$_SERVER['DOCUMENT_ROOT']."/admin/players.txt' INTO TABLE players_test (name, id)"; //genauen Befehl ausgeben, Ausgabe: LOAD DATA INFILE '/home/webpages/lima-city/saplayer/html/admin/players.txt' INTO TABLE players_test (name, id)
    ?>


    Der Pfad stimmt, sofern diese Art von absolutem Pfad angegeben werden muss.
    Auch die Tabelle mit den Spalten (id und name) ist vorhanden, der MySQL-Login funktioniert.
    Wieso funktioniert der Code trotzdem nicht?

    PS: Das "Access denied" kommt wirklich nur, wenn ich mysql_error() nach dem LOAD DATA-Befehl ausgeben lasse, eine Zeile davor wird kein Fehler ausgegeben.

    Ich hoffe, ihr könnt mir helfen...
    SAPlayer

    Beitrag zuletzt geändert: 11.6.2013 14:51:26 von saplayer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. mögliche ursachen:

    dein admin verzeichniss gestattet kein zugriff auf die datei "players.txt" durch externe
    in dem fall würde ja der "mysqld" auf deinen webspace zugreifen wollen, und da dieser auf ner db kiste liegt ( wovon ich ausgehe)
    kann es dort zum ersten fehler kommen

    mach mal ein

    chmod 777 verzeichnis


    das ist definitiv keine dauerlösung, denn so kann jeder lesen , schreiben , ausführen !
    sollete das nicht gehen, alternativ fread

    http://php.about.com/od/advancedphp/ss/php_read_file_2.htm


    die frage ist , den inhalt oder die ganze datei ?

    Datei upload:
    http://php.about.com/od/phpbasics/ss/mysql_files_4.htm


    Beitrag zuletzt geändert: 11.6.2013 22:51:15 von n0tiert
  4. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    1. Ich habe die .htaccess auch mal testweise rausgenommen, auch das hat nichts geholfen (obwohl ich dachte, dass diese bei serverseitigem Zugriff sowieso ignoriert wird, aber naja). Ich kann das aber morgen nochmal probieren.

    2. Eigentlich sollte eine einfache Lese-Berechtigung doch reichen, oder? Und ansonsten, wie kann ich chmod auf lima ausführen?

    3. fread bzw. file_get_contents und eine foreach-Schleife habe ich vorher schon benutzt, ich wollte aber auf LOAD DATA umsteigen, da dies viel schneller und performanter gehen soll.

    4. Der Inhalt soll sozusagen geparst und dann Spalte für Spalte, Zeile für Zeile in die Tabelle geschrieben werden. Eigentlich sollte das ja LOAD DATA machen, aber das funktioniert ja leider nicht so ganz...
  5. saplayer schrieb:
    ... Und ansonsten, wie kann ich chmod auf lima ausführen? ...
    via ftp.

    aber ich sehe da kein problem, dass du es auf deinem entwicklungsrechner ausführst. von der commandozeile gibst du ein
    $ mysql -h mysql.lima-city.de -u USER###### -p
    und enter. dann must du dein mysql passwd eingeben und anschließend führst vom mysql-prompt dein befehl aus
    mysql> LOAD DATA INFILE '/<abspath/to>/admin/players.txt'
      INTO TABLE players_test (name, id);
    auf deinem rechner wird es wohl kein problem sein die rechte zu haben ;)

    Beitrag zuletzt geändert: 12.6.2013 2:47:03 von czibere
  6. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Hmm, das ist natürlich auch eine gute Idee ;)
    Als Entwicklungsserver wird XAMPP reichen, oder?
    Dann ist nur die Frage, wie ich da die (Linux/Apache) Kommandozeile öffnen kann (ich denke nicht, dass es auch mit der normalen cmd geht, oder?)
  7. was ich auch vermisse in deiner query ist u.a

    Angabe des trennzeichen ","
    ESCAPED BY '...'

    die datei ist ja im eigentlichen sinne eine CSV Datei mit spalten und Trennzeichen

    "test","test2","test3"


    $result = mysql_query("LOAD DATA INFILE '$FileName' INTO TABLE 'players_test' FIELDS TERMINATED BY ',' ENCLOSED BY ' ' ESCAPED BY '\\' LINES TERMINATED BY '\\n'(name, id)")or die ('Error: '.mysql_error ());
            while ($row = mysql_fetch_array($result)) {
            }
            $num_rows = mysql_num_rows($result);
            echo $num_rows;



    Auszug aus dem Mysql manual

    ".....Der Backslash wird bei MySQL als Escape-Zeichen in Strings verwendet. Insofern müssen Sie, um FIELDS ESCAPED BY '\\' zu schreiben, zwei Backslashes angeben, damit der Wert als ein Backslash interpretiert wird.

    Hinweis: Wenn Sie die Textdatei auf einem Windows-System erzeugt haben, müssen Sie unter Umständen LINES TERMINATED BY '\r\n' verwenden, um die Datei korrekt einzulesen, weil Windows-Programme normalerweise zwei Zeichen als Zeilenendzeichen verwenden. Einige Programme wie WordPad verwenden beim Schreiben von Dateien unter Umständen sogar \r als Zeilenendzeichen. Um solche Dateien zu lesen, verwenden Sie LINES TERMINATED BY '\r'. ..."

    http://dev.mysql.com/doc/refman/5.1/de/load-data.html


    EDIT:
    aaaahhhhhh vergesst doch mal diesen Windows XAMPP, LAMPP und wie sie sich alle nennen mist,
    ihr schafft euch immer selbst probs mit encoding & co
    installiert euch ein ubuntu
    oder vorzugsweise inne VM ( https://www.virtualbox.org/ ) unter windows so umgeht ihr auch ggf. Treiber probs, weil der VM sind Treiber latte das ist doch eure zukünftige Ziel Umgebung -> Linux
    nachdem ihr es installiert,sauber conf´d habt, cloned ihr es und so könnt ihr die primäre Instanz immer Wegschmeißen sobald sie nicht mehr funzt, verzeckt ist.

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install mysql-server libapache2-mod-php5 libapache2-mod-auth-mysql php5-mysql phpmyadmin ........


    https://help.ubuntu.com/community/ApacheMySQLPHP

    in der zeit wo ihr die lampp,xampp.... anfangt zu conf´n oder nach probs sucht habt ihr euch ein vernünftiges Test Enviroment geschaffen

    Beitrag zuletzt geändert: 12.6.2013 7:38:45 von n0tiert
  8. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Ich habe jetzt ein wenig weiter rumprobiert und jetzt nach der Fehlermeldung, die mysql_error() ausgibt, gesucht. Gefunden hab ich das:
    Wenn Sie eine Verbindung mit dem MySQL-Server herstellen können, aber immer dann eine Fehlermeldung Access denied erhalten, wenn Sie eine SELECT ... INTO OUTFILE- oder LOAD DATA INFILE-Anweisung absetzen, ist für Ihren Eintrag in der Tabelle user die Berechtigung FILE nicht aktiviert.

    Quelle: http://dev.mysql.com/doc/refman/5.1/de/access-denied.html (recht weit unten).

    Sieht also so aus, als ob der Befehl von Lima aus deaktiviert wurde.

    Wäre schön, wenn sich ein Knight dazu äußern könnte.
  9. saplayer schrieb:
    Hmm, das ist natürlich auch eine gute Idee ;)
    Als Entwicklungsserver wird XAMPP reichen, oder?
    Dann ist nur die Frage, wie ich da die (Linux/Apache) Kommandozeile öffnen kann (ich denke nicht, dass es auch mit der normalen cmd geht, oder?)
    cmd reicht volkommen und du musst dort nur eingeben was wir vorhin gehabt haben.
    der absolute path sollte allerdings in etwa so aussehen:
    'C:\<abspath\to>\admin\players.txt'
    (wobei 'C:\...' kann ich ja nicht genau wissen ;)
  10. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Okay, ich habe es jetzt mit einem selbstgeschriebenem Programm hinbekommen (Autohotkey), das funktioniert nun einwandfrei. Danke für eure Hilfe.
  11. saplayer schrieb:
    Okay, ich habe es jetzt mit einem selbstgeschriebenem Programm hinbekommen (Autohotkey), das funktioniert nun einwandfrei. Danke für eure Hilfe.


    Schön das Du nun eine Lösung gefunden hast, es wäre nett, wenn du sie präsentieren würdest, den andere Forum Leser stoßen ggf.
    auch auf dieses Problem oder suchen die entsprechende Lösung. :wink:
  12. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Naja gut, auch wenn ich nicht gerade denke, dass hier welche AHK (Autohotkey) dafür nutzen wollen, werde ich das trotzdem mal machen.
    Ich habe dazu diese AHK-Lib verwendet: http://www.autohotkey.com/board/topic/72629-mysql-library-functions/

    Dann braucht man nur noch einen recht simplen Code:
    mysql := new mysql
    	db := mysql.connect("mysql.lima-city.de", "USER######", "Passwort", "Datenbank") ;Verbindungsversuch
    	if(mysql.error)
    		MsgBox, Fehler beim Verbindungsversuch
    	result1 := count(mysql.query(db, "SELECT * FROM users")) " deleted" ;Anzahl der aktuellen Elemente ermitteln
    	mysql.query(db, "TRUNCATE users") ;Tabelle leeren
    	StringReplace, file2, file, \, /, All ;Dateiname formatieren (die Variable file muss also den absoluten Pfad zur Datei enthalten)
    	mysql.query(db, "LOAD DATA LOCAL INFILE '" file2 "' INTO TABLE users FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' (name, id)") ;Hauptcode, Datei wird hochgeladen (temporär) und dann importiert
    	result1 .= "`n" count(mysql.query(db, "SELECT * FROM users")) " added" ;ermitteln der Einträge, die jetzt drin sind
    	MsgBox, % result1 ;Ausgeben der Einträge (z.B. zur Fehlerermittlung)
    
    
    count(var, Delim="`n"){
    	count := 0
    	loop, Parse, var, %Delim%
    		count := A_Index
    	return count
    }


    Beitrag zuletzt geändert: 13.6.2013 22:26:49 von saplayer
  13. in deinem request ging es ja um:

    "LOAD DATA LOCAL INFILE"

    und wenn ich mir nun deine zeile ansehe:

    mysql.query(db, "LOAD DATA LOCAL INFILE '" file2 "' INTO TABLE users FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' (name, id)")
    ;

    ist da ne menge hinzugekommen trennzeichen "tab", windows basierter zeilenumbruch

    und das hat ja wirklich nix mit der AHK am hut :thumb:

    manchmal hilft auch den source file mit dummy daten abzubilden
    ggf. hätte es ne fgetcsv + db insert auch getan aber gut

    Beitrag zuletzt geändert: 13.6.2013 23:00:03 von n0tiert
  14. Autor dieses Themas

    saplayer

    saplayer hat kostenlosen Webspace.

    Genau diesen Code habe ich, mit und ohne LOCAL, auch in PHP (und ja, auch mit \\) getestet - es funktioniert nicht (LOCAL ist in PHP schonmal ganz deaktiviert).

    Beitrag zuletzt geändert: 14.6.2013 6:11:07 von saplayer
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!