Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql]przydzielanie ID
Forum PHP.pl > Forum > Przedszkole
propheti
Witam,
zna ktoś może sposób na to, aby przy dodawaniu nowego rekordu (powiedzmy, przy rejestracji), skrypt wyszukiwał "dziury" w rekordach, i wstawiał je właśnie w te miejsca.

Powiedzmy że mam coś takiego:

usera - id 1
userb - id 2
userd - id 4

Chce aby po rejestracji użytkownik posiadał id 3.

Dobrze by było, aby uzupełniało dopiero od danej wartości. Powiedzmy że od id 50, wszystkie wcześniejsze będą ignorowane.
mike
A po co chcesz to robić?
Przecież to bez sensu.
propheti
Otóż właśnie nie!

Mam zamiar wykorzystać to w grze, która opiera się na id, i wszelkie akcje wykonywane w niej jak naprzykład przekazanie złota bądź danego przedmiotu, wymaga podania id, a po kilku miesiącach rejestracji userów id są rzędu 6000-7000, co źle wpływa na wygode samej gry.
nospor
Cytat
a po kilku miesiącach rejestracji userów id są rzędu 6000-7000, co źle wpływa na wygode samej gry
a w jaki sposob to źle wplywa? Wybacz, ale nie rozumiem. Dziury w numeracji w kazdej aplikacji nie powinny miec zadnego zlego wplywu
propheti
Bo zamiast wpisywania trzech cyferek przy przelewaniu kasy, wpisuje 6-7. Kolejna rzecz, to że ludzie z reguły wolą mieć mniejsze id, ze względu na fakt, że im mniejsze tym wyżej są na liście obecnych.
Mar3k
Może dodatkowe pole w bazie i nadanie im numerow od 1 do ilosci userow ?
Zniknie problem ale przybedzie pole .
AxZx
Cytat(propheti @ 27.09.2006, 13:17:30 ) *
Bo zamiast wpisywania trzech cyferek przy przelewaniu kasy, wpisuje 6-7. Kolejna rzecz, to że ludzie z reguły wolą mieć mniejsze id, ze względu na fakt, że im mniejsze tym wyżej są na liście obecnych.


chcesz powiedziec ze jezeli ktos nowy sie zapisze i zalozmy bedzie mial to mniejsze ID bo trafi mu sie dziura (np ID 29 sie zwolni) to bedzie wyzej w hierarchi?
o masz zly sposob hierarchizowania;)
a pozatym niech gracz nie bedzie numerkiem, tylko zeby mial swoj login i jak chcesz dac mu mozliwosc robienia przelewu totak zeby nie musial pamuietac jaki to byl login, albo jakie to bylo ID tylko zrob mu liste userow niech sobie znajdzie i kliknie.
propheti
Eh, chyba jasno powiedziałem czego potrzebuje prawda? smile.gif Gdybym mógł brać pod uwage inne rozwiązania, to pewnie bym się tak nie męczył.

Zależy mi na skrypcie który sprawdzi tabele w poszukiwaniu "dziur" i przy dodawaniu nowego wiersza, najnormalniej załata nim jedną z tych luk.

Moge liczyć na pomoc?

A propo, AxZx - sprawdź sam, dlaczego nie moge zrobić inaczej - http://abbil.cal.pl
nexis
Są dwa sposoby:

1) Podczas usuwania konto (czyli zwolnieniu się ID) dopisujesz to ID do specjalnej tabeli, z której podczas rejestracji jest ewentualnie brane ID, a jeśli tabela jest pusta to użytkownik dostaje po prostu MAX(id)

2) Robisz pęltę i sprawdzasz po kolei czy dane id jest zajęte

  1. <?php
  2. $i = 1;
  3. $query = 'SELECT id FROM users ORDER BY id ASC';
  4. $query = mysql_query( $query );
  5. while (($row = mysql_fetch_array( $query )) && (!isset( $userid ))) {
  6. if ($row['id'] != $i) {
  7. $userid = $row['id'];
  8. }
  9. $i++;
  10. }
  11. echo $userid;
  12. ?>
sticker
jak tak będziesz łatać dziurki a używasz mysql bez transakcji to może Cie spotkać bardzo przykra niespodzianka i w bazie zrobi Ci sie niezły bałagan chyba że dobrze to kontrolujesz.
A co do skryptu który będzie to sprawdzał to po prostu przelatuj kolejne cyferki z tabelki od 1 w góre i szukaj pierwszej wolnej.
propheti
Huh, no i pojawił się problem. sad.gif

Kod
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/prophet/domains/abbil.cal.pl/public_html/test.php on line 8


linia 8 to:

Kod
while (($row = mysql_fetch_array( $query )) && (!isset( $userid ))) {
SongoQ
Kiedys pisalem na forum jak za pomoca 1 zapytania zwrocic najmniejszy wolny numer. Wystarczy poszukac jak Cie to tak bardzo interesuje. Jesli nie znajdziesz to pisz to powtorze to jeszcze raz.
propheti
Ja na szczęście należe do nielicznej grupy osób, które potrafią korzystać z wyszukiwarek. Jednak znalezienie tego jednego posta wśród tysięcy tematów jest niczym poszukiwanie igły w stogu siana, a ja już i tak spędziłem sporo czasu na poszukiwaniu odpowiedzi na nurtujące mnie pytanie.

Więc byłbym wyjątkowo wdzięczny jeśli mógłyś powtórzyć.
SongoQ
Ok wiec najprosciej jest zrobic cos takiego.

Mamy tabele tabela

pole id
1
2
4
5
7
10

Najmniejszym wolny id jest 3

  1. SELECT t1.id + 1
  2. FROM tabela t1 LEFT JOIN tabela t2 ON t1.id = t2.id + 1
  3. WHERE t2.id IS NULL
  4. LIMIT 1


Problem jest jesli nie ma pierwszego id czyli 1. Mam nadzieje ze CI to jakos zobrazowalo jak wyciagnac najmniejsze wolne id.
propheti
Niestety, ale powyższe zapytanie nie działa, zawsze przy wykonywaniu wywala wynik 2.
Możliwe że robie coś źle...
Ehh, już mnie zaczyna głowa od tego boleć. sadsmiley02.gif
SongoQ
Podaj strukture i kilka przykladowych danych i zapytanie jakie wykonujesz.
propheti
Struktura tabeli players:
id | user | pass | rank | ...
-----
1 | jurek | (md5) | admin | ...
2 | czesuaf | (md5) | member | ...
4 | wacuaf | (md5) | staff | ...

A oto zapytanie:
  1. SELECT t1.id + 1
  2. FROM players t1 LEFT JOIN players t2 ON t1.id = t2.id + 1
  3. WHERE t2.id IS NULL
  4. LIMIT 1
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.