-
Sziasztok!
Az alábbi kódom,melynek az lenne a célja,hogy megakadályozza a telefonszámok duplázódását,nem mûködik.
new string[256];
new Szam = random(8999) + 1000;
new mysql_line[256];
format(string, sizeof(string), \"SELECT Telefon FROM Jatekosok\");
mysql_query(string);
mysql_store_result();
while(mysql_fetch_row(mysql_line))
{
if(Szam == strval(mysql_line))
{
new i,Joszam;
for(i = 0; Joszam != 1; i++)
{
Szam = random(8999) + 1000;
if(Szam != strval(mysql_line))
{
Joszam = 1;
}
}
}
}
mysql_free_result();
format(string, sizeof(string), \"UPDATE Jatekosok SET Telefon = \'%d\' WHERE Nev=\'%s\'\", Szam, nev);
mysql_query(string);
JatekosInfo[playerid][Telefon]= Szam;[/code;
-
Lekérdezed hogy van-e már, és kész.
SELECT Nev,Telefonszam FROM Felhasznalok WHERE Telefonszam = 123
[mod]Code tag kihelyezve.[/mod]
-
Így jó?
De miért nem jó másik megoldás?
new string[256];
new JoSzam;
new Szam = random(8999) + 1000;
format(string, sizeof(string), \"SELECT * FROM Jatekosok WHERE Telefon=\'%d\'\",Szam);
mysql_query(string);
mysql_store_result();
new value = mysql_num_rows();
mysql_free_result();
if(value == 1)
{
for(new x=0;JoSzam!=1;x++)
{
Szam = random(8999) + 1000;
format(string, sizeof(string), \"SELECT * FROM Jatekosok WHERE Telefon=\'%d\'\",Szam);
mysql_query(string);
mysql_store_result();
value = mysql_num_rows();
mysql_free_result();
if(value == 0)
{
JoSzam=1;
break;
}
}
}
-
Most nem tudok konkrét kódot írni, bocsi.
Generálj random számot.
Válaszd ki az azonos számo(ka)t, de írd a query végére, hogy LIMIT 1, így nem fog továbbfutni, ha talált egyet.
Tárold az eredményeket, kérd le a talált sorok számát mondjuk a sorok változóba.
while(sorok)
{
amíg vannak sorok (1db), random szám, megint kérjen le, megint store_result, megint mysql_num_rows, és kész. Addig fogja lekérdezgetni, amíg nem lesz nulla azonos sor
}
Már lehet dolgozni ezzel a számmal.
Remélem nincs benne nagy hülyeség.
-
Ezt a kódot még én írtam anno, más segítségére sietve.
Azonban eredetileg nem ez volt a célja, hanem ez:
$Szam1 = rand(1, 4);
$Szam2 = rand(1, 4);
if($Szam1 == $Szam2)
{
for($i= 0; $Joszam != 1; $i++)
{
$Szam2 = rand(1, 4);
if($Szam2 != $Szam1)
{
$Joszam = 1;
}
}
$Joszam = 0;
echo \'Amennyiben ezt az üzenetet látod, eleinte ugyanaz a két szám lett legenerálva.<br>
Ezek után persze nem lenne szabad a szöveg alatt ugyanazt a két számot látnod.<br><br>\';
}
echo $Szam1;
echo \'<br>\';
echo $Szam2;
Az eredeti PHP kód teljesen jól mûködik, annak feladatát végezve. Aztán ezt átalakítottam a telefonszámos témához, de nem teljesen jól, csak a lényeget magyarázva, tehát nem 100%-osan mûködõ képesen, ugyanis amikor megegyezik a generált szám a meglévõvel, ugyan újat generál, de lehet, hogy megegyezik az az elõtti számok egyikével, szóval bukta kicsit a dolog. Azonban ezt most javítom, sokkal egyszerûbb módszerrel:
new mysql_string[64]; // A lekérdezést ebben a string típusú változóban tároljuk
new bool:Joszam = false; // Mondjuk azt a programnak, hogy a szám megfelelõ
new bool:MegfeleltEMar = false; // Ez arra fog kelleni, hogy megtudjuk, az új számot is ellenõriznünk kell e
new bool:EloszorKerdezunkE = true; // Ha az elsõ generált szám megfelelõ, ne fusson le ismét a ciklusmag
new Szam = random(8999) + 1000; // Generálunk egy random számot
while(Joszam == false) // Elindul ez a while ciklus. Addig ismétlõdik, ameddig a Joszam értéke true nem lesz
{
format(mysql_string, sizeof(mysql_string), \"SELECT Teloszam FROM Jatekosok WHERE Teloszam = \'%d\'\", Szam); // Lekérdezés formázása, melyben a feltétel a generált szám lesz
mysql_query(mysql_string); // Lekérdezés
mysql_store_result(); // Eltároljuk az eredményt
new Sorok = mysql_num_rows(); // Megnézzük, hogy hány sor felelt meg a feltételnek
if(Sorok != 0) // Ha van találat, tehát a szám már szerepel az adatbázisban, akkor...
{
Szam = random(8999) + 1000; // ...generálunk egy másik random számot.
MegfeleltEMar = false; // Ha esetleg az elõzõ próbálkozásnál már generáltunk volna a létezõ szám helyett egy újat, de az is létezne, visszaállítjuk az értéket falsera, amely azt jelzi, hogy a most generált számot is ellenõrznünk kell
if(EloszorKerdezunkE == true) // Ez az elágazás nem lényegre törõ, viszont megakadályozza, hogy az EloszorKerdezunkE változó értéke feleslegesen falsera állítódgatjon minden nem megfelelõ szám esetében. Ugyanis ha az elsõ szám rossz volt - már pedig rossz volt, ha ez az elágazás lefut -, akkor...
{
EloszorKerdezunkE = false; // ...beállítjuk, hogy nem elõször kérdezünk rá, hogy a szám megfelelõ e - elvégre rossz volt a szám, ami miatt ismét generálni fogunk egy random számot.
}
}
else if(MegfeleltEMar == false) // De ha nem szerepel, viszont most generálunk elõször új számot a leutóbbi létezõ szám helyére, akkor még nem állítjuk megfelelõre a számot, de közeledünk ennek megtételéhez.
{
if(EloszorKerdezunkE == true) // Ha elõször generáltunk számot, akkor kiléphetünk a ciklusból, elvégre biztosan megfelelõ a szám
{
Joszam = true; // A szám megfelelõvé tétele
}
else // Különben az újonnan generált számot is meg kell néznünk az adatbázisban, hogy szerepel e már
{
MegfeleltEMar = true; // Beállítjuk, hogy ha az újonnan generált szám is megfelelõ, a ciklusból kilépjünk.
}
}
else if(MegfeleltEMar == true)) // Ha az újonnan generált szám is megfelelõ volt, akkor...
{
Joszam = ture; // ...kiléphetünk a ciklusból, mert a számot megfelelõvé tesszük.
}
}
mysql_free_result(); // Felszabadítod az erõforrást
// Itt már a Szam értékbe biztosan nem fog megegyezni más telefonszámok értékével. Ha egyszerre több játékos használja a dolgot, érdemes rá tenni egy playerid-s tömböt.
// Frissíted az adatbázist, vagy amit akarsz csinálni, például:
format(mysql_string, sizeof(mysql_string), \"UPDATE Jatekosok SET Teloszam = \'%d\' WHERE Nev = \'%s\'\", Szam, Nev(playerid));
mysql_query(mysql_string);
Ha nem mûködne a sorok megszámlálása, azért elnézést kérek, de nem igazán vágom már az R6-ot, ugyanis egy jó ideje már R38-at használok. Maga a kód pedig mûködik, ha nem írtam el semmit.
-
Így le fog futni pár query (rossz esetben, vagy ha már sok telefonszám van), viszont (remélhetõleg) mûködik.
JatekosInfo[playerid][Telefon] = random(8999) + 1000; new kveri[256];
format(kveri, sizeof(kveri), \"SELECT Telefon FROM Jatekosok WHERE Telefon = \'%d\'\", JatekosInfo[playerid][Telefon]);
mysql_query(kveri);
mysql_store_result();
while(0 < mysql_num_rows()) { //Amíg van ilyen telefonszám, generálunk újat, és megint lekérjük, hogy megint megnézhesse.
mysql_free_result();
JatekosInfo[playerid][Telefon] = random(8999) + 1000;
format(kveri, sizeof(kveri), \"SELECT Telefon FROM Jatekosok WHERE Telefon = \'%d\'\", JatekosInfo[playerid][Telefon]);
mysql_query(kveri);
mysql_store_result();
}
format(kveri, sizeof(kveri), \"UPDATE Jatekosok SET Telefon = \'%d\' WHERE Nev = \'%s\'\", JatekosInfo[playerid][Telefon], nev);
mysql_query(kveri);
Sok szerencsét, további jó scriptelést! :thumbsup:
Szerk. & u.i.: gyenge matematikai tudással rendelkezõ egyénem megkísérelt egy kis számítást. Az eredmény: 1000 regisztrált játékos esetében, minden 9-10. vásárlásnál kell 3 helyett 4-szer queryt futtatni. Ez nem fogja kinyírni a szerveredet. ;D
Ha pedig az ezzel a rendszerrel regisztrálható játékosok maximumát vesszük, 8-ból 5-ször (az esetek 62,5%-ában) kell dupla queryt futtatni.
-
Sziasztok!
Az alábbi kódom,melynek az lenne a célja,hogy megakadályozza a telefonszámok duplázódását,nem mûködik.
new string[256];
new Szam = random(8999) + 1000;
new mysql_line[256];
format(string, sizeof(string), \"SELECT Telefon FROM Jatekosok\");
mysql_query(string);
mysql_store_result();
while(mysql_fetch_row(mysql_line))
{
if(Szam == strval(mysql_line))
{
new i,Joszam;
for(i = 0; Joszam != 1; i++)
{
Szam = random(8999) + 1000;
if(Szam != strval(mysql_line))
{
Joszam = 1;
}
}
}
}
mysql_free_result();
format(string, sizeof(string), \"UPDATE Jatekosok SET Telefon = \'%d\' WHERE Nev=\'%s\'\", Szam, nev);
mysql_query(string);
JatekosInfo[playerid][Telefon]= Szam;[/code;
-
Lekérdezed hogy van-e már, és kész.
SELECT Nev,Telefonszam FROM Felhasznalok WHERE Telefonszam = 123
[mod]Code tag kihelyezve.[/mod]
-
Így jó?
De miért nem jó másik megoldás?
new string[256];
new JoSzam;
new Szam = random(8999) + 1000;
format(string, sizeof(string), \"SELECT * FROM Jatekosok WHERE Telefon=\'%d\'\",Szam);
mysql_query(string);
mysql_store_result();
new value = mysql_num_rows();
mysql_free_result();
if(value == 1)
{
for(new x=0;JoSzam!=1;x++)
{
Szam = random(8999) + 1000;
format(string, sizeof(string), \"SELECT * FROM Jatekosok WHERE Telefon=\'%d\'\",Szam);
mysql_query(string);
mysql_store_result();
value = mysql_num_rows();
mysql_free_result();
if(value == 0)
{
JoSzam=1;
break;
}
}
}
-
Most nem tudok konkrét kódot írni, bocsi.
Generálj random számot.
Válaszd ki az azonos számo(ka)t, de írd a query végére, hogy LIMIT 1, így nem fog továbbfutni, ha talált egyet.
Tárold az eredményeket, kérd le a talált sorok számát mondjuk a sorok változóba.
while(sorok)
{
amíg vannak sorok (1db), random szám, megint kérjen le, megint store_result, megint mysql_num_rows, és kész. Addig fogja lekérdezgetni, amíg nem lesz nulla azonos sor
}
Már lehet dolgozni ezzel a számmal.
Remélem nincs benne nagy hülyeség.
-
Ezt a kódot még én írtam anno, más segítségére sietve.
Azonban eredetileg nem ez volt a célja, hanem ez:
$Szam1 = rand(1, 4);
$Szam2 = rand(1, 4);
if($Szam1 == $Szam2)
{
for($i= 0; $Joszam != 1; $i++)
{
$Szam2 = rand(1, 4);
if($Szam2 != $Szam1)
{
$Joszam = 1;
}
}
$Joszam = 0;
echo \'Amennyiben ezt az üzenetet látod, eleinte ugyanaz a két szám lett legenerálva.<br>
Ezek után persze nem lenne szabad a szöveg alatt ugyanazt a két számot látnod.<br><br>\';
}
echo $Szam1;
echo \'<br>\';
echo $Szam2;
Az eredeti PHP kód teljesen jól mûködik, annak feladatát végezve. Aztán ezt átalakítottam a telefonszámos témához, de nem teljesen jól, csak a lényeget magyarázva, tehát nem 100%-osan mûködõ képesen, ugyanis amikor megegyezik a generált szám a meglévõvel, ugyan újat generál, de lehet, hogy megegyezik az az elõtti számok egyikével, szóval bukta kicsit a dolog. Azonban ezt most javítom, sokkal egyszerûbb módszerrel:
new mysql_string[64]; // A lekérdezést ebben a string típusú változóban tároljuk
new bool:Joszam = false; // Mondjuk azt a programnak, hogy a szám megfelelõ
new bool:MegfeleltEMar = false; // Ez arra fog kelleni, hogy megtudjuk, az új számot is ellenõriznünk kell e
new bool:EloszorKerdezunkE = true; // Ha az elsõ generált szám megfelelõ, ne fusson le ismét a ciklusmag
new Szam = random(8999) + 1000; // Generálunk egy random számot
while(Joszam == false) // Elindul ez a while ciklus. Addig ismétlõdik, ameddig a Joszam értéke true nem lesz
{
format(mysql_string, sizeof(mysql_string), \"SELECT Teloszam FROM Jatekosok WHERE Teloszam = \'%d\'\", Szam); // Lekérdezés formázása, melyben a feltétel a generált szám lesz
mysql_query(mysql_string); // Lekérdezés
mysql_store_result(); // Eltároljuk az eredményt
new Sorok = mysql_num_rows(); // Megnézzük, hogy hány sor felelt meg a feltételnek
if(Sorok != 0) // Ha van találat, tehát a szám már szerepel az adatbázisban, akkor...
{
Szam = random(8999) + 1000; // ...generálunk egy másik random számot.
MegfeleltEMar = false; // Ha esetleg az elõzõ próbálkozásnál már generáltunk volna a létezõ szám helyett egy újat, de az is létezne, visszaállítjuk az értéket falsera, amely azt jelzi, hogy a most generált számot is ellenõrznünk kell
if(EloszorKerdezunkE == true) // Ez az elágazás nem lényegre törõ, viszont megakadályozza, hogy az EloszorKerdezunkE változó értéke feleslegesen falsera állítódgatjon minden nem megfelelõ szám esetében. Ugyanis ha az elsõ szám rossz volt - már pedig rossz volt, ha ez az elágazás lefut -, akkor...
{
EloszorKerdezunkE = false; // ...beállítjuk, hogy nem elõször kérdezünk rá, hogy a szám megfelelõ e - elvégre rossz volt a szám, ami miatt ismét generálni fogunk egy random számot.
}
}
else if(MegfeleltEMar == false) // De ha nem szerepel, viszont most generálunk elõször új számot a leutóbbi létezõ szám helyére, akkor még nem állítjuk megfelelõre a számot, de közeledünk ennek megtételéhez.
{
if(EloszorKerdezunkE == true) // Ha elõször generáltunk számot, akkor kiléphetünk a ciklusból, elvégre biztosan megfelelõ a szám
{
Joszam = true; // A szám megfelelõvé tétele
}
else // Különben az újonnan generált számot is meg kell néznünk az adatbázisban, hogy szerepel e már
{
MegfeleltEMar = true; // Beállítjuk, hogy ha az újonnan generált szám is megfelelõ, a ciklusból kilépjünk.
}
}
else if(MegfeleltEMar == true)) // Ha az újonnan generált szám is megfelelõ volt, akkor...
{
Joszam = ture; // ...kiléphetünk a ciklusból, mert a számot megfelelõvé tesszük.
}
}
mysql_free_result(); // Felszabadítod az erõforrást
// Itt már a Szam értékbe biztosan nem fog megegyezni más telefonszámok értékével. Ha egyszerre több játékos használja a dolgot, érdemes rá tenni egy playerid-s tömböt.
// Frissíted az adatbázist, vagy amit akarsz csinálni, például:
format(mysql_string, sizeof(mysql_string), \"UPDATE Jatekosok SET Teloszam = \'%d\' WHERE Nev = \'%s\'\", Szam, Nev(playerid));
mysql_query(mysql_string);
Ha nem mûködne a sorok megszámlálása, azért elnézést kérek, de nem igazán vágom már az R6-ot, ugyanis egy jó ideje már R38-at használok. Maga a kód pedig mûködik, ha nem írtam el semmit.
-
Így le fog futni pár query (rossz esetben, vagy ha már sok telefonszám van), viszont (remélhetõleg) mûködik.
JatekosInfo[playerid][Telefon] = random(8999) + 1000; new kveri[256];
format(kveri, sizeof(kveri), \"SELECT Telefon FROM Jatekosok WHERE Telefon = \'%d\'\", JatekosInfo[playerid][Telefon]);
mysql_query(kveri);
mysql_store_result();
while(0 < mysql_num_rows()) { //Amíg van ilyen telefonszám, generálunk újat, és megint lekérjük, hogy megint megnézhesse.
mysql_free_result();
JatekosInfo[playerid][Telefon] = random(8999) + 1000;
format(kveri, sizeof(kveri), \"SELECT Telefon FROM Jatekosok WHERE Telefon = \'%d\'\", JatekosInfo[playerid][Telefon]);
mysql_query(kveri);
mysql_store_result();
}
format(kveri, sizeof(kveri), \"UPDATE Jatekosok SET Telefon = \'%d\' WHERE Nev = \'%s\'\", JatekosInfo[playerid][Telefon], nev);
mysql_query(kveri);
Sok szerencsét, további jó scriptelést! :thumbsup:
Szerk. & u.i.: gyenge matematikai tudással rendelkezõ egyénem megkísérelt egy kis számítást. Az eredmény: 1000 regisztrált játékos esetében, minden 9-10. vásárlásnál kell 3 helyett 4-szer queryt futtatni. Ez nem fogja kinyírni a szerveredet. ;D
Ha pedig az ezzel a rendszerrel regisztrálható játékosok maximumát vesszük, 8-ból 5-ször (az esetek 62,5%-ában) kell dupla queryt futtatni.