Autor Zpráva
martin5504
Profil
Ahojte, prosím vás potrebujem poradiť, potreboval by som jednoduchú PHP funkciu, ktorá by vytvárala číslo postupne nie random, ale postupne. Teda 1 potom 2, ale potreboval by som to tak aby sa už tá 1 nikdy nepoužila. Díki
lionel messi
Profil
function postupneCisla()
{
  static $cislo = 0;
  $cislo++;
  return $cislo;
}

echo postupneCisla(); //vypíše 1
echo postupneCisla(); //vypíše 2
echo postupneCisla(); //vypíše 3

Ešte doplním, táto funkcia vypíše po každom zavolaní číslo o 1 vyššie, ale ide o prípad „v rámci stránky“. Bolo by vhodné upresnenie, viď [#3] juriad
juriad
Profil
martin5504:
„aby sa už tá 1 nikdy nepoužila“
Tím myslíš v rámci nějakého bloku, v rámci stránky, v rámci uživatele, v rámci celého webu, nebo co vlastně chceš?
Kolik takových různých sekvencí chceš?
martin5504
Profil
Ono sa to bude zapisovať do tabulky do db, ako port, teda bude tam IP:PORT, ale nemožem mat rovnaky PORT vase, tak potrebujem aby sa to zapisovalo do db, postupne, 1- ak bude pouzite tak sa zapise 2, atd atd
lionel messi
Profil
martin5504:
Toto sa dá podľa mňa vyriešiť aj na úrovni SQL, nastav príslušnému stĺpcu tabuľky AUTO INCREMENT a máš to ďaleko jednoduchšie.
martin5504
Profil
Tak sa mi to nedari urobit, asi pretoze tam uz mam ID z AI.

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
lionel messi
Profil
Riešenie by mohlo byť naznačené tu: Tvorba unikátního url článku. Ešte lepšie odpovedal juriad.
juriad
Profil
martin5504:
Tak vytvoř novou tabulku obsahující jediný sloupec, která bude sloužit jen jako generátor čísel.
Uvědom si také, že máš k dispozici jen 64500 portů, až ti dojdou, co budeš dělat?
Joker
Profil
martin5504:
A je problém, aby se port převzal z ID? Teda kromě toho, že port může pokud vím být maximálně 65535.

Jinak nemá být port unikátní jen pro jednu IP? (Nevidím důvod, proč by nemohl být port stejný, pokud budou různé IP.)
V tom případě by šlo zjistit nejvyšší použitý, SELECT MAX(port) FROM tabulka WHERE ip=ip adresa a pak použít port + 1.
DJ Miky
Profil
Joker:
V tom případě by šlo zjistit nejvyšší použitý […] a pak použít port + 1.

Na tento přístup pozor. Pokud náhodou nastane situace, že přijdou dva požadavky ve stejnou chvíli, může se jim přidělit stejné číslo portu.

Pokud bude záznamů málo, přiklonil bych se k řešení generovat port přičtením konstanty k ID záznamu, např. ID + 1000 pro porty od 1001 výše. Navíc takové řešení zajistí, že se port nikdy nerecykluje (což možná v tomto případě není potřeba). Řešení s vybíráním maxima má vlastnost, že při smazání posledního záznamu se dalšímu přidanému přiřadí stejný port, jako měl smazaný záznam.
Joker
Profil
DJ Miky:
Pokud náhodou nastane situace, že přijdou dva požadavky ve stejnou chvíli, může se jim přidělit stejné číslo portu.
Od toho jsou zámky.
I když jestli jsem dobře četl manuál, jeden název může mít jen jeden zámek a jinak se musí použít alias, takže nějak: LOCK TABLES tabulka READ, tabulka AS tabIns WRITE, SELECT z tabulka, INSERT do tabIns, UNLOCK TABLES.

Řešení s vybíráním maxima má vlastnost, že při smazání posledního záznamu se dalšímu přidanému přiřadí stejný port, jako měl smazaný záznam.
Pokud se záznamy reálně vymažou. Pokud budou mít stav a „smazání“ je jen přesune do stavu „deleted“ (nebo něco), tak ne.

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: