php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.11.2005, 10:11  
Gast
 
Beiträge: n/a
Standard [Erledigt] Seite aktualisieren

Hallo zusammen!

Ich hab ein Script zum Bilder-hochladen.
Das ganze funktioniert auch so wie es soll (hochladen, löschen, ...)

Es gibt aber noch eine Situation, in der das Script noch nicht das tut was es soll: beim aktualisieren der Seite.

Hintergrundinfo:
Wenn man ein Bild hochlädt, und dann auf aktualisieren klickt, dann wird das Bild nochmal hochgeladen. Normal würde es einfach das vorherige ersetzen, da es ja den gleichen Namen hat, aber das hab ich verhindert, damit man nicht aus versehen ein Bild überschreibt.
zB. das Bild heißt Katze, der Name ist nicht sehr aussagekräftig und kann oft vorkommen, deshalb heißt das erste Bild Katze, das zweite Katze_00, das dritte Katze_01 usw.

Problem:
Der User lädt ein Bild hoch (nennen wir es einfach wieder Katze). Dabei wird das Bild hochgeladen und in einen bestimmten Ordner gelegt. In einer MySQL-Datenbank gibt es dann ein Feld namends Bild in der der Pfad abgespeichert wird (Pfad/Katze.jpg).

Der User klickt jetzt (aus welchem Grund auch immer) auf aktualisieren.
Jetzt wird das Bild nochmal hochgeladen. Katze existiert bereits, also wird die Datei umbenannt (Katze_00) und in den Ordner für die Bilder gesteckt.
Das Feld Bild in der MySQL-Datenbank wird aktualisiert und es steht nun der neue Pfad drin (Pfad/Katze_00.jpg).

Nun wird zwar das korrekte Bild angezeigt, weil es ja identisch ist, aber es existiert jetzt ein nutzlosen Bild Katze.jpg das keiner mehr braucht.

Wenn der User jetzt nochmal auf aktualisieren klicken würde, dann würde das ganze nochmal passieren und dabei die Zahl immer um eins erhöht (Katze_01, Katze_02, ... )

Somit kann man durch diesen "Fehler" x Bilder hochladen, auch wenn man nur 1 davon auch wirklich nutzen kann. Es kann so also sehr viel Datenmüll entstehen.

Ich bräuchte also etwas, das prüft, ob die Seite aktualisiert worden ist oder nicht, damit, wenn sie aktualisiert worden ist, das Bild NICHT MEHR hochgeladen wird.

Frage: Gibt es sowas schon?
Wenn nicht: Wie kann man sowas realisieren?

Vielen Dank im Vorraus für jede Antwort!
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.11.2005, 10:15  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

du könntest eine variable vorher setzen: $check = 0
beim abschicken (aktualisieren) des formulars fragst du die variable ab und erhöhst sie um 1. $check++
dann musst du vor die aktion (in deinem fall bild uploaden) einfach die abfrage machen ob $check 0 oder 1 ist. wenn $check != 0 dann wird keine aktion gemacht.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 14.11.2005, 10:17  
Gast
 
Beiträge: n/a
Standard

Die Frage die sich mir hier stellt ist wie die Seite aktualisiert wird!
Ich vermute nämlich, das beim aktualisieren der Seite die Formulardaten neu versendet werden. Deshalb wird auch immer wieder ein neues Bild hochgeladen.
Das könntest du unterbinden, indem du einfach, nachdem dein Script etwas hochgeladen etc. hat, in deinen Quelltext ein header("Location:upload.php\n\n"); machst. upload.php musst du natürlich durch deinen Dateinamen ersetzen.
Oder du könntest deine Arrays ($_POST, $_FILES) löschen... Dann hätte dein Script keine Daten mehr zum versenden. Dies würde aber möglicherweise zu Fehlermeldungen führen... Wie gesagt. Probiers mal mit der header()-Funktion und poste mal ein bisschen Quellcode...

Gruß,
Andreas
 
Alt 14.11.2005, 10:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ich würde ein md5_file() über hochgeladene Bilder jagen und vergleichen, ob ein Bild mit gleichem Hash in der letzten Zeit auch hochgeladen wurde (von der selben IP sogar noch).

Edit: zum Posting vorher, das ist natürlich auch möglich. Du müsstest eben das Verarbeitungsskript (Bild checken, Datenbankeintrag vornehmen) verlassen, wenns geklappt hat, einfach per header("Location: weg.php"); Dann sind beim Reload auch keine POST-Variablen mehr vorhanden.
Zergling-new ist offline  
Alt 14.11.2005, 10:40  
Gast
 
Beiträge: n/a
Standard

Vielen Dank!

Das funktioniert eigentlich sehr gut.
Aber es gibt da noch ein kleines Problem...

Man kann mit Hilfe des Scripts 3 Bilder hochladen...

Wenn man also jetzt 1 hochlädt, dann setz ich $check auf 1, wenn man das 2. hochlädt, auf 2 und wenn man das 3. hochlädt auf 3.
Wenn $check größer als 3 ist wird nichts gemacht.
Tja, wenn das der User so macht, dann funktioniert das auch, aber das wird er wohl kaum tun...

Wenn er nämlich jetzt nur 1 hochlädt und dann auf aktualisieren klickt, dann tritt das Problem vom Doppel-Upload wieder auf, es wird nur begrenzt auf max. 3mal...

Gibt's dafür auch eine Lösung?
 
Alt 14.11.2005, 10:42  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Na dafür wirste ja wohl selbst ne Lösung finden Bissl selbst mitdenken!
Zergling-new ist offline  
Alt 14.11.2005, 10:50  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

musst halt dem bild 1 $check 1 über hidden input mitliefern. bei 2 und 3 dasselbe mit $check 2 und $check 3.

und dann für jede der drei variablen eine abfrage machen wie oben erklärt.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 14.11.2005, 11:30  
Gast
 
Beiträge: n/a
Standard

Ich denke, das Hauptproblem wird sein, das viele Leute einfach den "reload button" im Browser clicken .... das lässt sich mit SESSIONS ganz gut abfangen:

Dazu ein kleines Bsp:

PHP-Code:
<?php
session_start
();
srand((double)microtime()*10000);
$myid md5(uniqid(rand()));

if(!isset(
$_SESSION['reload']))
    
$_SESSION['reload'] = array();

if(
in_array($_POST['id'],$_SESSION['reload']))
    die(
"bitte nur einmal schicken");


echo 
'<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
    echo 
'<input style="width:100px;" type="text" name="Test" value="Test">';
    echo 
'<input type="hidden" name="id" value="'.$myid.'">';
    echo 
'<input type="submit" name="" value="Test">';
echo 
"</form>";


array_push($_SESSION['reload'],$_POST['id']);

?>
Ansonsten kannst Du ja auch einfach vorher prüfen ob es schon ein Bild Katze für diesen Benutzer gibt, bzw. ob er schon 3 Bilder hochgeladen hat.
 
Alt 14.11.2005, 12:08  
Gast
 
Beiträge: n/a
Standard

Genau das meine ich

Den "reload button" im Browser!

Eines passt aber noch nicht so ganz:
Wenn man auf den "reload button" klickt, BEVOR man etwas hochladen will dann wird das Hochladen total verweigert...

PHP-Code:
<?
session_start
(); 
...
if (!isset(
$_SESSION['reload']))
    
$_SESSION['reload'] = array();

if (!
in_array($_POST['id'],$_SESSION['reload']))
    
// Funktion zum Hochladen
...
// Formular
...
array_push($_SESSION['reload'],$_POST['id']); 
?>
Wie bzw wo leere ich die Session wieder korrekt, damit ein erneutes Hochladen nur dann verweigert wird, wenn man gerade was hochgeladen hat und DANN auf aktualisieren (im Browser) klickt?
 
Alt 14.11.2005, 12:12  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Warum übernimmst du meine Lösung eigentlich nicht, muss man dir alle komplett vorkauen?
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
CURL in Seite einloggen und einen Teil parsen Matt PHP Tipps 2008 8 03.09.2009 22:30
Seite Aktualisieren Aero-Biba PHP Tipps 2008 8 07.09.2007 15:32
PHP News in normale HTML Seite? PHP Tipps 2005-2 5 06.07.2005 19:45
Welche seite (Adresse) rief die aktuelle seite auf? PHP Tipps 2005-2 7 05.07.2005 15:02
Login auf einer externen Seite per PHP ? PHP-Fortgeschrittene 9 03.07.2005 02:31
Seite aktualisieren - Variableninhalte löschen patr1k PHP Tipps 2005-2 4 21.06.2005 17:28
[Erledigt] Seite aktualisieren PHP Tipps 2005 10 22.02.2005 18:13
Mit post an weitere Seite oder 2 Seiten übergeben? PHP Tipps 2005 1 02.02.2005 12:16
Neue Seite an einer bestimmten Stelle aufrufen PHP Tipps 2005 3 13.01.2005 10:09
blätterfunktion-limit-letzte seite PHP Tipps 2004-2 2 20.12.2004 23:56
Eine 2te Seite auto matisch in neuem Fenster laden PHP Tipps 2004 4 25.08.2004 14:10
Seite Automatisch Aktualisieren PHP Tipps 2004 5 18.08.2004 00:29
Webseite aktualisieren PHP Tipps 2004 1 25.07.2004 18:37
[Erledigt] Tabelle auf einer Seite auslesen und in meiner Seite wiederg PHP Tipps 2004 2 14.07.2004 08:46
"NEWS-SCRIPT" in eine Seite einbinden: Aber wie ? PHP Tipps 2004 2 03.07.2004 16:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php seite aktualisieren button, zurücksetzen seite neu laden, homepage aktualisieren bild hochladen, php seite aktualisieren, php browser reload erhöht variable post, php browser aktualisieren erhöht variable post, html reload abfangen, bild abfragen und refreschen auf webseite, webseite nach hochladen von bildern aktualisieren html, curl nach zeit seite nachladen, php post vars löschen seite neu laden, internetseite aktualisieren html, website nur einmal aktuallisieren php, php teil einer seite refreshen, php seite neu laden um $_post zu löschen, php seite neu laden ohne den inhalt zu löschen, php,nur einmal absenden,seite aktualisieren, browser aktualisieren php, $_session[reload], seiteaktualiesieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.