Hi!
Du kannst übrigens auch gleich $_FILES['userfile']['tmp_name'] als ersten Parameter übergeben, ohne noch eine weitere Variable anzulegen.
Auch das habe ich ohne Erfolg versucht.
Du hast auch immer schön mit var_dump() nachgeschaut, dass in den verwendeten Variablen das drin ist, was drin sein soll? Bei verzweigten Programmen (sprich: if-else) ist es auch sinnvoll, sich davon zu überzeugen, dass der richtige Pfad gewählt wurde. Das geht einfach mit einem kleinen echo 'bin im if'; oder echo 'bin bei else';, falls das nicht sowieso schon durch signifikante Ausgabe-Anweisungen klar ist, wie die Abarbeitung den Code entlangläuft.
Weiterhin ist es immer richtig, von den verwendeten Funktionen den Rückgabewert auszuwerten. Sehr oft gibt der bekannt, ob die Ausführung fehlerfrei war oder nicht. Dazu muss man im Handbuch nachlesen, was für ein Ergebnis im Gut- und was im Fehlerfall kommt. Eigentlich müsste das nicht nur eine Kontrollausgabe fürs Debugging werden, sondern der ganze Programmfluss ist ideal so gestaltet, dass auf beide Fälle angemessen reagiert wird. Die einfachste und anwenderunfreundlichste Reaktion ist ein "or die('meldung');". Der Patient hat zwar nur mal gehustet, wurde aber trotzdem erschossen. Besser ist, bei Funktionen, die false im Fehlerfall und im Gutfall etwas das zu true evaluiert zurückgeben, kann man das so lösen:
if (move_uploaded_file(...)) {
// tun, was zu tun ist, wenn erfolgreich
} else {
// Reaktion im Fehlerfall
}
Und ja, durch eine solche Fehlerbehandlung wird der Code teilweise um ein Vielfaches länger als reiner Geradeaus-Code, dafür aber auch um ein Vielfaches robuster.
Es geht nicht um die Verbindung zum MySQL-Server sondern um den Zusammenbau des SQL-Statements (INSERT INTO ...).
Das sieht jetzt so aus:
if(mysql_query("INSERT INTO artikel (dateiName,artikelName,preis,dir,mime,speicherdatum,unix_time) VALUES ('" . mysql_real_escape_string($userfile_name) . "', '" . mysql_real_escape_string($artikelName) . "', '" . mysql_real_escape_string($preis) . "', '" . mysql_real_escape_string($subdir) . "', '" . mysql_real_escape_string($userfile_type) . "', '" . mysql_real_escape_string($speicherdatum) . "', '" . mysql_real_escape_string($unix_time) . "')")) {...}
Schon besser. Noch eine Runde übersichtlicher, finde ich, wird es, wenn du die Funktion sprintf() verwendest - siehe zweites Beispiel. Der INSERT-INTO-String kann dann in einem Rutsch notiert werden, ohne dass er immer wegen der Funktionsaufrufe unterbrochen und zusammengefügt werden muss.
Lo!