Random Handynummer

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo Brotfische,


    Wenn ein User sich regestriert, möchte ich eine Random Handynummer vergeben. Nun weiß ich nicht wie ich die Handynummer in der Datenbank abfrage, ob es die Handynummer bereits gibt..
    Auserdem habe ich bis jetzt noch nicht mit der Funktion "Random" gearbeitet, also ich weiß auch nicht ganz wie ich das mit der Handynummer mache.


    Ich hoffe ihr könnt mir helfen :D


    MfG German_ScripterHD


    Mit freundlichen Grüßen
    German_ScripterHD

  • Auserdem habe ich bis jetzt noch nicht mit der Funktion "Random" gearbeitet, also ich weiß auch nicht ganz wie ich das mit der Handynummer mache.


    Naja, wenn die Handynummer 4 stellig sein soll, dann machst du das so:


    new number = random(9000)+1000;


    Und dann überprüfst du halt noch ob die Nummer bereits existiert oder nicht in der Datenbank...einfach mit SELECT durch die Spieler Loopen :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Würde das so gehn?




    stock Nummer()
    {
    new Query[128], count;
    new Nummer = random(89999) + 10000;
    format(Query, sizeof(Query), "SELECT * FROM `User` WHERE `Nummer` = '%s'", Nummer);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    for(new i = 0; i < mysql_query(Query); i++)
    {
    if(count == 0)
    {
    return Nummer;
    }
    else
    {
    Nummer();
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen
    German_ScripterHD

  • Beitrag von Fernando_Jizuya ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • stock Nummer()
    {
    new Query[128], count, security;
    new nr = random(89999) + 10000;
    Nummer_AGAIN:
    format(Query, sizeof(Query), "SELECT * FROM `User` WHERE `Nummer` = '%d'", nr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    if(count == 0)
    {
    return Nummer;
    }
    else
    {
    nr++;
    if(nr > 99999)
    {
    if(security == 1) return -1;
    security = 1;
    nr = 10000;
    }
    goto Nummer_AGAIN;
    }
    return -1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Nein, nicht wirklich. Die Nummern würden ja auch in der Datenbank (bzw. in der Tabelle) stehen, also würdest du ja manche Nummern doppelt abfragen, was ja keinen Sinn machen würde.

  • Nein, nicht wirklich. Die Nummern würden ja auch in der Datenbank (bzw. in der Tabelle) stehen, also würdest du ja manche Nummern doppelt abfragen, was ja keinen Sinn machen würde.


    Naja, kommt drauf an wann sich die Spielertabelle mit den Nummer updated.
    Stell dir vor du kaufst dir eine Nummer(111), deine Spielertabelle wurde noch nicht geupdated.
    Danach kaufe ich mir die Nummer(111) und danach werden die ganzen Spielertabellen geupdated, jetzt haben wir beide die gleiche Nummer, da der Code ja nur durch die Spielertabelle geht :P

  • Der Fall kann nicht vorkommen, da die Queries nacheinander ausgeführt werden, sprich zuerst das UPDATE, dann das SELECT.
    Natürlich muss er, wenn er die Nummer vergeben hat, sofort den Spieler speichern.


    Man könnte die Prüfung allerdings zur Sicherheit einbauen, schaden tut es nicht. Das kann er ja selbst entscheiden.

  • Das hat aber nichts damit zu tun, dass man es vermeiden sollte, das sind persönliche Präferenzen.
    Klar kann ich es auch so, oder ähnlich, schreiben, allerdings finde ich das nicht so toll, da man eben die Prüfung und die Variable benötigt.

    Spoiler anzeigen
    stock Nummer()
    {
    new Query[128], count, security;
    new nr = random(89999) + 10000;
    new bool:again = true;
    while(again)
    {
    again = false;
    format(Query, sizeof(Query), "SELECT * FROM `User` WHERE `Nummer` = '%d'", nr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    if(count == 0)
    {
    return Nummer;
    }
    else
    {
    nr++;
    if(nr > 99999)
    {
    if(security == 1) return -1;
    security = 1;
    nr = 10000;
    }
    again = true;
    }
    }
    return -1;
    }


    Ich bevorzuge goto an dieser Stelle, das ist für die meisten auch nachvollziehbarer.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Der Code ist sowas von unsinn. Wieso die eine random Nummer plus 1 rechnen statt neu zu generieren? Damit sparst du dir den unsinnigen "security" over 9000 quatsch.



    Nummer()
    {
    new Query[128], count = 1, nr = -1;
    while (count != 0)
    {
    nr = 10000 + random(89999);
    format(Query, sizeof(Query), "SELECT Nummer FROM `User` WHERE `Nummer` = '%d'", nr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    }
    return nr;
    }


    Was ist nun nachvollziehbarer? Ich würde mal behaupten meins ist aufjedenfall ressourcensparender. ;)

  • Theoretisch möglich aber da das praktisch mehr als unwahrscheinlich ist kann man das vernachlässigen.
    Bei deiner Variante kann es im ungünstigesten Fall passieren das er nach einem Versuch bereits abbricht weil er bei 99999 angekommen ist.
    Dann wird -1 zurück gegeben obwohl noch zig zehntausende Kombinationen frei sind, auch nicht Sinn der Sache.

  • hängt sich der Server auf


    Das tut er bei euch beiden.


    Nehmen wir mal an es sind fast alle Nummern belegt, dann freezt der Server solange bis er die richtige Zahl gefunden hat.
    Das kann je nach Menge dauern.


    Sinniger wäre es womöglich, wenn man sich alle Daten aus der Datenbank zieht und diese dann auswertet.
    Vorteil: Der Server muss nicht auf den MySQL Response warten
    Nachteil: Mehr Ressourcen verbrauch.


    Alternativ: threaded Querys, dauert zum auswerten vllt etwa länger - dafür kann sich der Server sich nicht (zeitweise) aufhängen.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Theoretisch möglich aber da das praktisch mehr als unwahrscheinlich ist kann man das vernachlässigen.


    Bei 100.000 Nummern ist das nicht zu vernachlässigen, da das relativ schnell voll sein kann. Und selbst bei höheren Zahlen sollte man keine theoretischen Lücken lassen, das macht man einfach nicht.


    Nehmen wir mal an es sind fast alle Nummern belegt, dann freezt der Server solange bis er die richtige Zahl gefunden hat.


    Nein. Daher die security Variable.
    (Edit: Ach fast alle, ja klar, das dauert bei MySQL etwas. Sowas müsste man ohnehin komplett anders lösen.)



    Ich hatte allerdings vergessen, die Nummer bei 99999 wieder auf 10000 zu setzen, das ist jetzt behoben.

  • Nein. Daher die security Variable.


    Du gehst 99999 mal durch und willst mir erzählen, wegen deiner security variable freezt der Server nicht ?


    Der Server wartet trotzdem so lange, bis die Funktionen abgeschlossen sind, da hilft dir deine security variable nicht.
    Sie schützt vielleicht vor der Endlosschleife, aber davon hab ich nicht gesprochen

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen