[PHP] Fotonaam aanmaken

Pagina: 1
Acties:
  • 164 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Realtec
  • Registratie: Juli 2006
  • Laatst online: 22-06 22:18

Realtec

Less is more

Topicstarter
Ik ben bezig met een foto album en nu wil ik elke foto een voorvoegsel geven met een nummer.

Bijvoorbeeld:
thumb/14/thumb_0.jpg
thumb/14/thumb_1.jpg enz...

Hierbij is "thumb" de thumbinals map en "14" de categorie nummer.

Nu moet ik dus weten bij het opslaan van de thumbinal welke bestanden er in de map staan. Om zo een foto naam te maken en dat doe ik als volgt.

code:
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
<?php
function dir_check($map)
{
    if ($handle = opendir($map))
    {
        while (false !== ($file = readdir($handle)))
        {
            if ($file != "." && $file != "..")
            {
                $files[] = $file;
            }
        }
   
        closedir($handle);
    }
    return $files;
}

$totalfiles = dir_check($thumb_map . $Cat_ID . '/');
                                               
for($i=0; $i <= $totalfiles = count($totalfiles); $i++)
{
    if(!file_exists($thumb_map . $Cat_ID . '/' .  $prefix_thumb . $i . '.' . $extentie))
    {
        $nieuwe_foto = $thumb_map . $Cat_ID . '/' . $prefix_thumb . $i . '.' . $extentie;
        echo $nieuwe_foto . ' Bestaat niet<br />';
    }
    else
    {
        $nieuwe_foto = $thumb_map . $Cat_ID . '/' . $prefix_thumb . $i . '.' . $extentie;
        echo $nieuwe_foto . ' Bestaat<br />';
    }
}
?>


Het probleem is nu als de map leeg is dan print hij dit af:
../album/thumb/21/thumb_0.jpg Bestaat niet
../album/thumb/21/thumb_1.jpg Bestaat niet
En als ik dan de thumbinal op ga slaan doet hij dat als thumb_1.jpg terwijl hij eerst thumb_0.jpg moet doen.

Als alleen thumb_0.jpg bestaat dan print hij dit af:
../album/thumb/21/thumb_0.jpg Bestaat
../album/thumb/21/thumb_1.jpg Bestaat niet

De for loop gaat ook niet verder dan 1

Weet iemand wat ik hier fout doe?

Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
PHP:
1
for($i=0; $i <= $totalfiles = count($totalfiles); $i++){}

moet natuurlijk zijn
PHP:
1
for($i=0; $i <= count($totalfiles); $i++){}

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • Realtec
  • Registratie: Juli 2006
  • Laatst online: 22-06 22:18

Realtec

Less is more

Topicstarter
Zo had ik het eerst ook maar dat werkte dus ook niet..

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Het probleem is dat de loop door blijft gaan, ook al vind je wel wat.

Eigenlijk kan je beter gewoon een loop door de directory doen en een break zodra je een plaatsje gevonden hebt.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Realtec
  • Registratie: Juli 2006
  • Laatst online: 22-06 22:18

Realtec

Less is more

Topicstarter
Volgensmij heb ik wel degelijk een limiet op de loop, als $i groter is dan $totalfiles dan stopt hij

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Dat klopt, maar het is goed mogelijk dat je a.jpg en b.jpg in de map hebt maar niet die de bestanden met de naam die jij wil, dan loopt hij dus door 2 bestanden.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
m.i. gaat het fout omdat er 0 files aan je for-lus-criterium voldoen, en je dus helemaal niet in de lus komt.... wat je zoekt is denk ik de "do {} while()" - constructie, dan voert hij alles binnen je lus minimaal 1 x uit: http://nl2.php.net/manual/nl/control-structures.do.while.php

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
code:
1
2
3
4
            if ($file != "." && $file != "..")
            {
                $files[] = $file;
            }


Vergis ik me nu, of overschrijf je je array iedere keer met maar 1 enkele filename?

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Hydra schreef op dinsdag 19 juni 2007 @ 11:35:
code:
1
2
3
4
            if ($file != "." && $file != "..")
            {
                $files[] = $file;
            }


Vergis ik me nu, of overschrijf je je array iedere keer met maar 1 enkele filename?
Dat is de php manier om iets achteraan een array te plakken, dat klopt dus wel.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Je vergist je. Op die manier wordt de array namelijk steeds groter.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

De praktijk heeft mij geleerd dat het werken met genummerde bestandsnamen vaak niet effectief is. Waarom niet een tijd gebonden (verwerk de Unix timestamp in de bestandsnaam?) naam? Je kunt dan ook zonder problemen een bestand verwijderen zonder dat dit een serie nummers doorbreekt - en zo zijn er nog wel wat voordelen op te noemen.
Daarnaast is het verstandig om te allen tijde een db-table synchroon te laten lopen met je files/directories (bestand toevoegen == row toevoegen; bestand verwijderen == row verwijderen etc.). Zo kun je altijd informatie betreffende de bestanden opslaan en kun je de gebruiker die informatie tonen zonder dat je allerlei dirs moet doorlopen (hoeveel bestanden zijn er, wanneer is het laatste bestand toegevoegd/verwijderd etc.).

Acties:
  • 0 Henk 'm!

Verwijderd

Wat ik zelf vaak doe is een timestamp gebruiken voor deze situaties (de Unix timestamp bijvoorbeeld), dit moet je natuurlijk niet doen in een systeem waarbij je 100den aanvragen voor een foto per seconde te verwerken hebt, maar in dat geval zal je dit toch ook anders oplossen. Als je echt veel integriteit wil hebben, kan je ook kiezen om een microtime te gebruiken, deze kan, vermoed ik, bij gebruik van 1 enkele server nooit twee keer hetzelfde zijn bij het simultaan draaien van een script.

http://www.php.net/time
http://www.php.net/microtime

Acties:
  • 0 Henk 'm!

Verwijderd

Morax schreef op maandag 18 juni 2007 @ 21:14:
...
PHP:
1
for($i=0; $i <= count($totalfiles); $i++){}
Misschien niet echt relevant, maar het viel me op.
Zo'n loopje zou ik op deze manier doen:


PHP:
1
2
$max = count($totalfiles);
for($i=0; $i <= $max; ++$i){}


In je loopje continu count($totalfiles) aanroepen is niet echt handig... onderste manier is sneller...

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Veruit het eenvoudigst:
PHP:
1
2
3
4
$i = 0;
do {
   $tryFileName = $baseName . ($i ++) . $extension;
} while ( is_file ( $tryFileName ) );

Er vanuit gaande dat je verder geen waarde hecht aan de nummering zelf, behalve dan dat 'ie uniek is.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Wolfboy schreef op dinsdag 19 juni 2007 @ 11:37:
[...]
Dat is de php manier om iets achteraan een array te plakken, dat klopt dus wel.
Ah, 't is duidelijk te lang geleden :)

https://niels.nu

Pagina: 1