id nieuwe invoer
Ik wil namelijk dit id aan de bestandsnaam van de afbeelding toevoegen, zodat je nooit 2 dezelfde bestandsnamen krijgt.
Ik weet dat je de tabel kan uitlezen en de nieuwste id kan pakken, maar het kan zijn dat er een is verwijderd en dan klopt het niet meer, want dan is het nieuwe id niet de niewste in de database plus 1.
mysql_insert_id()?
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Boaz schreef op 02.01.2009 17:47:
En sinds wanneer kan het in pgSQL alleen vooraf? Met nextval() kun je vooraf het volgende id opvragen, met lastval() kun je het laatst aangemaakt id opvragen, met currval() kun je het huidige id opvragen en met RETURING kun je de INSERT-query het aangemaakte id laten returnen. Diverse mogelijkheden om het gewenste id op te vragen!Dat is heel erg verschillend per database, mysql kan het alleen achteraf met mysql_insert_id waar het dan bij pgsql weer alleen vooraf kan.
In MySQL ben je verplicht om achteraf mysql_insert_id te gebruiken, andere mogelijkheden zijn er niet.
Sorry frang :$ spijtme, je kan wel zien dat ik nooit met pgsql werk, het ging mij om het voorbeeld, dat het verschilt.
En in Oracle kan het net zo als in PGSQL
Ik begrijp dat het dus niet goed mogelijk is. Wat zouden jullie doen, om te zorgen dat je geen dubbele bestandsnamen in de uploadmap krijgt?
edit: Je kunt je bestandnamen gewoon bijv zo maken: sha1(time()) dan heb je eigenlijk nooit te maken met dubbele filenames, en wordt er ook niets overschreven.
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Niek schreef op 02.01.2009 19:51:
Je kunt toch de primary key uit de betreffende tabel gebruiken als bestandsnaam? Met mysql_insert_id() krijg je wel altijd de juiste waarde terug en op die manier ben je ervan verzekerd dat elke bestandsnaam uniek is.Wat zouden jullie doen, om te zorgen dat je geen dubbele bestandsnamen in de uploadmap krijgt?
Dat het in andere databases makkelijker kan is waar, maar dat betekent nog niet dat het met MySQL niet te realiseren is...
Wat zegt het ID uit de database over het feit dat de bestandsnaam uniek is?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
do
{
$sFileName = md5(rand()) . "." . $aAfbeelding['info']['extension'];
}
while(file_exists($sUploadRelatiefAdres . $sFileName));
?>
do
{
$sFileName = md5(rand()) . "." . $aAfbeelding['info']['extension'];
}
while(file_exists($sUploadRelatiefAdres . $sFileName));
?>
$sUploadRelatiefAdres is bij voorbeeld ../uploads/
$aAfbeelding['info'] is pathinfo($aAfbeelding['name']);
$sFileName is uiteindelijk de unieke bestandsnaam + locatie.
Gewijzigd op 01/01/1970 01:00:00 door Douwe
Rens schreef op 02.01.2009 19:59:
Als het id de PK is, is die per definitie uniek. En als je het id als bestandsnaam gebruikt, heb je per definitie een unieke bestandsnaam ;-)Wat zegt het ID uit de database over het feit dat de bestandsnaam uniek is?
Blanche schreef op 02.01.2009 20:02:
Rens schreef op 02.01.2009 19:59:
Als het id de PK is, is die per definitie uniek. En als je het id als bestandsnaam gebruikt, heb je per definitie een unieke bestandsnaam ;-)Wat zegt het ID uit de database over het feit dat de bestandsnaam uniek is?
Ja, maar je gaat er dan wel vanuit dat alle bestanden uit die folder in 1 tabel worden bijgehouden, wat je dus beperkt volgens mij... Lijkt mij beter om eerst een unieke bestandsnaam te zoeken, en dan pas de query uit te voeren...
Feit blijft dat de unieke key van 2 verschillende opslagplaatsen, die verder niet gekoppeld zijn ofzo, vrij weinig met elkaar te maken hebben... toch?
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
Rens schreef op 02.01.2009 20:04:
Dat lijkt mij niet meer dan logisch. Als de informatie over je bestanden over meerdere tabellen verdeeld is, heb je toch een foutje gemaakt bij het opzetten van je datamodel. Dat zou namelijk betekenen dat je meerdere tabellen hebt waarin dezelfde soort informatie opgeslagen wordt en dat kan niet correct zijn.Ja, maar je gaat er dan wel vanuit dat alle bestanden uit die folder in 1 tabel worden bijgehouden
Ik zou zelf de database als basis aanhouden en de rest van het filesystem daarop afstemmen. In welke mappen je de bestanden vervolgens opslaat maakt overiges ook niet uit, die informatie sla je ook gewoon op in de database ;-)
Is het niet beter om binnen het filesystem een unieke naam te zoeken, en pas daarna de insert uit te voeren?
Quote:
In dat geval zou de data in je filesystem niet overeenkomen met de data in je database. En dan heb je waarschijnlijk een veel groter probleem dan die unieke bestandsnaam.en er daarna achter komt dat die bestandsnaam op miraculeuze wijze al bestond
Quote:
Als je systeem goed in elkaar zit en je de database als basis aanhoudt, is dit een overbodige stap. In de database staat voor het betreffende bestand al iets unieks (de PK), dus waarom zou je met PHP nog een extra stap uitvoeren om iets anders unieks te bepalen?Is het niet beter om binnen het filesystem een unieke naam te zoeken, en pas daarna de insert uit te voeren?
Persoonlijke voorkeur denk ik ;-) Ik check liever dubbel dan te weinig :D
Maar waarom zet je geen unique op je bestandsnaam? Dan vang je 'm namelijk helemaal netjes af...
Crispijn schreef op 02.01.2009 20:25:
Dat is inderdaad verstandig als je zelf een bestandsnaam genereert. Maar dan blijf ik erbij, waarom iets extra's unieks genereren als de database al iets unieks gegenereerd heeft?Maar waarom zet je geen unique op je bestandsnaam? Dan vang je 'm namelijk helemaal netjes af...
Het zal inderdaad een kwestie van smaak zijn. Ik ben niet zo van het dubbele controleren, één goede controle moet meer dan voldoende zijn.
Volgens mij heb je geen extra query nodig. Als je door de database de bestandsnaam laat genereren heb je ook weer een query nodig die deze bestandsnaam ophaalt om je file weer te hernoemen... Zo blijf je bezig. Het zet me aan het denken... Weet niet wat ik prefereer. Eerst bestandsnaam kiezen op de fileserver en dan wegschrijven of andersom... Ik heb tot nu toe altijd het eerste gedaan.
2) vraag het aangemaakte id op (primary key, dus uniek)
3) schrijf het bestand weg op het filesystem met een nieuwe naam: $id.extensie
Het is nu onmogelijk om dubbele namen te krijgen en je hebt slechts 1 query nodig om de boel in de database te zetten.
Gewijzigd op 01/01/1970 01:00:00 door Frank -