PHP-Mysql
Először is üdv. ismét!
Van egy problémám, a következő:
Adott egy regisztráció, ahol az adatok tárolásán kívül, generálunk egy random számot, jelen esetben 1-3 között, és ezek egyedi értékek kell hogy legyenek.
Ezzel azt szeretném elérni, hogy az adatbázisban, a táblát átböngészve, olyan random számot kapjak, amely 100% hogy nincs benne a táblában.
Jelen esetben mondjuk 2 lenne valamely már regisztrált felhasználó száma a táblában, akkor ha az új felhasználó regisztrációnál 2t generál, lefutáskor figyelembe véve hogy ez már egy generált, és táblában tárolt (UNIQUE) érték, új számot generáljon (1 vagy 3) , ami még nincs benne a táblában, így kizárva a duplikációt.
Nem szeretném hallani azt hogy "uhh de hülye" , és hasonló társaikat.
Segítségért jöttem fel, kérem aki megmondja mi a hibám, ami miatt nem megy, kerek mondatban foglalja össze ha elméleti, vagy gyakorlati hibám van.
Köszönöm
■ Van egy problémám, a következő:
Adott egy regisztráció, ahol az adatok tárolásán kívül, generálunk egy random számot, jelen esetben 1-3 között, és ezek egyedi értékek kell hogy legyenek.
<?php
$random=rand(1,3);
$keres=mysql_query("SELECT * FROM tabla WHERE random='$random'",$kapcsolat);
$sorok_szama=mysql_num_rows($keres);
while ($sorok_szama>0)
{
$random=rand(1,3);
$sorok_szama=mysql_num_rows($keres);
}
$random=rand(1,3);
$keres=mysql_query("SELECT * FROM tabla WHERE random='$random'",$kapcsolat);
$sorok_szama=mysql_num_rows($keres);
while ($sorok_szama>0)
{
$random=rand(1,3);
$sorok_szama=mysql_num_rows($keres);
}
Ezzel azt szeretném elérni, hogy az adatbázisban, a táblát átböngészve, olyan random számot kapjak, amely 100% hogy nincs benne a táblában.
Jelen esetben mondjuk 2 lenne valamely már regisztrált felhasználó száma a táblában, akkor ha az új felhasználó regisztrációnál 2t generál, lefutáskor figyelembe véve hogy ez már egy generált, és táblában tárolt (UNIQUE) érték, új számot generáljon (1 vagy 3) , ami még nincs benne a táblában, így kizárva a duplikációt.
Nem szeretném hallani azt hogy "uhh de hülye" , és hasonló társaikat.
Segítségért jöttem fel, kérem aki megmondja mi a hibám, ami miatt nem megy, kerek mondatban foglalja össze ha elméleti, vagy gyakorlati hibám van.
Köszönöm
Nem előforduló
folytasd kérlek
a $nem_elofordulok=$maradt_lehetosegek nemde?
ebből hogyan vegyek ki értéket?
Miért nem jó továbbá az én megoldásom? hiszen elvileg mennie kellene. Hiba nincs benne, szintaktikailag 100%, de a logikám is követhető sztem.
A te megoldásod
Imhol leírom mit csinál a te "megoldásod"
Igen, ez azoknak a számoknak a listája amik még megmaradtak. Hagyományos tömb, minden tömb művelet engedélyezett rajta.
rendben
üdv
az elméletem
// Generálunk egy random számot, ez eddig oké is
$random = rand(1,3);
//A lekérdezés a generált számot keressi
$keres=mysql_query("SELECT * FROM tabla WHERE random='$random'",$kapcsolat);
// Talált elemek száma
$sorok_szama=mysql_num_rows($keres);
// amíg a sorok száma nagyobb mint 0,
// tehát van olyan rekord az adatbázisban amelyiknek
// a random értéke = a generáltal addig fusson le
while ($sorok_szama>0) {
// Generálunk egy random számot, mert a már generált benne van az adatbázisban
// az újonnan generált szám előfordulhat az adatbázisban, és
// akár meg is egyezhet a korábban generálttal, de ez nagy intervallumnál
// már kevésbé valószínű , és ha még is, 2.szorra szinte lehetetlen
// ezt az álltalad alkalmazott függvényt sajnos még nem ismerem de folytatom
$random=rand(1,3);
// A sorok száma miért nem változik? Most a már újonnan generált értékkel
// kellene lefutnia a ciklusnak. Elmondod hogy mi kellene hogy itt legyen
// hogy változzon a sorok száma, és ne legyen végtelen ciklus?
// Az új számmal már a lekérdezés elvileg 0-t ad vissza,
// mert az új, 3as random pl elvileg nincs az adatbázisban, nem?
$sorok_szama=mysql_num_rows($keres);
}
rand
rand(1, 3)
két egymást követő hívásban is adhat ugyanolyan eredményt, azaz simán előfordulhat hogy egymás után 3-szor 1-et ad. Pont mint ahogy a kockadobás esetén, lehet egymás után 4-szer 3-at dobni.A másik ami miatt nem változott a $sorok_szama, mivel nem volt újabb lekérdezés.
Az persze mellékes, hogy az elgondolásod egyáltalán nem hatékony, mert legrosszabb esetben 3 lekérdezés szükséges, mire megállapítjuk, hogy egyáltalán nincsen olyan random szám, amit be tudnánk rakni a táblánkba, míg legjobb esetben egy lekérdezésből állapítja meg, hogy mi a szabad random.
Az én első megoldásomban egy lekérdezés alatt megvan, és a tömb rendezgetése sehol nincs teljesítmény igényben a 3 lekérdezéshez képest.
Ez főleg akkor lesz probléma ha nem 3 hanem 33333 kombinációból lehet választani, azaz mondjuk 1 és 33333 közötti random számot akarsz majd beszúrni, mivel ekkor a te elgondolásod alapján legrosszabb esetben 33333 lekérdezés szükséges, az 1 helyett.
Hát jó
Minden esetre akkor ezt a megoldást preferálom, és utána nézek ezeknek a dolgoknak.
Köszönöm a segítséget.
egy picit vitatkoznék,
viszont van értelme, ha egy elég nagy intervallumba lövöldözünk, amiből viszonylag kevés használt elem van, pl 32karakteres hash-ek, és pár száz elem van a táblában... kicsi az esélye, hogy 1-2 lekérdezésnél tovább jusson, és nem kell beolvasni a sokszáz azonosítót, amik ráadásul egyenként 32 karakteresek...
illetve, jobb lenne adatbázisra bízni a random generálást, és akkor nem kell minden ellenőrzéshez php-ból query-t futtatni, de az már külön tudomány :)
viszont pl megkérdezném, hogy miért nem jó egy mysql primary key not null auto_increment megoldás, muszáj randomnak lennie?
Nem , randomnak kell lennie