Beiträge von JR Cologne
-
-
-
-
Freut mich, wenn ich helfen konnte.
-
Hm, ok. Es gibt aber auch kostenlose und werbefreie Anbieter, wie z.B. bplaced.
Nur um das mal zu erwähnen. Naja, wenn du natürlich lieber bei deinem aktuellen Anbieter bleiben möchtest, kann ich das auch verstehen.
-
Musst du für die Aktivierung von PHP auch noch (mehr) Geld bezahlen?
Weil dann würde ich dir dringend zu einem Anbieterwechsel raten.
-
Jep, das kommt aber alles später. Möchte es aktuell noch möglichst unkompliziert halten und habe es deswegen weiterhin per POST gemacht und das scheint auch ganz gut zu funktionieren...
-
Jo, danke. Bin gerade dabei das einzubauen.
-
Nein, das möchte ich ja auch gar nicht. Ich möchte nicht die fehlgeschlagenen Dateien erneut Hochladen, mir geht es darum, die nicht fehlgeschlagenen Dateien rauszupicken (was schon passiert) und dann erneut hochzuladen. Und genau bei diesem zweiten Upload, liegt das Problem.
Denn dafür, dass der User per Button auswählen kann, was mit den Dateien passieren soll (alle, die möglich sind, hochladen oder nur Ausgewählte hochladen) brauche ich einen neuen Request (außer ich nutze JS, aber das kommt nicht in Frage) und danach gibt es die tmp-Dateien natürlich nicht mehr. Das gleiche gilt für den Superglobal $_FILES.
Dieses Problem habe ich dann versucht zu beheben, indem ich die Buttons in ein Formular gepackt und die Dateien versteckt übertragen habe und nach dem Request wieder entgegengenommen habe.
Auch das funktioniert leider nicht, denn move_uploaded_file() gibt false zurück und ich bekomme meine Fehlermeldung, dass der Upload/das Speichern gescheitert ist. Wichtig ist dabei zu erwähnen, dass alle Daten in der Funktion ankommen.
Daher habe ich eben geschlossen, dass das Problem bei den tmp-Dateien liegt, die dann halt nicht mehr vorhanden sind.
Ich könnte also entweder, wie du sagst, ein Verzeichnis anlegen und die Dateien dort zwischenspeichern oder ich erstelle ganz einfach eine neue tmp-Datei, allerdings muss ich die dann vermutlich erstmal mit Daten füllen, damit es funktioniert. Bei diesen beiden Varianten gehen wir auf jeden Fall davon aus, dass es an den tmp-Dateien liegt.
Eine weitere Vermutung von mir wäre, dass der Upload nur funktioniert, wenn der Request über ein File-Upload-Form ausgeführt würde. Keine Ahnung, warum, aber das halte ich für die einzige Alternative zu dem eben genannten. Wie man dem umgehen kann, weiß ich nicht.
So, ich denke, ich werde auf jeden Fall mal deinen Tipp ausprobieren. Und danke dir für deine Hilfe.
Leider ist der Text ein bisschen länger geworden, aber hoffentlich haben wir damit jetzt alle Verständnisprobleme ausgeräumt.
-
HTTP-Request. Die Anfrage des Clients an den Server, also im Prinzip ein Reload der Seite.
-
Ich bin gerade zu faul den nicht kommentierten Code durchzuarbeiten. Was heißt für dich "Wenn Fehler aufgetreten sind"? Fehler beim Upload oder Fehler nach dem Upload.
Beim Upload/Speichern ist ein Fehler aufgetreten, da move_uploaded_file() false zurückgibt.
Das mit dem Code kann ich verstehen. Werde morgen mal ein paar mehr Kommentare hinzufügen...
Ich würde wie folgt vorgehen: [...]
Die Idee hört sich nicht schlecht an, aber ich verstehe nicht ganz, warum das keinen neuen Request benötigt. Denn sobald ich auf einen der Buttons klicke, habe ich dann doch einen neuen Request, oder verstehe ich gerade was falsch?
Bin mir nicht ganz sicher, ob wir auf dem gleichen Nenner sind. Werde das morgen nochmal versuchen zu erklären. Jetzt bin ich zu müde dafür.
-
Guten Abend,
ich habe mal wieder ein Problem mit PHP. Und zwar bin ich gerade dabei ein kleines FTP-Tool zu bauen.
Folgendermaßen ist es aufgebaut:
1. File-Upload-Form wird ausgefüllt und abgesendet
2. Überprüfung und Validierung der Dateien
3. Speicherung der Dateien
4. Wenn Fehler aufgetreten sind, wird eine Übersichtstabelle erstellt inkl. zwei Buttons, um auszuwählen, wie es weitergehen soll. (Alle, die hochladbar sind, hochladen oder Ausgewählte hochladen)
5. Klick auf "Alle hochladen", per Post und hidden-Feld werden hochladbare Dateien übergeben
6. Dateien werden nochmals hochgeladenDas Problem, dass ich habe, befindet sich bei Schritt 6. Nämlich können die Dateien aus irgendeinem Grund nicht hochgeladen werden. Da move_uploaded_file false zurückgibt und alle Parameter richtig sind, liegt es vermutlich daran, dass ja der tmp_file nach dem erneuten Request nicht mehr existiert oder etwas ähnliches.
Ich habe bereits versucht da entgegenzuwirken und nach dem zweiten Request einfach ein neuen tmp_file erstellt, aber irgendwie scheint das auch nicht zu funktionieren.
Wahrscheinlich liegt das Problem also doch woanders. Daran, dass der Superglobal $_FILES leer ist, liegt es ebenfalls nicht, da eine Füllung von diesem, auch kein positives Ergebnis mit sich bringt.
Letztendlich vermute ich jetzt, dass der File-Upload nur gelingen kann, wenn PHP die Daten über das File-Upload-Formular bekommt und nicht über diese Umwege.
Wenn meine Vermutung richtig liegt, würde mich interessieren, ob ich das irgendwie umgehen kann. Falls es das nicht ist, wäre es natürlich super, wenn jemand den eigentlichen Grund weiß.
Bin mit meinem Wissen gerade echt etwas am Limit.
Hier ist der Code:
ftp-tool.php
PHP
Alles anzeigen<?php require_once('config.php'); require_once('functions.php'); if (!empty($_POST['upload-again'])) { if ($_POST['upload-again'] == 'Alle Dateien hochladen') { echo 'Alle Dateien hochladen'; /*echo '<pre>'; print_r($_FILES); echo '</pre>';*/ $userfiles = $_POST['userfiles']; /*foreach ($userfiles as $key => $userfile) { $tmp_files[$key] = tempnam(sys_get_temp_dir(), 'php'); $userfiles[$key]['tmp_name'] = $tmp_files[$key]; } $_FILES = $userfiles; echo '<pre>'; print_r($userfiles); print_r($_FILES); echo '</pre>';*/ $reupload = true; } else { echo 'Ausgewählte Dateien hochladen'; } } if ($_POST['submit-button'] == 'Hochladen' || $reupload) { if (!$reupload) { $userfiles = reorderArray($_FILES['files']); $userfiles[0]['error'] = 4; } $doFilesExist = existFiles($userfiles); if ($doFilesExist && !is_array($doFilesExist)) { // Dateien vorhanden $areFilesUploaded = areFilesUploaded($userfiles); if ($areFilesUploaded && !is_array($areFilesUploaded)) { // Upload erfolgreich foreach ($userfiles as $key => $userfile) { $userfiles[$key]['name'] = cleanFileName($userfiles[$key]['name']); } $uploadedFiles = scandir(DIR); $areFilesAvailable = areFilesAvailable($userfiles, $uploadedFiles); if (!$areFilesAvailable && !is_array($areFilesAvailable)) { // Dateien noch nicht verfügbar $areFilesSaved = uploadFiles($userfiles); if ($areFilesSaved && !is_array($areFilesSaved)) { // Dateien erfolgreich gespeichert $error = '<p><strong>Datei/en wurden erfolgreich hochgeladen!</strong></p>'; $error .= createFileStatusTable($userfiles, $areFilesSaved, 'erfolgreich gespeichert', 'nicht gespeichert'); } else { $initialUserfiles = $userfiles; //print_r($areFilesSaved); if (is_array($areFilesSaved)) { foreach ($areFilesSaved as $key => $value) { if ($value === 'false') { unset($userfiles[$key]); } } } if (empty($userfiles)) { // Speichern komplett gescheitert $error = '<p><strong>Datei/en konnte/n nicht gespeichert werden. Bitte versuchen Sie es noch mal oder <a href="#">kontaktieren Sie den Webmaster</a>, falls Sie es für eine Fehlfunktion halten. Vielen Dank für Ihr Verständnis!</strong></p>'; } else { // (Teilweise) erfolgreich gespeichert $error = createFileStatusTable($initialUserfiles, $areFilesUploaded, 'erfolgreich gespeichert', 'nicht gespeichert'); } } } else { // Dateien bereits verfügbar $initialUserfiles = $userfiles; if ($areFilesAvailable && !is_array($areFilesAvailable)) { for ($i=0; $i < count($initialUserfiles); $i++) { unset($userfiles[$i]); } } if (empty($userfiles)) { // Alle Dateien bereits verfügbar $error = '<p><strong>Alle Dateien sind bereits verfügbar und werden nicht gespeichert.</strong></p>'; } else { // Manche/keine Dateien bereits verfügbar $error = createFileStatusTable($initialUserfiles, $areFilesAvailable, 'bereits verfügbar', 'noch nicht verfügbar'); } } } else { // Fehler beim Hochladen $initialUserfiles = $userfiles; if (is_array($areFilesUploaded)) { foreach ($areFilesUploaded as $key => $value) { if ($value === 'false') { unset($userfiles[$key]); } } } if (empty($userfiles)) { // Hochladen komplett gescheitert $error = '<p><strong>Beim Hochladen ist ein Fehler aufgetreten. Bitte versuchen Sie es noch mal.</strong></p>'; } else { // (Teilweise) erfolgreich hochgeladen $error = createFileStatusTable($initialUserfiles, $areFilesUploaded, 'hochgeladen', 'nicht hochgeladen'); } } } else { // Fehler bei Auswahl der Dateien $initialUserfiles = $userfiles; if (is_array($doFilesExist)) { foreach ($doFilesExist as $key => $value) { if ($value === 'false') { unset($userfiles[$key]); } } } if (empty($userfiles)) { // Keine Dateien vorhanden $error = '<p><strong>Sie haben keine Datei/en ausgewählt. Bitte korrigieren Sie dies.</strong></p>'; } else { // Dateien (teilweise) vorhanden $error = createFileStatusTable($initialUserfiles, $doFilesExist, 'erkannt', 'unerkannt/fehlerhaft'); $upload_again_form = '<form action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '" method="post">'; // Erstellung der input-hidden-Felder für die Userfiles (4 pro Userfile) foreach ($userfiles as $key => $userfile) { foreach ($userfile as $key2 => $value) { $upload_again_form .= '<input type="hidden" name="userfiles[' . $key . '][' . $key2 . ']" value="' . $userfile[$key2] . '">'; } } $upload_again_form .= '<input type="submit" name="upload-again" value="Alle Dateien hochladen"> <input type="submit" name="upload-again" value="Ausgewählte Dateien hochladen"> </form> '; } } } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>FTP-Tool</title> </head> <body> <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post" enctype="multipart/form-data"> <label>Datei/en: <input type="file" name="files[]" multiple="multiple"></label> <input type="submit" name="submit-button" value="Hochladen"> <?php echo $error; ?> </form> <?php echo $upload_again_form; ?> </body> </html>
functions.php
PHP
Alles anzeigen<?php function cleanFileName($filename) { $filename = strtolower($filename); $filename = str_replace('"', "-", $filename); $filename = str_replace("'", "-", $filename); $filename = str_replace("*", "-", $filename); $filename = str_replace("ß", "ss", $filename); $filename = str_replace("ß", "ss", $filename); $filename = str_replace("ä", "ae", $filename); $filename = str_replace("ä", "ae", $filename); $filename = str_replace("ö", "oe", $filename); $filename = str_replace("ö", "oe", $filename); $filename = str_replace("ü", "ue", $filename); $filename = str_replace("ü", "ue", $filename); $filename = str_replace("Ä", "ae", $filename); $filename = str_replace("Ö", "oe", $filename); $filename = str_replace("Ü", "ue", $filename); $filename = htmlentities($filename); $filename = str_replace("&", "und", $filename); $filename = str_replace("+", "und", $filename); $filename = str_replace("(", "-", $filename); $filename = str_replace(")", "-", $filename); $filename = str_replace(" ", "-", $filename); $filename = str_replace("\'", "-", $filename); $filename = str_replace("/", "-", $filename); $filename = str_replace("?", "-", $filename); $filename = str_replace("!", "-", $filename); $filename = str_replace(":", "-", $filename); $filename = str_replace(";", "-", $filename); $filename = str_replace(",", "-", $filename); $filename = str_replace("--", "-", $filename); $filename = filter_var($filename, FILTER_SANITIZE_URL); return($filename); } function reorderArray($array) { foreach ($array as $key => $value) { foreach ($array[$key] as $key2 => $value2) { $reorderedArray[$key2][$key] = $value2; } } return $reorderedArray; } function existFiles($files) { $existingFiles = 0; foreach ($files as $key => $file) { if ($files[$key]['error'] != 4) { $doFilesExist[$key] = true; $existingFiles++; } else { $doFilesExist[$key] = 'false'; } } if ($existingFiles == count($files)) { return true; } else { return $doFilesExist; } } function areFilesUploaded($files) { $uploadedFiles = 0; foreach ($files as $key => $file) { if ($files[$key]['error'] == 0) { $areFilesUploaded[$key] = true; $uploadedFiles++; } else { $areFilesUploaded[$key] = 'false'; } } if ($uploadedFiles == count($files)) { return true; } else { return $areFilesUploaded; } } function areFilesAvailable($files, $uploadedFiles) { $availableFiles = 0; foreach ($files as $key => $file) { if (in_array($files[$key]['name'], $uploadedFiles)) { $areFilesAvailable[$key] = true; $availableFiles++; } else { $areFilesAvailable[$key] = 'false'; } } if ($availableFiles == count($files)) { return true; } else if ($availableFiles > 0) { return $areFilesAvailable; } else { return false; } } function uploadFiles($files) { $savedFiles = 0; foreach ($files as $key => $file) { $areFilesSaved[$key] = move_uploaded_file($files[$key]['tmp_name'], 'uploads/' . $files[$key]['name']); //var_dump($areFilesSaved[$key]); if ($areFilesSaved[$key]) { $areFilesSaved[$key] = true; $savedFiles++; } else { $areFilesSaved[$key] = 'false'; } } if ($savedFiles == count($files)) { return true; } else { return $areFilesSaved; } } function createFileStatusTable($initialFiles, $filestatus, $succesStatus, $unsuccesStatus) { $table = '<table> <tr> <th>Hochladen?</th> <th>Datei</th> <th>Status</th> </tr> '; for ($i=0; $i < count($initialFiles); $i++) { $table .= '<tr> <td><input type="checkbox" value="' . $i . '"></td> <td>' . $initialFiles[$i]['name'] . '</td> '; if ($filestatus[$i] == 1 || $filestatus == 1) { $table .= '<td>' . $succesStatus . '</td>'; } else { $table .= '<td>' . $unsuccesStatus . '</td>'; } $table .= '</tr>'; } $table .= '</table>'; return $table; } ?>
Schon mal danke im Voraus.
Gruß
JR Cologne -
Das machst du mit CSS. HTML ist nur für die Beschreibung/Auszeichnung der Elemente der Seite da.
Mit CSS stylst du dann deine Seite und positionierst die Elemente.
Um ein Bild neben dem Text auszurichten, bieten sich Floats an.
Ein kleines Beispiel findest du hier: http://codepen.io/devtips/pen/gbVXMP
-
Das Dritte kannst du auswählen, wenn du möchtest, dass der Editor auf dem Desktop verlinkt wird und du ihn darüber ganz leicht öffnen kannst. Den Rest braucht man eigentlich nicht.
-
Keine Panik. Kannst den Code ruhig zeigen. Jeder fängt mal klein an.
Allerdings würde ich dir wirklich raten, erstmal die Grundlagen von HTML und CSS zu lernen, wenn das heute dein erster Tag ist.
-
Könntest du uns deine bisherigen Versuche zeigen? Also den Code und eventuell einen Link zur Seite bzw. ein Screenshot.
Das mit den abwechselnden Hintergrundfarben der Zeilen, kannst du mit dem CSS3-Selektor nth-child(odd) bzw. nth-child(even) lösen.
-
Richtig, für den Versand von Mails braucht man PHP.
Um genau zu sein, die PHP mail()-Funktion.
-
-
Ok, gut. Das heißt es funktioniert, denke ich mal.
-
Hast du Xampp danach mal neugestartet?