MySQL - Nur erste Zeichen überprüfen

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 suche eine MySQL-Funktion mit der es möglich ist nur den gewissen Teil eines Strings zu überprüfen, ählnich wie bei strcmp.


    Beispiel I pawn:
    strcmp("Nur bis hier und nicht weiter","Nur bis hier",strlen("Nur bis hier")) // würde 0 ausgeben


    Beispiel II pawn:
    new rangebanip[16]="161.180.207";
    new IP[16];
    GetPlayerIP(playerid,IP,sizeof(IP)); // IP = 161.180.207.2
    if(strcmp(rangebanip,IP,rangebanip,strlen(rangebanip))==0)
    {
    Kick(playerid);
    }



    Das ganze natürlich nur in einer MySQL-Tabelle mit mehreren Einträgen.


    Für Fragen stehe ich zur Verfügung.



    Dank im Vorraus!
    LG
    Pille

  • Danke für deine Hilfe, das funktioniert aber leider nicht..


    Beispiel:
    Ich habe folgende MySQL Tabelle:


    Code
    Name		IP
    
    
    User1		84.200.21
    User2		82.029.283


    Jetzt connected ein User mit der IP '84.200.21.982'.
    Ich möchte nun überprüfen ob ein Eintrag in der Tabelle vorhanden ist.



    Nur wie?

  • Nachdem keiner versteht wo das Problem liegt hier ein konkretes Beispiel:


    Ich will den User "User1" dauerhaft ausschließen, die letzten 3 Stellen seiner IP änden sich immer,
    wenn er seinen Router neustartet. Seine IP zum Bannzeitpunkt ist: 84.200.21.982


    Also trage ich in die Tabelle folgenden Eintrag ein:


    Code
    Name				IP
    
    
    User1		84.200.21



    Und nun der Code:
    public OnPlayerConnect(playerid)
    {
    new IP[16];
    GetPlayerIP(playerid,IP,sizeof(IP));
    new string[128];
    mysql_format(0,string,"SELECT 1 FROM tabellenname WHERE ...",IP);
    mysql_function_query(0,string,"Detected","i",playerid);
    }


    forward Detected(playerid);
    public Detected(playerid)
    {
    new fields,rows;
    cache_get_data(rows,fields);
    if(rows>0)
    {
    Kick(playerid);
    }
    }




    Jetzt fehlt nurnoch der MySQL-Query ^^

  • Da solltest du dich klarer ausdrücken:


    new partIP[16];
    GetPlayerIP(playerid,partIP,sizeof(partIP));
    new found;
    for(new i=0; i<strlen(partIP); i++)
    {
    if(partIP[i] == '.')
    {
    found++;
    if(found == 3)
    {
    strdel(partIP, i, strlen(partIP)); //Löscht ab dem letzten Punkt alle Stellen.
    break;
    }
    }
    }


    new string[128];
    mysql_format(0,string,"SELECT * FROM tabellenname WHERE blockierteIPs = '%s'",partIP);
    mysql_function_query(0,string,"Detected","i",playerid);

  • Nochmal:


    In einer Tabelle ist folgender Eintrag:


    Code
    Name		IP
    User1		84.200.21


    ALLE User dessen IP mit 84.200.21 anfängt sollen gekickt werden.


    Das funktioniert mit deinem Code.
    Aber was ist jetzt, wenn ich jede IP mit 27. sperren möchte?
    Dann sieht der Eintrag so aus:


    Code
    Name		IP
    User1		84.200.21
    User2		27.


    -> 27.0.0.1 Kick!
    -> 27.27.26.4.2.3.2 Kick!
    -> 27.961.026.29 Kick!
    -> 278.20.70.3 Kein Kick!



    Jetzt funktioniert dein Code nichtmehr.
    Ich brauch einen Universalcode...

  • Sicher funktioniert mein Code da. Du musst nur, um alle Möglichkeiten abzufragen einmal die abfrage mit der gesamten IP ohne meinen Code machen und danach mein Code drei mal setzen, jeweils folgend mit einem query. Dabei veränderst du jedes mal nur die


    if(found == 3)


    Einmal zu 2 und einmal zu 1. Einmal lässt du es mit der drei.
    Somit hast du alle Möglichkeiten inne.

  • Ich soll also wenn ich alle IPs gebannt habe, die mit 27 anfangen, bei einer 16stelligen IP, 14 Querys machen?


    Nee.. also da ist es ja noch besser das ganze mit LOCATE zu machen,
    ist aber auch keine gute Lösung.


    Dafür gibt es bestimmt eine SQL-Funktion, ich finde sie allerdings nicht.



    Dein Code hilft mir nicht wirklich weiter, tut mir leid :S

  • Schau mal:


    new partIP[16], partIP2[16], partIP3[16], IP[16];
    GetPlayerIP(playerid,partIP,sizeof(partIP));
    partIP2=partIP;
    partIP3=partIP;
    IP=partIP;
    new found;
    for(new i=0; i<strlen(partIP); i++)
    {
    if(partIP[i] == '.')
    {
    found++;
    if(found == 1) strdel(partIP, i, strlen(partIP));
    if(found == 2) strdel(partIP2, i, strlen(partIP2));
    if(found == 3) strdel(partIP3, i, strlen(partIP3));
    }
    }


    new string[128];
    mysql_format(0,string,"SELECT * FROM tabellenname WHERE blockierteIPs = '%s' OR blockierteIPs = '%s' OR blockierteIPs = '%s' OR blockierteIPs = '%s'",partIP, partIP2,partIP3,IP);
    mysql_function_query(0,string,"Detected","i",playerid);


    Damit hättest du es in einem query.

  • Dann wird bei der IP '27.961.026.29'


    27
    27.961
    27.961.026 ... verglichen.



    Und wenn ich jetzt 27.961.02 sperren will?
    Dann kann der User bei allen drei Sperrungen problemlos auf den Server.


    Das funktioniert so nicht, außerdem ist das extrem umständlich.
    Was schön in SAMP geht muss auch schön in MySQL gehen.

  • Aus über 4 Jahren Erfahrung kann ich dir sagen, dass du das so nie brauchen wirst.


    Die einzige Methode die mir einfällt wäre die, alle Zeilen auszulesen und dann durch das result durchloopen, und dann vergleichen, ob der IP-Wert aus der Datenbank in dem der Spieler-IP vorkommt (strfind von 1 bis strlen(IP-Wert)). Wenn du mal 50.000 Bans hast dann wird dir dein Server dafür sehr dankbar sein wenn er aus einem Query 50.000 Werte zurückgeben muss. Mir ist das aus Versehen mal bei was anderem passiert, da hat es den MySQL-Server schon bei 10.000 zerschossen.
    Ein anderer Weg wäre mir nicht bekannt.