Autor | Zpráva | ||
---|---|---|---|
koudelacek Profil * |
#1 · Zasláno: 14. 6. 2012, 12:03:47
Dobrý den, ještě jeden dotaz k uplodu souborů.
Na server budu nahrávat soubory, které budou pojmenovány pouze čísly ID, které jim přidělí databáze - nahraju soubor, databáze vyhledá kolik je tam záznamů a id nahraného souboru tedy bude +1, pak přidá nový záznam do databáze a příšt nanovo.. Chci se ale zeptat, může se stát, že nahraje soubor více uživatelů najednou a nějakým způsobem něco "pochybí" a např. dvěma uživatelům přidělí stejné ID - tudíž jeden nahraje svůj soubor a druhý ho přepíše ? Pokud se to stát může, může mi někdo poradit jak se tomu vyhnout ? Jelikož pojmenování souborů pomocí ID je pro mě důležité, neboť je pak na stránkách vypisuji jako /neco.php?id=ID_SOUBORU. Děkuji za odpovědi. |
||
panther Profil |
#2 · Zasláno: 14. 6. 2012, 12:08:14
koudelacek:
nepočítej, kolik je záznamů v DB, snadno dojde k chybě. Příklad: Máš 30 záznamů (ID 1-30), dva smažeš a nahraješ další. Místo správného ID=31 mu ale přiřadíš ID=29 (počet + 1). Správně je zapsat do DB a přiřazené ID (auto increment), mysql_insert_id vložit do jména souboru. Případně jméno souboru generovat náhodně a při zápisu pouze kontrolovat nově vzniklý řetězec. Při dostatečné délce (8 znaků, malá/velká písmena a číslice) bude riziko kolize minimální (pokud bude počet souborů v nějakých rozumných řádech). |
||
ShiraNai7 Profil |
#3 · Zasláno: 14. 6. 2012, 12:08:50
koudelacek:
„Chci se ale zeptat, může se stát, že nahraje soubor více uživatelů najednou a nějakým způsobem něco "pochybí" a např. dvěma uživatelům přidělí stejné ID - tudíž jeden nahraje svůj soubor a druhý ho přepíše ?“ Používej raději AUTO_INCREMENT namísto ručního vyhledávání. První vlož řádek, poté přesouvej nahraný soubor. |
||
koudelacek Profil * |
#4 · Zasláno: 14. 6. 2012, 12:10:11 · Upravil/a: koudelacek
Samozřejmě jsem nemyslel počítat kolik je záznamů, ale zjistit, které ID bylo poslední, omlouvám se za špatné vyjádření. A díky za odpověď, to s tím inserd_id zkusím.
Akorát mám problém se strukturou, protože mám tabulku ID, PROJECT_ID, FILE_ID .... ID má auto_increment, PROJECT_ID je slozka do ktere se budou nahravat a FILE_ID melo byt id souboru, ktere by v kazde slozce zacinalo od 1.. Cili: ID ..PROJECT .. FILE 1 .. 1 .. 1 2 .. 1 .. 2 3 .. 1 .. 3 4 .. 2 .. 1 5 .. 2 .. 2 Rozumíte ? A já potřebuji přidělit právě to FILE_ID, proto jsem chtěl hledat poslední FILE_ID pro tu dložu PROJECT_ID.. Snad je to prijatelne, nevim totiz jak bych to s tim incrementem skloubil.. $get_id=mysql_query('SELECT file_id FROM designs WHERE project_id="'.$_GET['p'].'"', $GLOBALS['connect']); if (@mysql_num_rows($get_id)) { { while($num=mysql_fetch_array($get_id)) $enter=$num['file_id']; } $enter++; } else $enter="0"; |
||
dRaGen Profil |
#5 · Zasláno: 14. 6. 2012, 12:56:00
koudelacek:
$GLOBALS, zavináč, SQL injection, zbytecny cyklus ... takovejch šíleností se v 10ti řádkách kódu málokomu povede. Zkus si nejprve přečíšt nějakou knížku o PHP. |
||
koudelacek Profil * |
#6 · Zasláno: 14. 6. 2012, 14:00:08
Co je na tom španě ?
|
||
panther Profil |
#7 · Zasláno: 14. 6. 2012, 17:12:27
koudelacek:
„Co je na tom španě ?“ přečti si, proč se některé z těch věcí nemají používat. Jediné, na co asi nepřijdeš, je, proč je zbytečný ten cyklus - spočítat záznamy můžeš už na úrovni databázového dotazu. Co se týče samotné myšlenky: proč lpír na tom, aby jméno souboru vždy začínalo od jedničky? Jednak si myslím, že jméno souboru není až tak podstatné (nenese-li v sobě informaci o svém obsahu), zadruhé budeš jen komplikovat život těm, kteří si budou ukládat naráz z více složek - budou muset soubory přejmenovávat, aby nedošlo ke kolizi jmen. |
||
koudelacek Profil * |
#8 · Zasláno: 14. 6. 2012, 17:52:25
Mám objednanou knihu 1001 tipu a triku od vrany, tak doufam, ze mi to k necemu bude..
|
||
koudelacek Profil * |
#9 · Zasláno: 14. 6. 2012, 22:51:29
Je to velký problém pokud použiju starší mysql_insert_id() ? Píšou tam totiž, že se to nemá používat..
|
||
dRaGen Profil |
#10 · Zasláno: 15. 6. 2012, 04:53:43
koudelacek:
možná úplně nejlepší bude když si stáhneš dibi V tabulce si udelej primarni klic a nastav mu auto_increment pro ziskani posledniho vlozeneho zaznamu pouzij statickou metodu z dibi dibi::getInsertId(); |
||
blaaablaaa Profil |
#11 · Zasláno: 15. 6. 2012, 08:37:00
dRaGen:
Proč do toho taháš dibi, když to samé muže udělat i bez něj? koudelacek: mysql_insert_id() klidně použij - vrátí id posledního vloženého záznamu (s auto incrementem) |
||
Časová prodleva: 4 dny
|
|||
dRaGen Profil |
#12 · Zasláno: 19. 6. 2012, 02:07:40
blaaablaaa:
Protože "Use of this extension is discouraged. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:" http://cz.php.net/manual/en/function.mysql-query.php |
||
blaaablaaa Profil |
#13 · Zasláno: 19. 6. 2012, 07:54:42
dRaGen:
mysql_insert_id() -> mysqli_insert_id() |
||
Časová prodleva: 13 let
|
0