Absoluten, lokalen Pfad auslesen

exxe

Mitleser
Hallo Community, ich hätte da gern mal ein kleines Problem:

Ich würde gerne ein csv-Datei in eine MySQL-Datenbank einlesen.
Das funktioniert theoretisch mit

PHP:
$sql = "LOAD DATA LOCAL INFILE '".$db_file."' INTO TABLE ".$db_table." FIELDS TERMINATED BY '".$db_terminated."'";

auch wunderbar, wobei $db_file eine absolute Pfadangabe (c:/upload/test.csv) enthällt.

Nun habe ich aber das Problem, dass das Script auf verschiedenen Rechnern ausgeführt werden soll und die test.csv immer in einem anderen Verzeichniss liegen kann.
Jedesmal händisch den Pfad in ein Inputfeld eintragen ist nicht das Gelbe vom Ei, vor allem da auch Personen damit arbeiten sollen, die gerade mal wissen, wie sie den Browser starten.

Nun habe ich versucht mit

PHP:
<form name='input' method='post' action='".$PHP_SELF."'>";
<input class='textbox' type='file'>
</form>

eben diesen Pfad auszulesen. Allerdings gibt er mir da (wie ich inzwischen herausgefunden habe) aus sicherheitstechnischen Gründen nur den Dateinamen zurück.

Die Datei erst auf den Server hochladen und dann einlesen funktioniert laut MySQL-Handbuch leider auch nicht, da ich ja keinen Zugriff auf das Datenbankverzeichniss habe.

Note that, in the non-LOCAL case, these rules mean that a file named as ./myfile.txt is read from
the server's data directory, whereas the file named as myfile.txt is read from the database
directory of the default database.


Die große Frage ist nun, woher bekomme ich den lokalen, absoluten Pfad zur Datei? Ist das überhaupt nöglich?
 
Hi,

ich würde in deinem Fall wie folgt vorgehen, einfach um großen Unmuß zu verhindern:

"Uploadformular":
HTML:
<form enctype="multipart/form-data" action="index.php" method="POST">
CSV Datei angeben: <input id="csvfile" name="csvfile" type="file" /><br />
<input type="submit" value="Upload" onclick="javascript:doAjaxScript();" />
</form>

Und nun ein AJAX-Script bauen, welches die Datei saveToSQL.php aufruft und als Paramter den Inhalt des INPUT-Feldes übergeben.

Code:
function doAjaxScript() {
	var csvfile = document.getElementById('csvfile');

	try {
		req = new XMLHttpRequest();
	} catch (e) {
		try {
			req = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){
			try {
				req = new ActiveXObject('Microsoft.XMLHTTP');
			} 
			catch (failed){
				req = null;
			}
		}  
	}

	req.open('POST', './path/to/saveToSQL.php', 'true');

	req.onreadystatechange = function() {            
		switch(req.readyState) {
			case 4:
				if(req.status!=200) {
					alert("Fehler!");
				} else {
					alert("Datei wurde erfolgreich geschrieben!");
				}
				break;
			default:
				return false;
				break;     
		}
	}

	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.send('csvfile=' + csvfile.value);
}

In der saveToSQL.php kannst du nun mit $_POST['csvfile'] den Pfad der Datei einlesen...

Hoffe du verstehst, wie ich vorgehen würde.
 
Moin,

Die Datei erst auf den Server hochladen und dann einlesen funktioniert laut MySQL-Handbuch leider auch nicht, da ich ja keinen Zugriff auf das Datenbankverzeichniss habe.

Diesen(Zugriff auf das Datenbankverzeichniss) benötigst du ja auch nicht.
Wenn du LOCAL nutzt, dann reicht ein Verzeichnis aus, auf das du per PHP Zugriff hast, bspw. das Upload-Verzeichnis...den Pfad musst du dann vom Standort des PHP-Skriptes aus gesehen angeben.
PHP liest dann intern die Datei aus und reicht sie an MySQL weiter.

Die Variante von Manuel geht auch in einigen Browsern, aber da dir das Auslesen des Wertes eines File-Inputs per Javascript je nach Browser unterschiedliche Ergebnisse liefern wird, ist es nicht unbedingt optimal.

Der "echte" Upload dürfte verkraftbar sein, da ja Clientrechner & Serverrechner identisch sind, wenn ich dich recht verstanden habe.

Wobei ich mich momentan frage, wie Leute, "die gerade mal wissen, wie sie den Browser starten.", zu einem HTTP/MySQL-Server kommen :suspekt: ...dir ist schon klar, dass wenn im MySQL-Handbuch etwas von client program oder client host steht, mit client program dein PHP-Skript und mit client host der Webserver gemeint ist,auf dem das PHP-Skript läuft,.... und nicht etwa Browser&PC des Benutzers(nur um Missverständnissen vorzubeugen :-( )
 
...dir ist schon klar, dass wenn im MySQL-Handbuch etwas von client program oder client host steht, mit client program dein PHP-Skript und mit client host der Webserver gemeint ist,auf dem das PHP-Skript läuft,.... und nicht etwa Browser&PC des Benutzers(nur um Missverständnissen vorzubeugen :-( )

Ok, das hab ich jetzt soweit verstanden.

Wenn du LOCAL nutzt, dann reicht ein Verzeichnis aus, auf das du per PHP Zugriff hast, bspw. das Upload-Verzeichnis...den Pfad musst du dann vom Standort des PHP-Skriptes aus gesehen angeben.

Nun habe ich aber das Problem, dass, obwohl die upload.php und die test.csv in dem selben Verzeichniss auf dem Server liegen, nur die Meldung "File 'test.csv' not found (Errcode: 2)" erscheint.
Hier nochmal der Code mit dem ich es versucht habe:

PHP:
$sql = "LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE ".$db_table." FIELDS TERMINATED BY '".$db_terminated."'";

Wobei ich mich momentan frage, wie Leute, "die gerade mal wissen, wie sie den Browser starten.", zu einem HTTP/MySQL-Server kommen :suspekt:
Das ist ja nicht denen ihr Server.
Die Leute sollen auch nur ihre Daten in Excel speichern/aktualisieren und per Formular in die DB eintragen und nicht den Server warten ;)
 
Ja ist klar. Wenn das MySQL-Statement einen absoluten Pfad verlangt kann das so auch nicht funktionieren.
Wenn die "test.csv" im gleichen Verzeichnis liegt würde ich folgendes machen:

PHP:
$sql = "LOAD DATA LOCAL INFILE '".dirname(__FILE__)."/test.csv' INTO TABLE ".$db_table." FIELDS TERMINATED BY '".$db_terminated."'";

Sollte die "test.csv" in einem Unterverzeichnis liegen, so müsstest du immer nur von
PHP:
dirname(__FILE__)
relativ weiter gehen.
 
Ich glaub ihr versteht ihn alle nicht! Also ich verstehe ihn so:
Er möchte ne Seite basteln, mit einem Auswahlfeld, wo der User seine Datei auf der eigenen Festplatte sucht. (durchsuchen)
Danach soll der User auf einen button klicken und die DB ist schick.


PHP:
<form action="/submit.php" method="post"
      enctype="multipart/form-data">
<input type="file" name="csv" />
<input type="submit" value="los" />
</form>
 
Zuletzt bearbeitet:
Ja ok, aber wo ist das Problem?
Ich hab ihm den Code für ein Upload-Formular geliefert. Dann soll er den AJAX-Teil weg lassen und die Datei in einen Ordner "uploads" hochladen lassen und diese Datei dann ausführen.

Das im WEB eine Datei vom lokalen Filesystem genommen wird funktioniert nur im IE und stellt eher eine Sicherheitslücke als ein Feature dar.
 
Oh sorry hatte ich überflogen :eek:
Ja aber geht es wirklich das ich meine Verzeichnis habe? PHP ist serverseitig, angenommen ich wähle den Pfad:

C.\Programm\test\meineDatei.csv

dann sucht PHP doch auf dem Server unter C! Deshalb muss die Datei erst auf den Server geladen werden und kann dann verwendet werden, danach wird die Datei wieder gelöscht, so ist es doch richtig oder?
 
Hallo ihr,

erst mal danke für eure Hilfe.

Zum Verständniss: In erster Linie ging es darum, das absolute Verzeichniss einer lokalen Festplatte zu erfassen, von der eine Datei kommt.
Da das Sicherheitstechnisch nicht funktioniert bin ich von diesem vorhaben abgekommen und lade nun - wie von Sven Mintel vorgeschlagen - die Datei erst auf den Server und lasse sie dort "verarbeiten"



Wenn die "test.csv" im gleichen Verzeichnis liegt würde ich folgendes machen:

PHP:
$sql = "LOAD DATA LOCAL INFILE '".dirname(__FILE__)."/test.csv' INTO TABLE ".$db_table." FIELDS TERMINATED BY '".$db_terminated."'";

Sollte eigentlich funktionieren - tuts aber leider nicht.
Lasse ich mir "dirname(__FILE__)" ausgeben, erhalte ich "C:\Server\xampp\htdocs\upload" (was auch korrekt ist).
Wenn ich nun aber dein oben genanntes Beispiel umsetze, erhalte ich nur die Fehlermeldung "File 'C:Serverxampphtdocsupload\test.csv' not found (Errcode: 2)".

Wie du siehst, entfernt er alle Backslash's die in dirname(__FILE__) enthalten sind.

Gibt es da noch einen Trick den ich nicht kenne / beachtet habe?
 
Zurück