MySQL Daten neuladen

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 habe kleine Probleme mit dem neuladen der Daten per MySQL.
    Es geht um ein Ticket-Sytem welches verwalten werden kann.


    Das problem ist, wenn ich es lösche wird es auch in der Datenbank gelöscht aber wenn ich diesen Befehl neu aufrufe wird das nicht neugeladen.
    Code:

    Geht das anders als mit "mysql_function_query"?
    Benutze die MySQL Version R39.


    Was ist denn daran falsch?

  • Was passiert denn in der Funktion LoadTickets?


    Folgendes:

    Code
    Function LoadTickets()
    {
    	new query[56];
    	format(query, sizeof(query), "SELECT * FROM ingameticket");
    	mysql_function_query(dbhandle, query, true, "LoadSupport", "");
    	return 1;
    }


    und das bei LoadSupport:


    //Edit:


    Habe es selbst behoben ^^

  • Tut mir Leid, habe das Thema nicht mehr gesehen.Wo lag denn der Fehler? :)


    Nicht schlimm ^^
    Der Fehler lag darin das ich beim löschen des Tickets nicht den Wert 0 eingetragen habe.


    Also beim Löschen folgendes:

    Code
    TicketInfo[i][t_id] = 0;


    und dann Datenneuladen lassen.
    Sicherheitshalber habe ich noch beim Auflisten der Tickets folgendes eingebaut in der Loop-Schleife:


    Code
    if(TicketInfo[i][t_id] == 0) continue;


    Damit wurde das Problem behoben und beim Auflisten wird nichts mehr doppelt angezeigt.



    //Edit:
    Problem doch nicht gelöscht...
    Wenn es nur ein Ticket gibt wird es gelöscht, sobald 2 Tickets gibt wird es falsch angezeigt...


    @Jeffry, kannst du vielleicht rüberschaun?

  • Klar ^^ @Jeffry


    Also mein Problem ist ich hab ein Befehl erstellt was nur Admins aufrufen können und dort alle gesendeten Tickets aufgelistet werden sollen.
    Da ist das Problem das die Tickets nicht richtig angezeigt werden.
    Wenn ich aber Tickets löschen möchte geht das nur einmal und dann wird die auflistung nicht mehr aktualisiert.


    Hier die aktuellen Codes:


    Code: Enum
    enum tTicketInfo {
    	t_id,
    	t_betreff[30],
    	t_absender[30],
    	t_grund[35],
    	t_created
    };
    new TicketInfo[50][tTicketInfo];



    Code
    Function LoadTickets()
    {
    	new query[56];
    	format(query, sizeof(query), "SELECT * FROM ingameticket");
    	mysql_function_query(dbhandle, query, true, "LoadSupport", "");
    	return 1;
    }


    Datenladen:


    Befehl:


    Und hier löschen:


    ( Ich hab versucht alles Printen zu lassen, hat auch alles geklappt aber wird trotzdem nicht neugeladen :/ )


    Lade mal hier 2 Screens hoch ( nicht wundern beim eintragen manuell hab ich das erste bisschen fail eingetragen aber darum geht es nicht sondern das es nicht aktualisiert wird... )
    sa-mp-029.png
    ( vor dem löschen )


    sa-mp-033.png
    ( nach dem löschen )
    Aufeinmal ist die ID 5 doppelt...

  • Füge bei deinem LoadTickets vor dem Query das hier ein:
    for(new i = 0; i < sizeof(TicketInfo); i++) TicketInfo[i][t_id] = 0;



    Ändere außerdem:
    format(string1, sizeof(string1), "{FFFFFF}%s\t%d\t%s\t%s\t%s\n",string1,TicketInfo[i][t_id],TicketInfo[i][t_betreff],TicketInfo[i][t_absender],TicketInfo[i][t_grund]);
    zu:
    format(string1, sizeof(string1), "%s%d\t%s\t%s\t%s\n",string1,TicketInfo[i][t_id],TicketInfo[i][t_betreff],TicketInfo[i][t_absender],TicketInfo[i][t_grund]);



    Sowie:
    new string1[9000];
    zu:
    new string1[9000];
    format(string1, sizeof(string1), "{FFFFFF}");



    Der Code zum Löschen-Dialog muss so aussehen:
    if(dialogid == DIALOG_TICKET_LOESCHEN)
    {
    if(response)
    {
    if(!IsNumeric(inputtext))
    {
    SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}FEHLER{FFFFFF}: Bitte Ticket-ID eingeben um löschen zu können!");
    new str1[100];
    format(str1, sizeof(str1), "{FFFFFF}Möchtest du dieses Ticket löschen?\n{FF7A7A}Hinweis{FFFFFF}: Ticket-ID eingeben um löschen zu können.");
    ShowPlayerDialog(playerid, DIALOG_TICKET_LOESCHEN, DIALOG_STYLE_INPUT, "Support Ticket {6DCCFF}löschen",str1, "Ausführen", "Beenden");
    }
    else
    {
    new txt = strval(inputtext);
    for(new i = 0; i < sizeof(TicketInfo); i++)
    {
    if(TicketInfo[i][t_id] == txt)
    {
    PlayerNeedsHelp[GetPlayerIdFromName(TicketInfo[i][t_absender])] = 0;
    //printf("Eingabe: %i", txt);
    //printf("Vor dem löschen: %i", TicketInfo[i][t_id]);
    TicketInfo[i][t_id] = 0;
    //printf("ID löschen: %i", TicketInfo[i][t_id]);
    new query[156];
    format(query, sizeof(query), "DELETE FROM `ingameticket` WHERE id='%i'", txt);
    mysql_function_query(dbhandle, query, true, "LoadTickets", "");
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Ticket {9FFF92}erfolgreich{FFFFFF} gelöscht!");
    return 1; //Hinzugefügt
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}Falsche{FFFFFF} Ticket-ID angabe!"); //Aus der Schleife geholt
    return 1; //Hinzugefügt
    }
    }
    else SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}Abgebrochen{FFFFFF}.");
    }

  • Danke @Jeffry hat soweit funktioniert mit dem aktualisieren der Liste,
    nur wenn ich 2 Tickets lösche kann ich keine weitere mehr löschen, es erscheint auch keine Nachricht ob es erfolgreich oder fehlgeschlagen ist...


    bei DIALOG_TICKET_LOESCHEN müsste glaube ich noch etwas falsch sein...
    Eine Frage noch, was ich nicht verstanden habe warum bei LoadTickets eine Schleife kommt?



    also diese hier:


    Code
    for(new i = 0; i < sizeof(TicketInfo); i++) TicketInfo[i][t_id] = 0;
  • Das Problem kann ich am Code nicht nachvollziehen, bist du sicher, dass du existierende Tickets hast? Dass keine Meldung kommt kann eigentlich nicht sein. Falls doch, füge mal das crashdetect Plugin ein und schau, ob dir das etwas im Server Log ausgibt, wenn keine Meldung kommt, möglicherweise wird ein Array gesprengt.


    Zu deiner Frage:
    Das ist, damit die existierenden Tickets (im Array) zurückgesetzt werden, da du ja alle neu aus der Datenbank lädst.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • @Jeffry,


    ich habs mal getestet die davor geschriebenen Tickets gelöscht und neu erstellen lassen dann gings wieder.
    Keine Ahnung was vorhin loswar, ist aber behoben!


    Dank für deine Hilfe! ;)



    //Edit:
    So ich habe mal mit dem Crashdetect geprüft es kommt kein Fehler.
    Wenn ich den Server restarte und Tickets noch vorhanden sind kann ich die danach nicht mehr löschen, sprich nur die Ticket-ID's die neu hinzugefügt wurden...
    Komisch...

  • Wenn ich den Server restarte und Tickets noch vorhanden sind kann ich die danach nicht mehr löschen, sprich nur die Ticket-ID's die neu hinzugefügt wurden...

    Komisch. Kannst du mal die aktuelle Version des Codes posten, mit dem du die Tickets lädst, sowie den Code, mit dem du ein Ticket erstellst?

  • Ja


    Beim laden hat sich eigentlich nichts verändert, ich schreibe sie trotzdem mal hier rein:


    Code
    Function LoadTickets()
    {
        for(new i = 0; i < sizeof(TicketInfo); i++) TicketInfo[i][t_id] = 0;
    	new query[56];
    	format(query, sizeof(query), "SELECT * FROM ingameticket");
    	mysql_function_query(dbhandle, query, true, "LoadSupport", "");
    	return 1;
    }




    Ticket schreiben:

  • printf("ID: %i", TicketInfo[i][t_id]);

    Siehst du diesen Print im Server Log, wenn du den Server startest?


    Es ist mir sonst irgendwie unerklärlich, denn es ist ja ein und derselbe Code, der ausgeführt wird. Kann ja nicht sein, dass er einmal funktioniert, und einmal nicht.


    Kannst du deine GetPlayerIdFromName Funktion noch posten? Möglicherweise liegt es daran.

  • ja es wird in den Logs ausgeschrieben.
    Das Ding ist als ich den neuen Code von dir eingefügt habe und getestet habe waren in der Datenbank 10 Tickets geschrieben.
    So ich dachte ich erstelle Manuell in der Datenpank nochmal 10 damit ich das testen kann nicht das die ID's vertauscht werden oder nicht gelöscht wird.
    Die die ich Manuell hinzugefügt habe oder auch ingame 1 Ticket erstellt habe konnte ich löschen aber die davor gingen einfach nicht weg.
    Unter den Tickets wurden die aufgelistet, konnte diese nicht löschen... Ich kann mal schaun ob diese Angenommen werden können.



    Das komische ist für mich selbst das ich keinen Text ausgeschrieben bekomme es kommt einfach nichts!
    Keine Fehlermeldung oder sonstiges!
    ich kann zur not wieder Screenshots machen...

  • Lasse es dir mal so ausgeben, für ein Ticket, bei dem es nicht geht:
    if(dialogid == DIALOG_TICKET_LOESCHEN)
    {
    printf("DIALOG_TICKET_LOESCHEN");
    if(response)
    {
    if(!IsNumeric(inputtext))
    {
    SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}FEHLER{FFFFFF}: Bitte Ticket-ID eingeben um löschen zu können!");
    new str1[100];
    format(str1, sizeof(str1), "{FFFFFF}Möchtest du dieses Ticket löschen?\n{FF7A7A}Hinweis{FFFFFF}: Ticket-ID eingeben um löschen zu können.");
    ShowPlayerDialog(playerid, DIALOG_TICKET_LOESCHEN, DIALOG_STYLE_INPUT, "Support Ticket {6DCCFF}löschen",str1, "Ausführen", "Beenden");
    }
    else
    {
    printf("Eingabe: %s", inputtext);
    new txt = strval(inputtext);
    for(new i = 0; i < sizeof(TicketInfo); i++)
    {
    printf("i: %d / t_id: %d / txt: %d", i, TicketInfo[i][t_id], txt);
    if(TicketInfo[i][t_id] == txt)
    {
    printf("Absender: %s", TicketInfo[i][t_absender]);
    printf("ID: %d", GetPlayerIdFromName(TicketInfo[i][t_absender]));
    PlayerNeedsHelp[GetPlayerIdFromName(TicketInfo[i][t_absender])] = 0;
    //printf("Eingabe: %i", txt);
    //printf("Vor dem löschen: %i", TicketInfo[i][t_id]);
    TicketInfo[i][t_id] = 0;
    //printf("ID löschen: %i", TicketInfo[i][t_id]);
    new query[156];
    format(query, sizeof(query), "DELETE FROM `ingameticket` WHERE id='%i'", txt);
    print(query);
    mysql_function_query(dbhandle, query, true, "LoadTickets", "");
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Ticket {9FFF92}erfolgreich{FFFFFF} gelöscht!");
    return 1;
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}Falsche{FFFFFF} Ticket-ID angabe!"); //Aus der Schleife geholt
    return 1;
    }
    }
    else SendClientMessage(playerid, COLOR_WHITE, "{FF7A7A}Abgebrochen{FFFFFF}.");
    }


    Was steht dann in Server Log?

  • Ich verstehe es nicht ich habe nun manuell 11 Tickets in die Datenbank gesetzt.


    folgendes zeigt wird geprintet:

    Code
    [17:45:40] ID: 1
    [17:45:40] ID: 2
    [17:45:40] ID: 3
    [17:45:40] ID: 4
    [17:45:40] ID: 5
    [17:45:40] ID: 6
    [17:45:40] ID: 7
    [17:45:40] ID: 8
    [17:45:40] ID: 9
    [17:45:40] ID: 11



    Hier klappt es, aber gestern wo bestandene Tickets vorhanden waren ging es nicht...

  • Ja jetzt nach dem printen ja

    Dann hat es sich wohl über Nacht von selbst behoben :fun:


    Hatte ich auch schon, dass etwas was am ersten Tag nicht ging am anderen Tag plötzlich, ohne dass man etwas daran geändert hat, ging. Umso besser!
    Falls nochmals Probleme auftreten sollten, sage einfach Bescheid (am besten du postest dann die Prints gleich dazu).