Autor Zpráva
koudelacek
Profil *
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
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
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 *
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
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 *
Co je na tom španě ?
panther
Profil
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 *
Mám objednanou knihu 1001 tipu a triku od vrany, tak doufam, ze mi to k necemu bude..
koudelacek
Profil *
Je to velký problém pokud použiju starší mysql_insert_id() ? Píšou tam totiž, že se to nemá používat..
dRaGen
Profil
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
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)
dRaGen
Profil
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
dRaGen:
mysql_insert_id() -> mysqli_insert_id()

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: