[PHP] file unieke naam geven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Ik genereer een bestand en sla dit op het file system op.
Als de naam al bestaat moet er een naam aangemaakt worden met een volgnummer, bestaat die al dan moet het nummer met een opgehoogd worden..
Ik haal al deze info uit de bestandsnaam en heb geen database, wat het misschien lastiger maakt..

Ik doe nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'];
if (!file_exists('bestanden/'.$filename.'.pdf')) 
    {
        $pdf->Output('bestanden/'.$filename.'.pdf', F);
        chmod ('bestanden/'.$filename.'.pdf', 777);
    }
else if (file_exists('bestanden/'.$filename.'.pdf'))
    {
        
// bestaat ie al dan moet er dus een nummer te starten bij een aan.. bestaat dat al dan moet het 2  
// 2 worden en.als die al bestaat 3 enz..
}


Zelf dacht ik aan iets van een loop oid en dan
PHP:
1
2
3
$split = explode ("-", $filename);
$nr = $split[2] + 1; //3de positie in de array in het volgnummer, hogen we op met 1
$filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'].'-'.$nr;

Net zo lang tot hij niet bestaat..

Maar dan raak ik de weg een beetje kwijt :S

[ Voor 13% gewijzigd door ViNyL op 19-07-2006 14:11 ]


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Je kan altijd microtime() + rand() doen, de huidige tijd in milliseconden + een random getal. Zet dat eventueel in een loopje:
als(naam bestaat) {
naam = microtime() + rand();
}

De kans dat microtime() + rand() een zelfde resultaat geven is al redelijk miniem.

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Dat had ik inderdaad ook al bedacht, maar dat vindt ik niet zo mooi staan in de filename, tja perfectionist he :)

Anders was ik allang klaar geweest maar goed haha

Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
Gebruik een recursieve functie. Zet de code die je nu hebt in een functie met als param de filename. In je else stukje waar de file dus al bestaat maak je een counter aan en verhoog je die met 1 en roep je dan de functie zelf weer aan met die counter achter de filename als nieuwe param.

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
While-loops zijn hier zeer geschikt voor. Wanneer je niet precies weet hoevaak je iets uit moet voeren, gebruik dan de while-loop.

PHP:
1
2
3
4
5
6
7
$filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'];
$i=0;
while(file_exists('bestanden/'.$filename.'.pdf')) {
  $i++
  $filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'].'-'.$i;
}
// $filename is nu uniek

Overigens vraag ik me af waarom '.pdf' geen onderdeel van $filename is, maar dat zal wel een bewuste keuze zijn.
En 'curdate' klinkt als 'huidige datum'. Waarom zou je die via een formulier mee laten sturen als je hem in PHP ook zelf kunt reconstureren. Verder hoop ik dat $_POST['bedrijfsnaam'] aan de hand van een allow-list wordt gecontroleerd, om namen als '../../' te voorkomen.

[ Voor 44% gewijzigd door GlowMouse op 19-07-2006 14:26 ]


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Je kan ook rand nemen, is minder lang :)
Is indd niet zo mooi, weet alleen niet wat het efficienste is. Als je code telkens het hoogste nr moet gaan zoeken. Stel je hebt 1000 files en je moet die alle 1000 eerst doorlopen om zo te weten dat je id 1001 moet gebruiken. Tenzij ik je verkeerd begrepen heb.
Meby is het toch beter een recordje op te slaan in de database OF een bestand aanmaken met daar de laatst gebruikte id

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
GlowMouse schreef op woensdag 19 juli 2006 @ 14:24:
While-loops zijn hier zeer geschikt voor. Wanneer je niet precies weet hoevaak je iets uit moet voeren, gebruik dan de while-loop.

PHP:
1
2
3
4
5
6
7
$filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'];
$i=0;
while(file_exists('bestanden/'.$filename.'.pdf')) {
  $i++
  $filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'].'-'.$i;
}
// $filename is nu uniek

Overigens vraag ik me af waarom '.pdf' geen onderdeel van $filename is, maar dat zal wel een bewuste keuze zijn.
En 'curdate' klinkt als 'huidige datum'. Waarom zou je die via een formulier mee laten sturen als je hem in PHP ook zelf kunt reconstureren. Verder hoop ik dat $_POST['bedrijfsnaam'] aan de hand van een allow-list wordt gecontroleerd, om namen als '../../' te voorkomen.
Die bedrijfsnaam gaat er nog uit verdwijnen is voor mij even als herkenning, anders zie ik met al die data en nummers die pdf's niet meer na 10 minuten :D

Dat wordt een nummer met de datum inderdaad.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

PHP:
1
md5(microtime(true));


:)

[ Voor 21% gewijzigd door Snake op 19-07-2006 14:28 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

Anoniem: 49627

Waarom zou je dat dan nog willen hashen?

Overigens werken de aangedragen "oplossingen" geen van alle in een multithreaded omgeving zoals een webserver. M.a.w. het kan nog steeds fout gaan.

[ Voor 29% gewijzigd door Anoniem: 49627 op 19-07-2006 14:31 ]


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Anoniem: 49627 schreef op woensdag 19 juli 2006 @ 14:30:
[...]
Waarom zou je dat dan nog willen hashen?

Overigens werken de aangedragen "oplossingen" geen van alle in een multithreaded omgeving zoals een webserver. M.a.w. het kan nog steeds fout gaan.
Bwo, mijn microtime + rand, als je rand groot genoeg neemt) lijkt mij de kans toch al miniem en als het voorvalt, vangt de test in de for dat op

Acties:
  • 0 Henk 'm!

Anoniem: 49627

DaRKie schreef op woensdag 19 juli 2006 @ 14:34:
Bwo, mijn microtime + rand, als je rand groot genoeg neemt) lijkt mij de kans toch al miniem en als het voorvalt, vangt de test in de for dat op
De kans wordt wel heel klein, dat zeker. Maar ik neem aan dat er nog iets met die bestanden moet gebeuren, en zonder achterliggende database is het met zo'n random naamgeving vrij lastig om nog enigszins chocola van de bestanden te maken.

een random naam lijkt me op dit moment geen optie.

Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Het is indd geen goede oplossing, maar de TS heeft geen database om een id bij te houden. Enige andere oplossing lijkt mij een bestand te zijn waarin hij deze wegschrijft, maar dat bestand kan ook "verdwijnen" en dus probs geven.

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 13:19

Glewellyn

is er ook weer.

DaRKie schreef op woensdag 19 juli 2006 @ 14:41:
Het is indd geen goede oplossing, maar de TS heeft geen database om een id bij te houden. Enige andere oplossing lijkt mij een bestand te zijn waarin hij deze wegschrijft, maar dat bestand kan ook "verdwijnen" en dus probs geven.
Bestanden verdwijnen echt niet zomaar...

En als we jouw redenering doortrekken verdwijnen databases ook zomaar 8)7

*zucht*


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Glewellyn schreef op woensdag 19 juli 2006 @ 14:46:
[...]


Bestanden verdwijnen echt niet zomaar...

En als we jouw redenering doortrekken verdwijnen databases ook zomaar 8)7
Ik zette het dan ook tussen quotes. Het lijkt mij dat de kans dat zo een bestandje verdwijnt groter dan een db: overijverige admin ofzo die dat bestand ziet en denkt dat het weg mag, you never know :)
Ik bedoelde eerder dat als je voor zo een oplossing gaat, je een backup moet schrijven die de unieke id's terugopzoekt als het bestand gedelete zou worden

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 13:19

Glewellyn

is er ook weer.

DaRKie schreef op woensdag 19 juli 2006 @ 14:52:
[...]


Ik zette het dan ook tussen quotes. Het lijkt mij dat de kans dat zo een bestandje verdwijnt groter dan een db: overijverige admin ofzo die dat bestand ziet en denkt dat het weg mag, you never know :)
Ik bedoelde eerder dat als je voor zo een oplossing gaat, je een backup moet schrijven die de unieke id's terugopzoekt als het bestand gedelete zou worden
Ik zou er niet vanuit gaan dat het bestandje wordt weggegooid, en als het bestandje ontbreekt een foutmelding geven en niet automatisch een nieuwe maken. Anders kom je er nooit achter waardoor het bestand is verdwenen. En een nieuw tekstbestandje met een volgnummer is zo getypt in notepad/vim

*zucht*


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
True, maar stel:
TS is op vakantie, tijdens een drukke werkweek werkt het systeem niet meer omdat het bestand corrupt/verdwenen is.

Zijn toch dingen waar je moet aan denken. En als het niet nodig is dat die bestanden gebruikt worden achteraf: unique random id genereren + duplicate file check
Beter voorkomen dan genezen is mijn motto :)

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 13:19

Glewellyn

is er ook weer.

Dan heb je 2 uur downtime terwijl een collega de documentatie doorspit en het bestandje op je juiste plaats aanmaakt. Daarna krijgt degene die het bestand heeft weggegooid er flink van langs!

*zucht*


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Als er al een collega/documentatie is e :)

Wat is er mis met een solide oplossing bouwen die dergelijke problemen opvangt? Lijkt me toch logisch dat een systeem tegen dergelijke anomalien bestand is

Acties:
  • 0 Henk 'm!

Anoniem: 49627

DaRKie schreef op woensdag 19 juli 2006 @ 15:09:
Wat is er mis met een solide oplossing bouwen die dergelijke problemen opvangt? Lijkt me toch logisch dat een systeem tegen dergelijke anomalien bestand is
Dat heet niet een solide oplossing, dat heet een onhandelbare oplossing. Wanneer je een onderdeel van applicatie weggooit dan ben je de applicatie aan het slopen, daar ga je toch met goed fatsoen geen rekening mee houden.

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 13:19

Glewellyn

is er ook weer.

Het is prachtig als een systeem dit soort zaken opvangt. Maar als er op wonderbaarlijke manier bestanden van mijn server verdwijnen wil ik heel graag weten hoe dat is gebeurd. Op deze manier zal je daar nooit achterkomen.

Dus als je dit soort afwijkingen in je applicatie netjes voorkomt, prima. Maar dan wel naar een logfile schrijven dat het bestand ontbrak en bij welk volgnummer het programma de nummering heeft hervat.
Ik vind accountability namelijk belangrijker dan availability. Heeft misschien iets te maken met het werken voor grote banken...

*zucht*


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Ik vind toch maar dat jullie raar redeneren hoor, een mogelijk probleem opvangen als onhandelbaar zien.
Als iedereen zoals jullie zouden werken, zou je elke properties file/xml file/config file/... manueel moeten schrijven want het systeem moet niet zo gemaakt zijn dat als zo een bestand ontbreekt, het opgevangen wordt maar gewoon een error logt en ermee stopt.
Glewellyn schreef op woensdag 19 juli 2006 @ 15:17:
Het is prachtig als een systeem dit soort zaken opvangt. Maar als er op wonderbaarlijke manier bestanden van mijn server verdwijnen wil ik heel graag weten hoe dat is gebeurd. Op deze manier zal je daar nooit achterkomen.

Dus als je dit soort afwijkingen in je applicatie netjes voorkomt, prima. Maar dan wel naar een logfile schrijven dat het bestand ontbrak en bij welk volgnummer het programma de nummering heeft hervat.
Ik vind accountability namelijk belangrijker dan availability. Heeft misschien iets te maken met het werken voor grote banken...
lijkt me nogal logisch dat je dergelijke zaken ook logt. Maar gewoon zeggen:probleem->log en bekijk het maar? Als het een systeem kritieke fout is dat je het eventueel alles laat stil leggen ok, maar de naam van een bestand dat niet het juiste nummer heeft?

Nogmaals, heeft de TS dit nodig? Heb de TS in en vorig topic vandaag ook geholpen ivm hetzelfde probleem en daar ging het over het verwijderen van de PDF's na een tijdje, dus het lijkt mij dat hij die niet moet bijhouden?

[ Voor 62% gewijzigd door DaRKie op 19-07-2006 15:21 ]


Acties:
  • 0 Henk 'm!

Anoniem: 49627

DaRKie schreef op woensdag 19 juli 2006 @ 15:18:
Ik vind toch maar dat jullie raar redeneren hoor, een mogelijk probleem opvangen als onhandelbaar zien.
Nee hoor, wij maken het onderscheidt tussen essentiele programma bestanden en optionele configuratie bestanden. mijns insziens valt een dergelijke bestand niet onder een optioneel configuratie bestand maar onder een vereist programma bestand. Zodoende is het onzinnig extra logica in te bouwen .

Acties:
  • 0 Henk 'm!

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
Ok weer even ontopic. Zoiets dus:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function saveFile($filename)
{
   if (!file_exists($filename))
   {
      // saven
   }
   else if (file_exists($filename)
   {
      // teller achter filenaampje
      // functie nogmaals aanroepen

      saveFile($filename);
   }
}
?>

[ Voor 7% gewijzigd door seamus21 op 19-07-2006 15:46 ]

Always shoot for the moon. Even if you miss you will land among the stars...


Acties:
  • 0 Henk 'm!

Anoniem: 49627

seamus21 schreef op woensdag 19 juli 2006 @ 15:46:
Ok weer even ontopic. Zoiets dus:[bla]
ja dat staat dus al een paar keer op deze pagina, zelfs nog verder uitgewerkt. In een multithreaded omgeving, zoals een webserver, kunnen deze scriptjes zeer makkelijk falen. De kans dat het faalt is, afhankelijk van de load, aan de vrij lage kant maar wel degelijk aanwezig.

Edit: en recursief is al helemaal een nogo in dergelijke situaties. Het lijkt me onnodig de function stack laten groeien. (of werkt php anders)

[ Voor 15% gewijzigd door Anoniem: 49627 op 19-07-2006 15:59 ]


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
dit komt rechtstreeks uit een class die ik gebruik... als een filename al bestaat komt er keurig _1 of _2 enz achter te staan... wellicht moet je nog wat aanpassen omdat het letterlijk uit de class komt

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
34
35
36
37
38
39
40
            // zet de while op false
            $ww_hile = false;
            $i = 0;
            
            
            // probeer net zolang todat er een unique bestandnaam is
                while($ww_hile === false) {
                
                    // als het de eerste keer in de while is
                    if($i === 0) {
                        // probeer de orginele bestandnaam met path
                        $FileNameWithPath = $this->Photo_ThumbDir.$sFileName;
                    }   
                    else {
                        
                        // het gedelte voor de punt 
                        $pieces = explode('.', $sFileName); 
                        $last = count($pieces) -2;
                        
                        // stel wat in
                        $pieces[$last] .= '_'.$i;
                        $FileName_tmp = '';
                        
                        // plak de filenaam weer aan elkaar
                        for($x = 0; $x <= $last; $x++) $FileName_tmp .= $pieces[$x].'.';
                        
                        // plak de extensie erachter
                        $FileName_tmp .= $pieces[$last + 1];
                        
                        // Geef het volledig (relatieve) path naar de foto                  
                        $FileNameWithPath = $this->Photo_ThumbDir.$FileName_tmp;    
    
                    }       
                
                    // als er niet een bestand met de bestandsnaam bestaat
                    if( !is_file($FileNameWithPath) )
                        $ww_hile = true; // stop de while lus
                    
                    $i ++;  // verhoog $i voor een nieuwe try
                }

[ Voor 4% gewijzigd door Aloys op 19-07-2006 16:00 ]


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Anoniem: 49627 schreef op woensdag 19 juli 2006 @ 15:29:
[...]

Nee hoor, wij maken het onderscheidt tussen essentiele programma bestanden en optionele configuratie bestanden. mijns insziens valt een dergelijke bestand niet onder een optioneel configuratie bestand maar onder een vereist programma bestand. Zodoende is het onzinnig extra logica in te bouwen .
Ik maak dat onderscheid ook. Ik beweer alleen dat in dit geval het bestand niet essentieel is om een hele applicatie te laten stoppen als het er niet meer is. Jij zegt dat het wel essentieel is, daar zit het verschil, niet tussen het verschil niet kennen. Het hangt allemaal af van wat de applicatie moet doen en volgens mij kunnen noch jij noch ik uitmaken ofdat die bestanden wel degelijk bewaard moeten worden voor langere periodes of voor welke reden dan ook zonder dat de TS zegt wat hij ermee wilt doen.

Acties:
  • 0 Henk 'm!

Anoniem: 49627

DaRKie schreef op woensdag 19 juli 2006 @ 16:23:
[...]onsamenhangend betoog[...]
Goed ik ga niet eindeloos door met deze insignificante discussie.
Hoe het ook zij, het feit blijft: Met jouw aanpak ontdek je eventuele fouten hoogstwaarschijnlijk in een veel later stadium, krijgt minder prioriteit om het te repareren en is simpelweg meer werk.

Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Anoniem: 49627 schreef op woensdag 19 juli 2006 @ 16:46:
[...]

Goed ik ga niet eindeloos door met deze insignificante discussie.
Hoe het ook zij, het feit blijft: Met jouw aanpak ontdek je eventuele fouten hoogstwaarschijnlijk in een veel later stadium, krijgt minder prioriteit om het te repareren en is simpelweg meer werk.
uhu, ik repareer de fout in het begin en jij wilt wachten tot de fout zich voordoet, mij goed. Jou idee is volgens jou het enige goede e, ook goed. Ik zei niet dat mijn idee het ideale is, maar met de info die ik van de TS krijg, is het "een" oplossing waarbij ik zei dat er eventueel rekening gehouden moet worden met dat bepaald probleem dat zich eventueel kan voorvallen.

Buiten kritiek spuwen en je eigen idee doordrijven heb je wel niet veel opties gegeven waar de TS effectief wat aan heeft. Afbreken kan iedereen ... maarja, mij ook goed.

De TS heeft ondertussen al wat info om over na te denken om zo to een oplossing te komen. En als je iets beter weet, let us know! Dan kan ik ook wat afbreken :)

Acties:
  • 0 Henk 'm!

Anoniem: 49627

DaRKie schreef op woensdag 19 juli 2006 @ 17:38:
uhu, ik repareer de fout in het begin en jij wilt wachten tot de fout zich voordoet, mij goed.
Nee dan lees je niet goed. Het is namelijk een situatie die niet voorkomt, een situatie waarbij je geen rekening dient te houden. Ik ga echt geen code schrijven die problemen moeten oplossen omdat een of andere idioot onderdelen van mijn programma gaat verwijderen. dat is absurd, daar ga je geen code voor schrijven.
DaRKie schreef op woensdag 19 juli 2006 @ 17:38:
Jou idee is volgens jou het enige goede e, ook goed. Ik zei niet dat mijn idee het ideale is, maar met de info die ik van de TS krijg, is het "een" oplossing waarbij ik zei dat er eventueel rekening gehouden moet worden met dat bepaald probleem dat zich eventueel kan voorvallen.
Het is dus een onzinnig stukje code en heeft helemaal niets met de "oplossing" voor TS van doen.
DaRKie schreef op woensdag 19 juli 2006 @ 17:38:
Buiten kritiek spuwen en je eigen idee doordrijven heb je wel niet veel opties gegeven waar de TS effectief wat aan heeft. Afbreken kan iedereen ... maarja, mij ook goed.
De oplossing is al in vorm van code gegeven. Bij die oplossing plaats ik een terechte kritische noot. Waar overigens nog geen aanzet in de juiste richting is gegeven. Zelf spui ik liever geen code, dat draagt imho bij aan script request. Ik vind concepten veel interessanter. Van afbreken is dus geen sprake.
DaRKie schreef op woensdag 19 juli 2006 @ 17:38:
De TS heeft ondertussen al wat info om over na te denken om zo to een oplossing te komen. En als je iets beter weet, let us know! Dan kan ik ook wat afbreken :)
De TS heeft alleen maar van ons insignificant geneuzel kunnen kennis nemen. En tuurlijk weet ik het beter :P "Je hebt een atomair systeem nodig om je volgnummer te verkrijgen."

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
seamus21 schreef op woensdag 19 juli 2006 @ 14:24:
Gebruik een recursieve functie. Zet de code die je nu hebt in een functie met als param de filename. In je else stukje waar de file dus al bestaat maak je een counter aan en verhoog je die met 1 en roep je dan de functie zelf weer aan met die counter achter de filename als nieuwe param.
PHP kan niet perfect omgaan met recursieve functies - zoals de meeste programmeertalen overigens. Bij systemen waar functies wellicht duizend(en) keren zichzelf aan zouden roepen zijn recursieve functies ongeschikt. En waarom recursief als het ook met een simpele while loop kan?

Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Anoniem: 49627 schreef op woensdag 19 juli 2006 @ 23:14:
[...]
De TS heeft alleen maar van ons insignificant geneuzel kunnen kennis nemen. En tuurlijk weet ik het beter :P "Je hebt een atomair systeem nodig om je volgnummer te verkrijgen."
Zo ken ik er ook nog een: "Maak de critical section van de methode die de nummering voorziet mutual exclusive"
Vraag me af ofdat de TS veel heeft aan dergelijke antwoorden :)

Beste oplossing lijkt me dat de filename voortvloeit vanuit de buss. logica (indien mogelijk), bv de naam stelt een factuurnr voor. Heb je tenminste betekenisvolle filenames en het opzoeken is ook a peace of cake.

Acties:
  • 0 Henk 'm!

Anoniem: 85525

PHP kan wel gebruik maken van semaphoren: http://nl3.php.net/manual/en/ref.sem.php

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Het opslaan van een bestand en daar een nummer in bijhouden is iets waar ik zelf ook aangedacht heb. Maar omdat het om offertes gaat en het per klant die een offerte aanvraagt wisselt (en dus ook hun volgnummer, want een klant kan maar 1 maar ook 2 of 3 offertes aanvragen) kijk ik liever "live" op het filesystem. Overigens worden de bestanden per dag weggegooid.

De oplossing van GlowMouse is erg simpel but effective en dat bevalt me wel:
PHP:
1
2
3
4
5
6
7
8
9
<?
$filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'];
$i=0;
while(file_exists('bestanden/'.$filename.'.pdf')) {
  $i++
  $filename = $_POST['bedrijfsnaam'].'-'.$_POST['curdate'].'-'.$i;
}
// $filename is nu uniek
?>


Rest me alleen nog de vraag wat het verschil is met de oplossing van Aloys Akkerman
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
34
35
36
37
38
39
40
41
42
<?
            // zet de while op false
            $ww_hile = false;
            $i = 0;
            
            
            // probeer net zolang todat er een unique bestandnaam is
                while($ww_hile === false) {
                
                    // als het de eerste keer in de while is
                    if($i === 0) {
                        // probeer de orginele bestandnaam met path
                        $FileNameWithPath = $this->Photo_ThumbDir.$sFileName;
                    }    
                    else {
                        
                        // het gedelte voor de punt    
                        $pieces = explode('.', $sFileName); 
                        $last = count($pieces) -2;
                        
                        // stel wat in
                        $pieces[$last] .= '_'.$i;
                        $FileName_tmp = '';
                        
                        // plak de filenaam weer aan elkaar
                        for($x = 0; $x <= $last; $x++) $FileName_tmp .= $pieces[$x].'.';
                        
                        // plak de extensie erachter
                        $FileName_tmp .= $pieces[$last + 1];
                        
                        // Geef het volledig (relatieve) path naar de foto                    
                        $FileNameWithPath = $this->Photo_ThumbDir.$FileName_tmp;    
    
                    }        
                
                    // als er niet een bestand met de bestandsnaam bestaat
                    if( !is_file($FileNameWithPath) )
                        $ww_hile = true; // stop de while lus
                    
                    $i ++;    // verhoog $i voor een nieuwe try
                }
?>

Die is een stuk uitgebreider maar doet toch eigenlijk hetzelfde?

Overigens zijn het offertes die los staan van het offerte systeem wat gebruikt wordt om de uiteindelijke offerte uit te brengen. Het is puur een systeem voor het web zodat mensen makkelijk een prijs indicatie krijgen.

[ Voor 24% gewijzigd door ViNyL op 20-07-2006 08:19 ]


Acties:
  • 0 Henk 'm!

Anoniem: 85525

Inderdaad, maar die van Aloys Akkerman is algemener. GlowMouse's oplossing is specifiek voor jouw probleem.

[ Voor 84% gewijzigd door Anoniem: 85525 op 20-07-2006 08:21 ]


Acties:
  • 0 Henk 'm!

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 10-06 15:14
Als het offertes zijn, heb je dan geen offertenr? Die zijn toch ook uniek dacht ik? Waarom gebruik je dat nr niet voor de filename.

Het verschil in code is prolly omdat Akkerman code uit zijn eigen class gecopy-pasted heeft en hij daar de filename zelf moet opslitsen in dir/filename.ext wat al een aantal extra regels geeft. Uiteindelijk doen beide codes hetzelfde, enkel glowmouse heeft het hier en daar korter weten te schrijven :)

Acties:
  • 0 Henk 'm!

  • Mister_X
  • Registratie: Februari 2000
  • Laatst online: 17-04 14:07
DaRKie schreef op donderdag 20 juli 2006 @ 08:24:
Als het offertes zijn, heb je dan geen offertenr? Die zijn toch ook uniek dacht ik? Waarom gebruik je dat nr niet voor de filename.

Het verschil in code is prolly omdat Akkerman code uit zijn eigen class gecopy-pasted heeft en hij daar de filename zelf moet opslitsen in dir/filename.ext wat al een aantal extra regels geeft. Uiteindelijk doen beide codes hetzelfde, enkel glowmouse heeft het hier en daar korter weten te schrijven :)
sja, lijkt me ook erguh logisch :)

anders kun je dit nog wel gebruiken: md5(uniqid(rand(), true)) als filename, maarja, zie dan nog maar uit te vissen welke pdf bij wie of wat is/hoort :P

je kan ook dit doen:
$filename = $_POST['bedrijfsnaam'].'-'.date('Y-m-d H:i:s');
kans erg klein dat je dubbele krijgt

[ Voor 8% gewijzigd door Mister_X op 20-07-2006 08:55 ]


Acties:
  • 0 Henk 'm!

Anoniem: 49627

Als het om een tijdelijk bestand gaat, waarom gebruik je dan geen systeem functionaliteit voor een temp-file?

Is het bestand sessie gebonden?/M.a.w. wat is de levensloop van het bestand?

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Nou de naam moet nog wel in een PDF file gebruikt worden en enigzins representatief zijn.. vandaar dat ik het nu zo doe (ben toch op een file overgestapt):

-Na het samenstellen van de offerte, net voor het genereren van de PDF open ik een file met daarin het laatste offerte nummer.
-Wis de file inhoud en hoog het oude nummer met 1 op.
-Schrijf dit weg en gebruik het nieuwe nummer in de offerte

Acties:
  • 0 Henk 'm!

  • Marc3l
  • Registratie: December 2005
  • Laatst online: 15:13
In Coldfusion heb je deze mooie funtie nameConflict="MakeUnique"
Bestaat deze functie in php niet dan?

Acties:
  • 0 Henk 'm!

  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024

DaMinD

Leeg


Acties:
  • 0 Henk 'm!

  • MuggenHor
  • Registratie: Juli 2003
  • Laatst online: 26-01 16:59
@Vinyl ik neem aan dat je geen database gebruikt omdat je geen MySQL/etc server/database ter beschikking hebt?

Ik zou namelijk meteen als oplossing een SQLite database overwegen. (Is vaak nog sneller als MySQL ook zolang je meerdere opeenvolgende SQL-statements maar in een transactie stopt.)

Waarheid is pas waarheid als het tegendeel ook waarheid is.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Jawel wel een database tot mijn beschikking maar waarom zou ik dat in dit geval doen. Ik kan het on the fly maken en eventueel het unieke nummer in een textfile bijhouden (wat ik nu dus doe). Dan lijkt me de inzet van een database overdreven.

Acties:
  • 0 Henk 'm!

Anoniem: 49627

ViNyL schreef op vrijdag 21 juli 2006 @ 13:50:
Jawel wel een database tot mijn beschikking maar waarom zou ik dat in dit geval doen. Ik kan het on the fly maken en eventueel het unieke nummer in een textfile bijhouden (wat ik nu dus doe). Dan lijkt me de inzet van een database overdreven.
Met het gebruik van een database kun je een uniek volgnummer garanderen, met een bestand kan dat niet in dit geval niet.
Pagina: 1