[PHP] Vaag probleem bij uploaden van files

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mede tweakers,

Zit met een beetje raar probleem. Ik heb een script waarmee ik files kan uploaden. De files worden gerenamed naar het volgende formaat: artikelid_plaatjesid.extentie.

Dat renamen gaat allemaal goed (denk ik). De plaatjes krijgen netjes een naam met de juiste nrs (b.v. 1e plaatje heet 1802_1.jpg en 2e plaatje heet 1802_2.jpg).

Mijn probleem is het volgende (ben er nu al 2 weken mee bezig maar ik ben lost! weet het niet meer!):

Als ik, laten we zeggen, twee plaatjes heb geupload en ik upload een derde plaatje. Dan is opeens het eerste (dus die er al stond) verandert in het derde (nieuwe die ik net geupload heb) plaatje! Dit is overigens alleen maar een voorbeeld want het gebeurt gewoon random (b.v. bij het 10e en 15e plaatje). Het gekke is dat de namen van de plaatjes dus wel verschillend zijn! Dus ze heten b.v. netjes 1802_1.jpg t/m 1802_10.jpg. Ik upload de plaatjes per 6 maar ook als ik ze per 1 upload heb ik het probleem.

De plaatjes worden netjes geupload via een zelf geschreven functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//De aanroep: 
if (is_file($plaatje)) $content->addPicture($plaatje,$plaatje_name,$action,$id);
if (is_file($plaatje1)) $content->addPicture($plaatje1,$plaatje1_name,$action,$id);
if (is_file($plaatje2)) $content->addPicture($plaatje2,$plaatje2_name,$action,$id);

//De functie (hoort in een class):
    function addPicture($plaatje,$plaatje_name,$action="",$id="") {
        $Filenaam="";
        $nextid="";
        global $dbase,$global;
        if ($action=="content_toevoegen" || $action=="content_toevoegen_inserten") $nextid=$this->getNextContentID();
        else $nextid=$id;
        $Query="SELECT Titel FROM PPC_Content_Plaatjes WHERE Titel LIKE '".$nextid."_%' ORDER BY Titel";
        $Result = $dbase->querySelect($Query);
        $array_nr=array();
        while($Row=mysql_fetch_row($Result)) {
            $explosion=explode(".",$Row[0]);
            $nr=explode("_",$explosion[0]);
            $array_nr[$nr[1]]=(int)$nr[1];
            print "NR = ".$array_nr[$nr[1]]." -> ";
        }
        
        asort($array_nr);
        //filename
        $explosion=explode(".",$plaatje_name);
        $ext=$explosion[1];
        $Filenaam=$nextid."_".($array_nr[count($array_nr)]+1).".".$ext;
        if (copy($plaatje, "$global->content_image_dir/$Filenaam") && $Filenaam!="" && $nextid!="") {
            $Query="INSERT INTO PPC_Content_Plaatjes VALUES(NULL,'$Filenaam',$nextid)";
            $dbase->queryInsert($Query);
            return true; //success
        } else return false; //failure
    }


Het geheel draait op een eigen Debian server op Apache.
Iets zegt mij dat het niet aan de scripts ligt, maar ik hoor graag jullie mening! Bedankt.

[ Voor 9% gewijzigd door Verwijderd op 14-09-2003 09:44 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zie het niet zo gauw, maar probeer eens veel meer comments te plaatsen. Dan wordt het ook duidelijker voor jezelf.

Acties:
  • 0 Henk 'm!

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 20:24

Carnifex

auch

beetje vaag is het wel ja. Als ik je goed begrijp wordt het nieuwe plaatje met de goede nieuwe naam over een oud plaatje met een oude naam geschreven? Of worden plaatje 1 en plaatje 3 hetzelfde plaatje, maar heet de een plaatje_1.jpg en de ander plaatje_3.jpg?

Daarnaast vroeg ik me af of de print "NR = ".$array_nr[$nr[1]]." -> "; wel het goede nummer laat zien iedere keer. Print eens wat meer, zoals "Filenaam" oid. Misschien dat het casten naar die (int) niet 100% goed gaat.

Ik zou sowieso proberen geen engelse en nederlandse woorden te mixen, al helemaal niet als het 1 woord is, zoals 'filenaam'. Dan ga je je zeker een keer vergissen en onnodige en moeilijk te vinden fouten maken.

Daarnaast zie ik ook niet wat dat 'nextid' moet doen :?

[ Voor 9% gewijzigd door Carnifex op 14-09-2003 10:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 14 September 2003 @ 09:53:
Ik zie het niet zo gauw, maar probeer eens veel meer comments te plaatsen. Dan wordt het ook duidelijker voor jezelf.
Tnx Redhot, maar dat had ik al gedaan. Plaatjes krijgen de goede naam maar de oude worden dus gewoon hetzelfde als de nieuwe (soms dus).

Wouter.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Carnifex schreef op 14 September 2003 @ 10:12:
beetje vaag is het wel ja. Als ik je goed begrijp wordt het nieuwe plaatje met de goede nieuwe naam over een oud plaatje met een oude naam geschreven? Of worden plaatje 1 en plaatje 3 hetzelfde plaatje, maar heet de een plaatje_1.jpg en de ander plaatje_3.jpg?
Dat laatste klopt ja.
Daarnaast vroeg ik me af of de print "NR = ".$array_nr[$nr[1]]." -> "; wel het goede nummer laat zien iedere keer. Print eens wat meer, zoals "Filenaam" oid. Misschien dat het casten naar die (int) niet 100% goed gaat.

Ik zou sowieso proberen geen engelse en nederlandse woorden te mixen, al helemaal niet als het 1 woord is, zoals 'filenaam'. Dan ga je je zeker een keer vergissen en onnodige en moeilijk te vinden fouten maken.

Daarnaast zie ik ook niet wat dat 'nextid' moet doen :?
Het nummer is goed, ik heb al alles op het scherm geprint en filenames kloppen telkens weer. Een oud plaatje word alleen hetzelfde als een nieuw plaatje.

Acties:
  • 0 Henk 'm!

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 20:24

Carnifex

auch

Ookal zou er een fout in je eigen code staan, nog snap ik niet hoe het dan mogelijk is om 2x een bestand te schrijven als er maar 1 copy opdracht wordt gegeven. De enige mogelijkheid is dat het plaatje al de naam had van het plaatje wat al geupload was.
dus:al geupload:
plaatje1.jpg
plaatje2.jpg

nieuw uploaden: plaatje1.jpg
wordt automatisch hernoemd tot plaatje3.jpg na uploaden. Dus plaatje1.jpg wordt geupload over het al bestaande plaatje1.jpg en daarna gecopieerd naar plaatje3.jpg.
Ik neem aan dat je eerst de upload procedure uitvoerd en daarna het bestand met addPicture toevoegd aan de database.

Ik durf eigenlijk ook niet te zeggen hoe die copy in de if statement wordt geevalueerd. Stel dat de if controle pas bij nextid="" faalt, is het bestand dan al wel gecopieerd? Dan zou het kunnen zijn dat een bestand wordt gecopieerd, maar dat de addPicture functie faalt en ook het asserten in de database. Dan zou bij de volgende aanroep van addPicture het nieuw te bepalen nextid niet meer kloppen.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik weet niet of dit je problemen gaat oplossen, maar een paar code-tips:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        $Query="SELECT Titel FROM PPC_Content_Plaatjes 
         WHERE Titel LIKE '".$nextid."_%' ORDER BY Titel";
        $Result = $dbase->querySelect($Query);
        $array_nr=array();
        while($Row=mysql_fetch_row($Result)) {
            $explosion=explode(".",$Row[0]);
            $nr=explode("_",$explosion[0]);
            $array_nr[$nr[1]]=(int)$nr[1];
            print "NR = ".$array_nr[$nr[1]]." -> ";
        }
        asort($array_nr);
        //filename
        $explosion=explode(".",$plaatje_name);
        $ext=$explosion[1];
        $Filenaam=$nextid."_".($array_nr[count($array_nr)]+1).".".$ext;

Dit is een, imho, vrij onhandig stukje code. Je slaat de plaatjes blijkbaar op als bladie_bla.jpg en meer niet.
Is het niet veel netter om ze juist alleen met de nummers te identificeren?
Dus een record dat enkel het artikel-nummer en het plaatje-in-artikel-nummer bevat ?
Die titel van je kan je prima afleiden uit die gegevens en het scheelt je een hoop vieze code. Het enige wat je dan doet is: SELECT MAX(afbeeldingsid) FROM afbeeldingen WHERE artikelid = ...;

Maar eigenlijk is deze constructie helemaal niet nodig, je kan net zo goed alleen een plaatjesid bijhouden (bijv met een auto_increment) en dan verder in je tabel bijhouden bij welk artikel het hoort. Het lijkt me eigenlijk niet relevant dat je in de naam van de plaatjes perse het artikelnummer opslaat.
De plaatjes sla je dan gewoon op met dat unieke nummer (die auto_increment) die je vanzelf correct verkrijgt door het plaatje te inserten in je tabel, waarna je move_uploaded_file kan aanroepen

Acties:
  • 0 Henk 'm!

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 05-09 07:32

Willem2

Ω is futile

beetje open deur misschien, maar ik heb eens hetzelfde aan de hand gehad. Dat bleek een te fanatieke cache setting van mijn browser te zijn. Ook willen proxies nog wel eens roet in het eten gooien.
Dit zou kunnen als je met veel verschillende namen heb getest en dat je die nu en dan weer tegen het lijf loopt.

Al eens gekeken hoe de plaatjes eruit zien als je ze met ftp van je server plukt?

Mocht dit idd het probleem zijn, dan zou je kunnen denken aan een PHP passthru funtie oid.

en nee, ik houd niet van voetbal... :)


Acties:
  • 0 Henk 'm!

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 20:24

Carnifex

auch

ik ben het volledig met ACM eens, maar het blijft vreemd dat het plaatje 2x wordt gecopieerd.

[ Voor 12% gewijzigd door Carnifex op 14-09-2003 12:06 ]


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Wat een vreemde constructie. Plaatjes kun je beter opslaan met een uniek id nr, of als je geen dubbele plaatjes wilt, met de md5 code van het plaatje.

(het nut van) De hele $nextid operatie in je script ontgaat me een beetje en grote kans dat daar dan ook de fout zit.

Kan je overigens aangeven waar het fout gaat, dus 1. de file is identiek, of 2. de databaseentry verwijst naar de verkeerde file.

Waarom gebruik je trouwens copy ipv move_uploaded_file() ?

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik de files met FTP weer download zijn ze identiek kwa plaatje, maar kwa naam dus niet.

$nextid is het ID nummer van het artikel (plaatje heet dan: artikelnr_plaatjesnr.extentie)

Zou het aan mijn copy() gebruik liggen en is move_uploaded_file() beter?

Acties:
  • 0 Henk 'm!

Verwijderd

en als je het script eens test op een andere server (klinkt mss dom maar je weet nooit)...
Ik skuit me ook bij acm aan :) stel je maar is voor dat je begint te editen...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 14 September 2003 @ 11:35:
Ik weet niet of dit je problemen gaat oplossen, maar een paar code-tips:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        $Query="SELECT Titel FROM PPC_Content_Plaatjes 
         WHERE Titel LIKE '".$nextid."_%' ORDER BY Titel";
        $Result = $dbase->querySelect($Query);
        $array_nr=array();
        while($Row=mysql_fetch_row($Result)) {
            $explosion=explode(".",$Row[0]);
            $nr=explode("_",$explosion[0]);
            $array_nr[$nr[1]]=(int)$nr[1];
            print "NR = ".$array_nr[$nr[1]]." -> ";
        }
        asort($array_nr);
        //filename
        $explosion=explode(".",$plaatje_name);
        $ext=$explosion[1];
        $Filenaam=$nextid."_".($array_nr[count($array_nr)]+1).".".$ext;

Dit is een, imho, vrij onhandig stukje code. Je slaat de plaatjes blijkbaar op als bladie_bla.jpg en meer niet.
Is het niet veel netter om ze juist alleen met de nummers te identificeren?
Dus een record dat enkel het artikel-nummer en het plaatje-in-artikel-nummer bevat ?
Die titel van je kan je prima afleiden uit die gegevens en het scheelt je een hoop vieze code. Het enige wat je dan doet is: SELECT MAX(afbeeldingsid) FROM afbeeldingen WHERE artikelid = ...;

Maar eigenlijk is deze constructie helemaal niet nodig, je kan net zo goed alleen een plaatjesid bijhouden (bijv met een auto_increment) en dan verder in je tabel bijhouden bij welk artikel het hoort. Het lijkt me eigenlijk niet relevant dat je in de naam van de plaatjes perse het artikelnummer opslaat.
De plaatjes sla je dan gewoon op met dat unieke nummer (die auto_increment) die je vanzelf correct verkrijgt door het plaatje te inserten in je tabel, waarna je move_uploaded_file kan aanroepen
Bedankt, ik ga er morgen is ff naar kijken. Dat opslaan op die manier kan misschien wat problemen voorkomen. Toch heb ik het gevoel dat het aan een of andere cache setting ligt, maar zeker weten doe ik het niet :(.

Wouter.

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Verwijderd schreef op 14 September 2003 @ 14:20:
Als ik de files met FTP weer download zijn ze identiek kwa plaatje, maar kwa naam dus niet.

$nextid is het ID nummer van het artikel (plaatje heet dan: artikelnr_plaatjesnr.extentie)

Zou het aan mijn copy() gebruik liggen en is move_uploaded_file() beter?
Het is gemaakt om geuploade bestanden te moven naar een directory binnen je www root. Hij checkt ook of het wel een geupload bestand betreft en moved het bestand ipv het te kopieren. Aangezien jij copy gebruikt kan je bv een reeds bestaand bestand kopieren omdat ik geen unlink actie kan ontdekken in je code.

Daarnaast is de onderstaande regel een beetje onduidelijk:
PHP:
1
 $nextid=$this->getNextContentID();  else $nextid=$id;


Als je hiermee een verkeerd ID nummer genereerd, schrijf je dus een bestaand bestand over en kan je dus dubbele bestanden krijgen. Beter is:
1. via de manier zoals ACM hem beschrijft, of
2. insert in database, mysql_insert_id opvragen, bestand moven en renamen naar dit id, of
3. md5 van bestand = bestandsnaam

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

zet gewoon de laatste naam van het laatste plaatje (van dat nieuws id ) in de MYSQL db haal bij het kijken hoe het filetje moet heten.. de laatste id (lees: filenaam) uit de db controleer op de laatste 3 cijfers.. +1 erbij doen en voila :) je hebt altijd je files netjes..
Pagina: 1