MySQL Problem mit load data
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgeben
befehl
code
datei
datenbank
fehler
file
frage
http
inhalt
nutzen
problem
programm
server
tabelle
treiber
url
verwenden
windows
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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... -
saplayer schrieb:
via ftp.
... Und ansonsten, wie kann ich chmod auf lima ausführen? ...
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 ausmysql> 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 -
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?) -
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 -
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. -
saplayer schrieb:
cmd reicht volkommen und du musst dort nur eingeben was wir vorhin gehabt haben.
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?)
der absolute path sollte allerdings in etwa so aussehen:'C:\<abspath\to>\admin\players.txt'
(wobei 'C:\...' kann ich ja nicht genau wissen ;) -
Okay, ich habe es jetzt mit einem selbstgeschriebenem Programm hinbekommen (Autohotkey), das funktioniert nun einwandfrei. Danke für eure Hilfe.
-
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. -
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 -
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
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage