MySQL Statement

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 Breadfish-Community,


    ich würde gerne Daten speichern, das Problem ist nur ich möchte in einer MySQL Statementabfrage einbauen das er prüft ob der Spieler und der Grund bereits vorhanden ist.
    Sollte ein Enum erstellt werden falls dies nicht gehen sollte habe ich auch schon versucht bekomme aber ständig eine Fehlermeldung die ich mir nicht erklären kann was falsch sei.


    Zunächst erstmal was ich als 1. Versucht habe:


    Code
    new query1[900];
    format(query1, sizeof(query1), "INSERT INTO log SET Spielername='%s', Grund = 'Test' WHERE Spielername != '%s'", SpielerName(playerid);
    print(query1);
    mysql_function_query(dbhandle, query1, false, "", "");



    Wenn ich das "WHERE Spielername != '%s'" weglasse wird das wunderbar gespeichert aber der es werden für den Spieler immer neue Zeilen angelegt.
    Gestern hatte ich im Allgemeinen Scripting Frage gefragt ob dies möglich sei, @Jeffry postete diese Seite http://dev.mysql.com/doc/refma…/insert-on-duplicate.html.
    Ich verstehe nur nicht wie ich "ON DUPLICATE KEY UPDATE" einfüge, denn dieses Update am ende verwirrt mich ein wenig obwohl ich nichts Updaten haben möchte....



    Meine andere Variante war, da ich die Daten später ebenfalls auflisten lassen möchte und dafür ein Enum brauche so aufzubauen:



    Code
    enum LogAkte {
    	l_akte_id,
    	l_akte_name[56],
    	l_akte_grund[100]
    };
    new LogInfo[10][LogAkte];



    Und so:


    ( Hier bekomme ich eine Fehlermeldung das angeblich "SpielerName" und "str1" nicht gefunden werden konnte... )




    Da ich soweit nicht großartig mit den MySQL Statements gearbeitet habe außer "SELECT/UPDATE/INSERT" komme ich hier nicht weiter...
    Kann mir einer weiterhelfen? ( @Jeffry ? )

  • Wenn du keine Meldung haben willst ist es relativ einfach:
    new query1[256];
    format(query1, sizeof(query1), "INSERT INTO log (Spielername, Grund) VALUES('%s', 'Test');", SpielerName(playerid));
    print(query1);
    mysql_function_query(dbhandle, query1, false, "", "");
    Für Testzwecke kannst du ja direkt in der Datenbank schauen, ob es drin steht.


    Nur eines musst du beachten:
    Setze sowohl Spielername als auch Grund in der Datenbank als PRIMARY KEY. Dann kann eine Kombination nur einmal existieren.

  • ah okey danke :)


    Folgendes habe Meldung habe ich erhalten als ich die Datenbank bearbeiten wollte:
    "#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key"


    So dachte, da es nur 3 Spalten sind erstelle ich die neu und wenn ich bei Grund Primary Key eingebe und auf Speichern klicke kommt folgendes:
    "#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key"



    Ähm was habe ich denn falsch gemacht?
    Habe sogar bei Grund da es ein var(char) ist die Länge angegeben. Soweit ich weiß kann es nur ein Primary Key geben?

  • Danke euch beiden!
    Funktioniert einwandfrei :)


    Wenn ich mir das eben mit dem Enum angeschaut habe, seh ich meine 2. Variante war zuuu seeehr umständlich :D
    hab jtzt aber dazu gelernt, dass man nicht nur ein Primary Key haben kann! Danke euch beiden :thumbup:



    //Edit:
    Eine Frage hätte ich diesbezüglich noch...
    Undzwar gespeichert wird es nun erfolgreich, nur aufgelistet wird es nicht.


    Code:

    Es wird jedoch nichts ausgeschrieben.
    Print wird in der Konsole angezeigt also es wird alle geladen nur nicht ausgeschrieben.


    Ist es so richtig einen String mit einem Enum zu vergleichen?

  • Kürze str1 auf 145, mehr kann SendClientMessage nicht anzeigen (oder nutze einen Dialog).
    Entferne außerdem das return 1 nach SendClientMessage, falls ein Spieler mehrere Zeilen hat.


    Ich habe nur vorrübergehend SendClientMessage genommen, da ich das Aufgelistet haben möchte.
    Wenn das Funktioniert und nicht jetzt schon nichts anzeigt werde ich da in Textdrawform ändern mit der auflistung...
    Es wird aber so ja nicht angezeigt trotz das ich die Anweisungen von geändert habe.

  • Dann müsstest du es so machen:
    if(LogInfo[i][l_akte_name] == ReturnUser(tmp))
    zu:
    if(!strcmp(LogInfo[i][l_akte_name], tmp,true))
    (Ganzer Name eingeben)


    Oder so:
    if(ReturnUser(LogInfo[i][l_akte_name]) == pID)
    Das würde allerdings nur mit Spielern klappen, die online sind.

  • Du kannst ja auch mal einen print an die Stelle setzen um zu prüfen ob das SendClientMessage überhaupt aufgerufen wird.
    Falls nicht, vergleiche die Werte von LogInfo[i][l_akte_name] und tmp per print vor der Abfrage, ob es da überhaupt eine Übereinstimmung gibt.