MySQL Insert .. WENN

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,


    kann man mit MySQL eine If-Abfrage gesalten, die einen Datensatz einfügt, wenn ein bestimmtes Ereignis eintritt?


    Warum ich es brauche?


    Umständlich:
    mysql_format(connection,string,"SELECT 1 FROM Tabellenname WHERE Name='%e' LIMIT 1;",inputtext);
    mysql_function_query(connection,string,true,"Check","is",playerid,inputtext);

    Umständlich:
    // Irgendwo anders...
    forward Check(playerid,inputtext[]);
    public Check(playerid,inputtext[])
    {
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows!=0) return SendClientMessage(playerid,COLOR_GRAD1,"Dieser Name existiert bereits.");
    new string[128];
    mysql_format(connection,string,"INSERT INTO Tabellenname (Name) VALUES ('%e');",inputtext);
    mysql_function_query(connection,string,false,"Insert","i",playerid);
    }

    Umständlich:
    forward Insert(playerid);
    public Insert(playerid)
    {
    new string[128];
    format(string,sizeof(string),"Eintrag hinzugefügt (ID %i)",mysql_insert_id()); // Primary Key in Kombination mit AUTO_INCREMENT gesetzt.
    SendClientMessage(playerid,-1,string);
    }

    Einfach:
    mysql_format(connection,string,"INSERT INTO Tabellenname (Name) VALUES ('%e');",inputtext);
    mysql_function_query(connection,string,false,"Insert","i",playerid);

    Einfach:
    // Irgendwo anders...
    forward Insert(playerid);
    public Insert(playerid)
    {
    if(mysql_affected_rows()==0) // Datensatz konnte nicht eingefügt werden, da keine doppelten Einträge möglich sind
    {
    SendClientMessage(playerid,COLOR_GRAD1,"Dieser Name existiert bereits.");
    return 1;
    }
    new string[128];
    format(string,sizeof(string),"Eintrag hinzugefügt (ID %i)",mysql_insert_id()); // Primary Key in Kombination mit AUTO_INCREMENT gesetzt.
    SendClientMessage(playerid,-1,string);
    return 1;
    }



    Ich habe versucht das mit dem Unique-Index zu realisieren, leider wird bei einem doppelten Datensatz der Callback garnicht aufgerufen,
    sondern er wird weiter geleitet zu OnQueryError...


    Gibts eine andere Möglichkeit?



    Pille

  • Ich möchte einen neuen Eintrag in eine Tabelle einfügen, aber die Spalte "Name" muss einzigartig sein.
    Deshalb muss ich erst überprüfen, ob bereits eine Zeile existiert, wo in der Spalte "Name" derselbe Wert drinsteht wie den, den der Spieler gerade einfügen will.
    -> Select-Abfrage, neuer Callback, dort INSERT-Query, neuer Callback, INSERT_ID speichern.


    Das ist aber sehr umständlich, deswegen habe ich mir überlegt, ob das vielleicht einfacher geht.
    Ich habe in der Spalte "Name" einen Index gesetzt (Unique), sodass es nicht möglich ist zwei gleiche Werte einzufügen.


    Problem ist nur, dass jetzt bei identischen Daten, MySQL einen Fehler meldet - und nicht den Callback aufruft und mir sagt,
    dass unglücklicherweise keiner von den Querys erfollgreich in die Datenbank eingefügt werden konnte (mysq_affect_rows).
    Nur der Callback OnQueryError wird aufgerufen.



    Muss ich das mit zwei Callbacks und zwei Querys machen oder geht das auch einfacher? (z.B. siehe Beispiel oben)

  • Herzlichen Dank, Jeffry, und wieder rettest du meine Existenz :D


    Klappt super :thumbup:


    //edit:
    Doch nicht... Wenn dann versucht wird ein Datensatz, den es schonmal gibt, einzufügen, wird er ja aktualisiert.
    Leider wird die Groß- und Kleinschreibung mitgeändert, sodass ungewollt Daten in der Datenbank verändert werden.
    Jeffry:

    Einmal editiert, zuletzt von Pille ()

  • Pille: Ich rette dich schon noch, keine Angst. ^^


    Poste bitte den Code so wie du es gemacht hast, dass es die Groß-/Kleinschreibung ändert.



    EDIT:
    Post unten:
    Pille: Hättest du mal alles gelesen. :D

    Zitat

    Als update kannst du ja einfach name=name machen,


    Alles klar dann!

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • SQL
    INSERT INTO Tabellenname (Name) VALUES ('TestNAME') ON DUPLICATE KEY UPDATE Name='TestNAME'


    Ich hatte es bis gerade eben so, aber dann ist mir die Lösung gekommen :D


    SQL
    INSERT INTO Tabellenname (Name) VALUES ('TESTNAme') ON DUPLICATE KEY UPDATE Name=Name


    Und so funktioniert es perfekt, herzlichen Dank! :)