Bann&Timebann in Tabelle eintragen/auslesen/löschen.

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
  • stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()){
    mysql_fetch_field("Grund",reason);
    mysql_fetch_field("Admin",admin);
    mysql_fetch_field("Zeit",result);
    mysql_free_result();
    zeit = strval(result);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    } //Fehlte
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    return 1;
    }

  • stock CheckBannedUser (playerid)
    {
    new zeit = gettime();
    new query[256];
    format(query, sizeof(query), "DELETE FROM banns WHERE Zeit < %d; SELECT * FROM banns WHERE (IP = '%s' OR Name = '%s') AND (Zeit >= %d OR Zeit = -1) LIMIT 1", zeit, SpielerIP(playerid), SpielerInfo[playerid][pName], zeit);
    mysql_query(query);
    mysql_store_result();
    if (!mysql_num_rows()) { mysql_free_result(); return 0; } // Spieler ist nicht gebannt
    new result;
    mysql_fetch_field("Zeit", result);
    mysql_free_result();
    return result; // Spieler ist für # Sekunden gebannt (-1 = Für immer)
    }


    Um dir mal ne etwas gescheitere Herangehensweise zu zeigen.
    Der Stock gibt dir im If-Clause aus, ob ein Spieler gebannt ist oder nicht (0 = nicht gebannt, rest = Banzeit, -1 = permban)


    Habs jetzt hier im Editor geschrieben, Tippfehler sind also möglich :p


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Ja sorry, result muss natürlich n String sein und den musste dann zum Int konvertieren.


    Meine Herangehensweise ist, dass du nicht 120 Zeilen sinnlosen Quelltext hast. Der Stock gibt dir quasi direkt den Wert wieder, falls ein Spieler in der DB vorkommt.
    Somit kannst du dann im Connect einbauen



    if (CheckUserBanned(playerid)) {
    printf("Spieler ist für %d Sekunden gebannt", CheckUserBanned(playerid));
    } else {
    // Spieler ist nicht gebannt
    }


    Prinzipiell geht es darum Zeilen und vor allem Rechenleistung zu sparen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Ach ja, da steht zwei mal else untereinander, hatte ich übersehen. :pinch:


    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    mysql_fetch_field("Grund",reason);
    mysql_fetch_field("Admin",admin);
    mysql_fetch_field("Zeit",result);
    mysql_free_result();
    zeit = strval(result);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    }
    return 1;
    }
    }


    Jetzt aber.



    (Kleine Anmerkung an LeijaT: Das ist das was ich immer wieder predige. Optimierte Codes sind zwar gut, wenn man sie aber jemandem gibt der damit nichts anfängt haben sie keinen Sinn, ein Programmierer sollte seinen Code verstehen und da gehört es zum Lernprozess, dass man erst mit weniger "schnellen" Codes arbeitet. #Erfahrung ;) [Nichtsdestotrotz ist der Code, bzw. die Idee dahinter, natürlich kaum zu übertreffen!] )

  • da gehört es zum Lernprozess, dass man erst mit weniger "schnellen" Codes arbeitet.


    Auch wenns etwas off-topic wird, sorry, aber das ist Schwachsinn. Der Lernprozess sollte beinhalten, dass man eigenständig und autodidaktisch die unnötige Variante perfektioniert und die Produktivität des Programms steigert.
    Wer zulässt, dass ein Anfänger mit so einem Larifarizeugs durchstartet, hat in meinen Augen bereits zugelassen, dass es unfähige Programmierer gibt. :p


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • @FleX_GuN: Dann hast du die neue Version, da ist's andersrum und mit _row:
    mysql_fetch_field_row(reason,"Grund");
    mysql_fetch_field_row(admin,"Admin");
    mysql_fetch_field_row(result,"Zeit");



    das ist Schwachsinn.


    Nein, das ist meine begründete Meinung und mit ziemlicher Sicherheit auch die Meinung des Großteils hier und aller lehrenden Personen. Es macht doch keinen Sinn, jemandem, der einen Code nicht versteht, dem diesen zu geben. Da lernt er überhaupt nichts dabei. Außerdem, wenn der Code fehlerhaft ist, dann weiß er keineswegs, wie er diesen reparieren soll. Daher ist es wesentlich besser für den Lernprozess, wenn man klein anfängt.
    Man fängt ja auch nicht mit Quadratischen Funktionen in der ersten Klasse an, sondern erstmal mit Plus und Minus, Mal und Geteilt, weil diese Dinge aufeinander aufbauen. So baut auch die Code-Optimierung auf das eigentliche Programmieren auf. Das ist eine Tatsache, das ist sowohl in der Schule als auch im Betrieb so. Unter keinen Umständen würde mein Ausbilder mir einen optimierten Code hinklatschen und sagen: Mach mal. Wo ist denn da der Lernprozess? Man sollte zu aller erst den Umgang lernen, später kann man den Code dann optimieren, sofern nötig.
    Du kannst mir nicht sagen, dass du nicht klein angefangen hast. Und dazu gehört eben auch, dass ein Code nicht optimal ist. ;)


    Der Lernprozess sollte beinhalten, dass man eigenständig und autodidaktisch die unnötige Variante perfektioniert und die Produktivität des Programms steigert.


    Wie du es ja sagst, nur leider widerspricht das deinem Widerspruch meiner Meinung. Wie soll er sich selbst die optimale Lösung erarbeiten wenn er sie hingeklatscht bekommt? Nichts gegen das Geben von Code-Teilen, die sollten aber verständlich sein. Und dieser Thread unterstützt doch zu 100% meine Aussage, nämlich dass es keinen Sinn macht einen Code zu posten, den der Fragesteller nicht mal versteht, er verwendet ihn noch nicht mal.


    Wer zulässt, dass ein Anfänger mit so einem Larifarizeugs durchstartet, hat in meinen Augen bereits zugelassen, dass es unfähige Programmierer gibt. :p


    Das würde schlussfolgernd heißen, dass alle Programmierer unfähig sind.
    Jeder startet mit simplen Methoden, das ist überall so. Schule, Uni, Betrieb. Ich hab es in allen drei Formen miterlebt, ich konnte in allen drei Formen die Programmierung bereits und dachte mir auch oft, dass es wesentlich ressourcenschonender geht, ja! Aber jemand der sich noch nicht so intensiv damit auskennt, der muss erst das Grundwissen verstehen und können, bevor er tiefer in die Materie eintauchen kann. Ansonsten versteht er es nicht. Das beste Beispiel ist dieser Thread.
    Mag sein, dass es Ausnahmen gibt, die bestätigen aber die Regel und zwar, dass 99,9% hier mit einem optimierten Code viel weniger bis nichts anfangen können.


    Damit meine Meinung als "Schwachsinn" abgestempelt wird, hätte ich wenigstens ein Argument erwartet und keinen in sich widersprechenden Widerspruch ohne jegliche Begründung.

  • Probiers mal so, vllt liegts nur an der einen abfrage.

    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    if(mysql_retrieve_row())
    {
    mysql_fetch_field("Grund",reason);
    mysql_fetch_field("Admin",admin);
    mysql_fetch_field("Zeit",result);
    mysql_free_result();
    zeit = strval(result);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    }
    }
    return 1;
    }
    }

  • Man fängt ja auch nicht mit Quadratischen Funktionen in der ersten Klasse an, sondern erstmal mit Plus und Minus


    Und dazu gehört eben auch, dass ein Code nicht optimal ist.


    Ich glaube wir reden da etwas aneinander vorbei. Selbstverständlich und natürlicherweise wird ein Anfänger in seiner Programmierung machen und auch der etwas Fortgeschrittenere wird sich immer wieder mal dabei erwischen. Aber auch in der Schule lernst du schon, selbst wenn du mit Plus und Minus anfängst, dass 1 + 1 nunmal 2 ist. Wenn du da antwortest, es sei drei, wird dir auch keiner nachsagen "Ach, er ist ja noch Erstklässler, lassen wir ihm mal noch im Glauben seine Antwort sei die Korrekte."


    Dass der Threadersteller an dieser Stelle die 12 Zeilen nicht versteht bestätigt imho eigentlich nur, dass der Lernprozess hier in der Community generell völlig falsch angepackt wird. Denn wie du schon sagst: Zum Lernen gehören kleine Schritte, die auf einander aufbauen.
    Wer nicht weiß, wie man eine Funktion innerhalb eines If-Clauses aufruft (Er muss ja nichtmal verstehen, was die Funktion in sich selbst eigentlich tut und was die Funktion ausgibt hab ich ihm sogar noch dazu geschrieben), der ist mit einem Bansystem nach meinem Erachten definitiv zu weit gelaufen und sollte nochmal ein paar Schritte rückwärts machen.


    Nebenbei habe ich auch nicht deine Meinung als Schwachsinn bezeichnet, sondern die Art, wie du lernende Programmierer begleitest. Denn davon haben sie einfach nichts und das bestätigt sich hier von Thread zu Thread jeden Tag auf's Neue. Das ist keine Vermutung, das ist keine Indikation, das ist keine Meinung, das ist Fakt. Geh' die Scripting-Base durch und schau dir die Threads einfach mal an, diesen mit eingeschlossen. Hier hat garkeiner wirklich vor auch nur ansatzweise was gescheit zu lernen, sondern will hier und jetzt ne eigene Matrix programmieren, ohne zu lernen, wie du das überhaupt geht.


    Mir persönlich ist das egal, ich kann es bereits und störe mich nicht darin, wenn die Leute mit ihrem Pfusch hier nur weiter und weiter Unfug verbreiten, aber dennoch sollte der Hinweis und die Möglichkeit vorhanden sein, sein Wissen zu erweitern. Wer das nicht will, weil er "es nicht auf Anhieb" versteht, lässt es halt bleiben.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Obiger Code ausgebessert:
    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64], time[20],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    if(mysql_retrieve_row())
    {
    mysql_fetch_field_row(reason,"Grund");
    mysql_fetch_field_row(admin,"Admin");
    mysql_fetch_field_row(time,"Zeit"); //result fand ich nirgends definiert, habe es mal "time" genannt.
    mysql_free_result();
    zeit = strval(time);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    }
    }
    return 1;
    }
    }



    LeijaT: Dem kann ich nur zustimmen, das kam zuvor etwas anders rüber. Damit wäre das geklärt, war auch keineswegs böse gemeint, falls das so rüberkam.
    Zu meiner begleitenden Art: Ich weiß, wenn jemand was lernen will und wenn jemand nur eine Antwort haben will. So fällt dann auch der meine Post aus.

  • mysql_query(query);
    mysql_store_result();

    Hat das einen Grund warum das zweimal da steht? Einmal vor den "new" s und einmal danach? Mir wäre keiner bekannt.
    Mach das mal nach den "new" s weg.


    Auf jeden Fall findet er in dem ausgegebenen result keine Zeile, also der query gibt nichts zurück. Könnte daran liegen.
    Wenn es immer noch nicht tut, derzeitiger Code mit dazu posten.

  • Dann schalte mal den Debug Modus des MySQL Plugins ein, und dann poste was im server_log.txt steht, nachdem die Überprüfung auf Ban oder nicht stattgefunden hat. Das Query scheint irgendwas falsches bzw. gar nichts zurückzugeben.

  • Dein Script arbeitet einwandfrei, allerdings findet deine mySQL keinen Eintrag nach deinen Suchkriterien (IP/Name) in der Datenbank. Demnach trifft auch keiner deiner If-Clauses zu.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Dann hast du offenbar sowohl IP als auch Namen falsch eingetragen. Was steht denn momentan alles in der Datenbank drin?


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'