HelpSystem (MySQL)

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
  • Guten Tag, ich möchte gerne Hilfeartikel aus der Datenbank laden und anzeigen lassen, jedoch bin ich nicht so der MySQL-Typ. Eine Datenbank ist bereits vorhanden. Die genaue MySQL Version kenne ich leider nicht (wenn jemand die MySQL Version des releasten RGR/IR Scripts kennt, bitte einen Post hinterlassen).


    Wichtige Tabellen aus der Datenbank:
    ID, Tags, Text


    Könnte mir jemand eine Hilfestellung geben? Evtl. ein Beispiel?


    Grüße

  • /help [Suchbegriff/Tag] bspw. (Drogendealer)


    Tabellen werden nach Suchbegriff/Tag (Drogendealer) durchsucht und der Help-Artikel (Text) wird dementsprechend in einem Dialog angezeigt. Sollte es mehrere Treffer zu diesem Suchbegriff/Tag geben, wird ein Dialog angezeigt, mit allen Artikel ID's die diesen Suchbegriff/Tag beinhalten.



    Bisher sieht es so aus (soll aber mit MySQL Datenbank verbunden sein)


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256],
    idx;
    cmd = strtok(cmdtext, idx);
    if(strcmp("/help", cmd, true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    new x_nr[256];
    x_nr = strtok(cmdtext, idx);
    if(!strlen(x_nr))
    {
    ShowHelp(playerid);
    return 1;
    }
    new string[90];
    format(string, sizeof(string), "xyz.de/help/%s.txt", x_nr);
    HTTP(playerid, HTTP_GET, string, "", "HelpInfo");
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Suche Artikel... (Es sollte gleich ein Infotext angezeigt werden. Wenn nicht, probiere es zu einem späteren Ueitpunkt nochmal.)");
    return 1;
    }
    return 1;
    }
    return 0;
    }


    forward HelpInfo(playerid, response_code, data[]);
    public HelpInfo(playerid, response_code, data[])
    {
    if(response_code == 200)
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Antwort aus der Hilfedatenbank erhalten.");
    ShowPlayerDialog(playerid, HelpDialog ,DIALOG_STYLE_MSGBOX,"Help System",data,"OK","");
    }
    else if(response_code == 404)
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    }
    else
    {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Es konnte keine verbindung aufgebaut werden.");
    }
    }

  • Was du brauchst.
    Ein Tabellen Konzept. Wie identifizierst du jeden einzelnen Hilfe Artikel (Primärschlüssel).
    Wenn du dies hast dann kann du einen simplen SQL Select Befehl absetzten und dann mit deinem ResultSet (Ergebnis menge) weiter arbeiten.,


    Eigentlich verwendet man Datenbanken für atomare Datensätze. Bedeutet ein Datensatz wie Eine Zahl ein Wort oder ähnlich. Nichts Separiertes.
    Daher sollte vielleicht überdacht werden dies in eine Datei pro Hilfe Artikel auszulagern welche neu gelesen werden können beschrieben werden können und der gleichen.

  • Die genaue MySQL Version kenne ich leider nicht

    Das wäre gut zu wissen.
    Starte den Server und schaue im Server Log nach, ganz oben, dort wo die Plugins geladen werden, dort siehst du die Version.
    Falls nicht, dann steht sie auch in der beigefügten Include.


    Erstelle zudem bitte schonmal folgende Tabelle:


    Bezeichnung id tags header helptext
    Typ INT VARCHAR VARCHAR VARCHAR


    Die Länge der VARCHAR's musst du nach deinen Vorstellungen angeben.

  • Das wäre gut zu wissen.Starte den Server und schaue im Server Log nach, ganz oben, dort wo die Plugins geladen werden, dort siehst du die Version.
    Falls nicht, dann steht sie auch in der beigefügten Include.


    Erstelle zudem bitte schonmal folgende Tabelle:


    Bezeichnung id tags header helptext
    Typ INT VARCHAR VARCHAR VARCHAR


    Die Länge der VARCHAR's musst du nach deinen Vorstellungen angeben.

    Vielen Dank für deine Antwort! :)

    Zitat von a_mysql

    SA-MP MySQL plugin R5


    Copyright (c) 2008-2010, G-sTyLeZzZ

    Tabelle habe ich erstellt

  • Gut, dann würde ich Folgendes vorschlagen:


    • Der Spieler gibt /help [Tag] ein.
    • Es wird dann in der Datenbank nach Artikeln mit diesem Tag gesucht.
    • In einem Dialog bekommt er alle Überschriften der Artikel ausgegeben, die diesen Tag enthalten.
    • Er wählt den Artikel den er lesen will
    • Dann wird in einem Dialog der Artikeltext angezeigt.


    Ist das so deinen Wünschen entsprechend?

  • Gut, dann würde ich Folgendes vorschlagen:


    • Der Spieler gibt /help [Tag] ein.
    • Es wird dann in der Datenbank nach Artikeln mit diesem Tag gesucht.
    • In einem Dialog bekommt er alle Überschriften der Artikel ausgegeben, die diesen Tag enthalten.
    • Er wählt den Artikel den er lesen will
    • Dann wird in einem Dialog der Artikeltext angezeigt.


    Ist das so deinen Wünschen entsprechend?

    Genau das wäre mein Wunsch, richtig :)


    Gruß

  • Versuche den Befehl bitte mal so:
    #define DIALOG_HELP 1403
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256], idx;
    cmd = strtok(cmdtext, idx);
    if(strcmp("/help", cmd, true) == 0)
    {
    new str[256], msg[1024];
    str = strtok(cmdtext, idx);
    if(!strlen(str)) return ShowHelp(playerid);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Suche Artikel... (Es sollte gleich ein Infotext angezeigt werden. Wenn nicht, probiere es zu einem späteren Ueitpunkt nochmal.)");
    mysql_real_escape_string(str, str);
    format(str, sizeof(str), "SELECT header FROM helptabelle WHERE tags LIKE '%%%s%%';", str);
    mysql_query(str);
    mysql_store_result();
    if(!mysql_num_rows()) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    while(mysql_retrieve_row())
    {
    mysql_fetch_field_row(str,"header");
    format(msg, sizeof(msg), "%s%s\n", msg, str);
    }
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_MSGBOX, "Help-Artikel", msg, "Auswählen", "Abbrechen");
    mysql_free_result();
    return 1;
    }
    return 0;
    }


    Im Query musst du das "helptabelle" an die Bezeichnung deiner Tabelle anpassen.


    Ich habe es ohne Threaded Queries gemacht, da ich den Rest deines Codes nicht kenne und so Konflikte ausschließen kann.



    Zeigt es dir die entsprechenden Header dann nach den gesuchten Tags an, sprich klappt das soweit?

  • Zitat von Pawno

    C:\Users\Varrez\Desktop\gtals\gamemodes\IR.pwn(21300) : error 017: undefined symbol "mysql_retrieve_row"
    C:\Users\Varrez\Desktop\gtals\gamemodes\IR.pwn(21302) : error 017: undefined symbol "mysql_fetch_field_row"

    Edit: Sorry, habe gerade gesehen das ich dir eine falsche Version genannt habe..


    SA:MP MySQL v2.1 Functions
    * (c) Copyright 2011, StrickenKid


    //Edit: Habe mysql_retrieve_row() mit mysql_fetch_row(str) und mysql_fetch_field_row(str,"header"); mit mysql_fetch_field("header", str); ersetzt. Der bisherige Code funktioniert.

    2 Mal editiert, zuletzt von varrez ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Gut, dann versuche den Dialog so:
    #define DIALOG_HELPTEXT 2401
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_HELP:
    {
    if(!response) return 1;
    new str[256], msg[1024];
    mysql_real_escape_string(inputtext, str);
    format(str, sizeof(str), "SELECT helptext FROM helptabelle WHERE header = '%s';", str);
    mysql_query(str);
    mysql_store_result();
    if(!mysql_num_rows()) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    mysql_fetch_row(msg);
    mysql_fetch_field("helptext", msg);
    for(new i=0; i<strlen(msg); i++) if(msg[i] == '~') msg[i] = '\n';
    ShowPlayerDialog(playerid, DIALOG_HELPTEXT, DIALOG_STYLE_MSGBOX, "Help-Text", msg, "Ok", "");
    mysql_free_result();
    return 1;
    }
    }
    return 0;
    }


    Speichere den Helptext in der Datenbank so:
    Dies ist ein Beispiel!~~Damit man gucken kann ob auch alles läuft, machen wir mal~einen Zeilenumbruch!


    Ein ~ steht für einen Zeilenumbruch. Dies kannst du auch ändern, falls du lieber ein anderes Zeichen nehmen willst. \n geht nicht, da dies als zwei Zeichen interpretiert wird. Könnte man zwar auch abfangen, ist aber umständlicher.


    Der bisherige Code funktioniert.

    Klappt es auch, wenn du mehrere Zeilen angezeigt bekommst, sprich Hilfe ID 1 hat den Tag "test" und ID 3 auch, mit zwei unterschiedlichen Überschriften?

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: mysql_free_result(); hinzugefügt.

  • Habe zum Test folgendes in die Tabelle eingetragen:
    id 1 - tags Drogendeagler Waffendealer - header Artikel 1: Drogendealer & Waffendealer
    id 2 - tags Drogendealer - header Artikel 2: Drogendealer
    id 3 - tags Waffendealer - header Artikel 3: Waffendealer


    bei allen 3 als helptext: Dies ist ein Beispiel!~~Damit man gucken kann ob auch alles läuft, machen wir mal~einen Zeilenumbruch!


    Bei /help Drogendealer passiert dann folgendes: Klick


    Gruß

  • Oh, beim Befehl:
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_MSGBOX, "Help-Artikel", msg, "Auswählen", "Abbrechen");
    zu:
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_LISTBOX, "Help-Artikel", msg, "Auswählen", "Abbrechen");

  • Global Gamer:
    in etwa so:

    ocmd@2:help,hilfe(playerid,params[])
    {
    new str[256],msg[1024];
    if(sscanf(params,"s[32]",str))return SCM(playerid,COLOR_RED,"/help [befehlsname] oder einen teil davon");
    mysql_format(handle,str,sizeof str,"SELECT Titel FROM help WHERE Tags LIKE '%%%e%%';",str);
    mysql_query(handle,str);
    new rows = cache_get_row_count(handle);
    if(rows==0)return SCMEx(playerid,COLOR_RED,"Den Befehl %s wurde leider nicht gefunden.",str);
    for(new i;i<rows;i++)
    {
    cache_get_field_content(0, "Titel", str,handle,32);
    format(msg, sizeof(msg), "%s%s\n", msg, str);
    }
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_LIST, "Help-Artikel", msg, "Auswählen", "Abbrechen");
    return 1;
    }

    Mein Dialog:

    case DIALOG_HELP:
    {
    if(!response) return 1;
    new str[256], msg[1024];
    mysql_format(handle,str, sizeof(str), "SELECT Helptext FROM help WHERE Titel = '%e';", inputtext);
    mysql_query(handle,str);
    if(cache_get_row_count(handle)==0)return SendClientMessage(playerid, -1, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    cache_get_field_content(0,"Helptext", msg,handle,1024);
    for(new i=0; i<strlen(msg); i++) if(msg[i] == '~') msg[i] = '\n';
    ShowPlayerDialog(playerid, DIALOG_TMP, DIALOG_STYLE_MSGBOX, "Help-Text", msg, "Ok", "");
    return 1;
    }

  • in etwa so:

    Nein, bitte niemals so machen, außer es ist wirklich nicht anders möglich, und das ist eigentlich nie der Fall. Das was du da machst geht komplett am Sinn der neuen Versionen vorbei, da es fast genau das Gleiche macht, wie die alten Plugins, nämlich auf die Antwort des MySQL Servers warten. Das ist schlecht und sollte so nicht mehr gemacht werden.



    Wie sähe die Query mit der latest MySQL Version aus ?

    #define DIALOG_HELP 1403
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256], idx;
    cmd = strtok(cmdtext, idx);
    if(strcmp("/help", cmd, true) == 0)
    {
    new str[256];
    str = strtok(cmdtext, idx);
    if(!strlen(str)) return ShowHelp(playerid);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Suche Artikel... (Es sollte gleich ein Infotext angezeigt werden. Wenn nicht, probiere es zu einem späteren Ueitpunkt nochmal.)");
    mysql_format(handle, str, sizeof(str), "SELECT header FROM helptabelle WHERE tags LIKE '%%%e%%';", str);
    mysql_pquery(handle, str, "OnCmdHelp", "d", playerid);
    return 1;
    }
    return 0;
    }


    forward OnCmdHelp(playerid);
    public OnCmdHelp(playerid)
    {
    new num_rows = cache_get_row_count();
    if(!num_rows) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    new msg[1024], tmp[64];
    for(new i = 0; i < num_rows; i++)
    {
    cache_get_field_content(i, "header", tmp);
    format(msg, sizeof(msg), "%s%s\n", msg, tmp);
    }
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_MSGBOX, "Help-Artikel", msg, "Auswählen", "Abbrechen");
    return 1;
    }


    #define DIALOG_HELPTEXT 2401
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_HELP:
    {
    if(!response) return 1;
    new str[256];
    mysql_format(handle, str, sizeof(str), "SELECT helptext FROM helptabelle WHERE header = '%e';", inputtext);
    mysql_pquery(handle, str, "OnDialogHelp", "d", playerid);
    return 1;
    }
    }
    return 0;
    }


    forward OnDialogHelp(playerid);
    public OnDialogHelp(playerid)
    {
    if(!cache_get_row_count()) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    new msg[1024];
    cache_get_field_content(0, "helptext", msg);
    for(new i=0; i<strlen(msg); i++) if(msg[i] == '~') msg[i] = '\n';
    ShowPlayerDialog(playerid, DIALOG_HELPTEXT, DIALOG_STYLE_MSGBOX, "Help-Text", msg, "Ok", "");
    return 1;
    }