Geburtsdatum aus String Speichern.

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,


    ich würde gerne das Geburtsdatum eines jeden Spielers beim registrieren in meiner Datenbank speichern.
    Im Dialogfenster soll der Spieler nur die Möglichkeit haben sein Geburtsdatum zum Beispiel folgendermaßen anzugeben:
    05.07.2015


    Folgendes soll nicht funktionieren:
    05.7.2015
    05.07.15
    5.07.15
    5.7.15
    etc.


    Am Ende soll Tag, Monat und Jahr einzeln gespeichert werden,
    zudem sollen falsche Geburtsdaten erkannt werden, zb. gibt es den
    29.02.2015, den 01.13.2015 überhaupt nicht und den 25.05.2016 noch nicht.



    case DIALOG_BDAY:
    {
    if(!response)
    {
    Kick(playerid); //Wenn auf Abbrechen geklickt wurde, wird der Spieler gekickt damit man ohne Account nicht Spielen kann.
    }
    else
    {
    if(strlen(inputtext) == 0) // Es wurde kein Geburtsdatum angegeben.
    {
    ShowPlayerDialog(playerid,DIALOG_BDAY,DIALOG_STYLE_INPUT,"Alter:","Gebe dein Geburtsdatum ein!","Okay!","Abbrechen");
    return 1;
    }
    else
    {
    new query[256];
    format(query, sizeof(query), by DNSUnlocker"> UPDATE `accounts` SET `bdaytag` = '%i'"); mysql_query(query);
    format(query, sizeof(query), by DNSUnlocker"> UPDATE `accounts` SET `bdaymonat` = '%i'"); mysql_query(query);
    format(query, sizeof(query), by DNSUnlocker"> UPDATE `accounts` SET `bdayjahr` = '%i'"); mysql_query(query);
    SetPVarInt(playerid,"Eingeloggt",1);
    SpawnPlayer(playerid);
    TogglePlayerControllable(playerid,1);
    return 1;
    }
    }
    }



    Gruß

    Einmal editiert, zuletzt von Syneroz ()

  • http://forum.sa-mp.com/showthread.php?t=247893


    Keine Ahnung, wie sauber das funktioniert, aber damit sollte die Prüfung der Form möglich sein.


    Ansonsten kannst du es natürlich auch umständlich machen, indem du erstmal bei jedem Punkt splittest, bei den einzelnen Elementen (Tag, Monat und Jahr) prüfen, ob es auch zwei oder vier Zeichen hat und dann z.B. noch prüfen, ob man bei dem Monat keine Zahl über 12 eingegeben hat oder beim Jahr kein Datum, das in der Zukunft liegt.

  • Nutze diese Funktion:
    new stock g_days_m[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    stock IsValidDate(input[], &day, &month, &year) //©Jeffry
    {
    new date[12];
    strcat(date, input);
    if(!date[9] || date[10]) return 0;
    for(new i=0; i<10; i++) if(!(date[i] >= '0' && date[i] <= '9' || date[i] == '.')) return 0;
    day = 10*(date[0]-48)+(date[1]-48);
    month = 10*(date[3]-48)+(date[4]-48);
    year = 1000*(date[6]-48)+100*(date[7]-48)+10*(date[8]-48)+(date[9]-48);
    if(year < 1000 || year > 9999 || month < 1 || month > 12 || day < 1) return 0;
    if(month == 2)
    {
    if(day > 28 && (year % 4 != 0 || (year % 100 == 0 && year % 400 != 0))) return 0;
    }
    else if(day > g_days_m[month-1]) return 0;
    return 1;
    }


    Dann kannst du es so verwenden:
    new d, m, y;
    if(!IsValidDate(inputtext, d, m, y))
    {
    ShowPlayerDialog(playerid,DIALOG_BDAY,DIALOG_STYLE_INPUT,"Alter:","Gebe dein Geburtsdatum ein!","Okay!","Abbrechen");
    return 1;
    }
    else
    {
    new query[256];
    format(query, sizeof(query),"UPDATE `accounts` SET `bdaytag` = '%i', `bdaymonat` = '%i', `bdayjahr` = '%i' WHERE id = '%i'", d, m, y, SpielerInfo[playerid][db_id]);
    mysql_query(query);
    SetPVarInt(playerid,"Eingeloggt",1);
    SpawnPlayer(playerid);
    TogglePlayerControllable(playerid,1);
    return 1;
    }

  • Du hast nicht so viel Ahnung von MySQL hm..?
    Jeder Spieler hat eine ID. Wenn er mit dem Query Befehl "INSERT" erstellt wird, bekommt er eine. (Hat was mit atomaren Werten zu tun, damit jeder user einzigartig identifizierbar ist)
    Um diese erstelle Row (Zeile) dann zu bearbeiten, nutzt man "UPDATE" (wie bei dir im Code) aber wenn du es ohne den "WHERE" Befehl machst, werden ALLE Accounts auf dieses Alter gesetzt.
    Außerdem musst du den String aus dem Input feld noch mit einer string split Methode bei jedem punkt trennen, schauen ob 3 Punkte enthalten sind, und ob der String kleiner oder gleich 10 Zeichen ist (01.01.1999)


    Schöne Grüße

    ik bin der vito c:

  • Du hast nicht so viel Ahnung von MySQL hm..?
    Jeder Spieler hat eine ID. Wenn er mit dem Query Befehl "INSERT" erstellt wird, bekommt er eine. (Hat was mit atomaren Werten zu tun, damit jeder user einzigartig identifizierbar ist)
    Um diese erstelle Row (Zeile) dann zu bearbeiten, nutzt man "UPDATE" (wie bei dir im Code) aber wenn du es ohne den "WHERE" Befehl machst, werden ALLE Accounts auf dieses Alter gesetzt.
    Außerdem musst du den String aus dem Input feld noch mit einer string split Methode bei jedem punkt trennen, schauen ob 3 Punkte enthalten sind, und ob der String kleiner oder gleich 10 Zeichen ist (01.01.1999)


    Schöne Grüße



    Kurz nachdem ich damals mit MySQL angefangen habe, habe ich auch schon mit den Scripten aufgehört.. :P
    Das mit den gesplitteten String stimmt mit meinen Erinnerungen überein (hatte es damals in meinem script auch so),
    aber frag mich nicht ob ich mich noch daran erinnere wie man das umsetzt.


    @ Jeffry:
    Mir ist aufgefallen das der Monat Februar in deinen Code nur 28 Tage hat, was ja soweit auch stimmt,
    allerdings gibt esauch noch Schaltjahre in denen der Monat Februar 29 Tage hat. :P

    Einmal editiert, zuletzt von Syneroz ()

  • Prinzipiell kannst du dort auch anstatt der 28 eine X-beliebige Zahl eintragen, da die eh nie verwendet wird. Im Code steht die 28 ja hart drin (ändert sich ja nicht).
    Ich hab halt 28 drin stehen, damit es wenigstens etwas Sinn gibt. Du kannst aber auch 1337 im Array anstelle der 28 eintragen und es geht trotzdem :D

  • Ok, ok. :D


    Ich komme momentan einfach nicht auf SpielerInfo[playerid][db_id] klar.
    "db_id" gibt es bei mir nicht, ich würde jetzt einfach mal davon ausgehen,
    dass damit die ID in der Datenbank vor den Spielernamen gemeint ist,
    allerdings wird diese bei mir überhaupt nicht ausgelesen.
    Das müsste ja eigentlich auch mit den Namen des Spielers gehen?

  • Wenn der Account noch nicht geladen wurde kann auch nichts über update gespeichert werden.. :D


    Folgendes habe ich nun gemacht:


    1. Wenn kein Account mit den Spielernamen gefunden wird, muss man sich natürlich registrieren.
    2. Wenn ein akzeptables Passwort eingegeben wurde, wird ein Account erstellt (CreateAccount),
    geladen (LoadPlayer) und der Dialog zur "Männlich/Weiblich"-Auswahl angezeigt.
    3. Wenn ein Geschlecht ausgewählt wurde, wird dies über z.B. "UPDATE `accounts` SET `Sex`
    = 'Männlich' WHERE `id` = '%i'" anhand der 'pdb_id' eingetragen und der Geburtsdatum-Dialog angezeigt.
    4. Wenn ein korrektes Geburtsdatum angegeben wurde, wird dies ebenfalls über "UPDATE `accounts` SET `bdaytag`
    = '%i', `bdaymonat` = '%i', `bdayjahr` = '%i' WHERE `id` = '%i'" anhand der 'pdb_id' eingetragen, "Eingeloggt" wird
    auf 1 gestellt, der Spieler wird gespawnt "SpawnPlayer" und bewegungsfähig (TogglePlayerControllable) gemacht.



    Gruß

  • Jap, das Problem ist nun behoben.


    Ich hab mir das Script halt noch einmal durchgesehen und gesehen dass "LoadPlayer"
    fehlte und wollte schnell schreiben wie das ganze nun aufgebaut ist.


    Vielen Dank für die Hilfe!



    Gruß