Vorhandene Accounts auflisten?

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
  • Ich glaub bei Dini geht es nicht, aber bei MySQL könntest du eine While schleife machen.
    z.B
    while(mysql_retrieve_row()) //this will be running until all rows are processed
    {
    //you can use mysql_fetch_field and mysql_fetch_field_row here
    }


    Und daran erkennt man wieder das ich bei MySQL noch ein Einsteiger bin :whistling:


    Hab mich mal durch's Wiki gesucht, aber das mit dem Verstehen hat da doch nich so ganz funktioniert..


    Man muss doch bei [ while(mysql_retrieve_row()) ] bestimmt noch irgendwas hinzufügen oder? Und soll ich dann [ mysql_fetch_field ] oder [ mysql_fetch_field_row ] benutzen?

  • Es geht bei beiden, bei dini allerdings mehr schlecht als recht.


    Für dini benötigst du eine index file, in der alle Namen der anderen Spielerdateien gespeichert werden, da du sonst keinerlei Referenzen auf diese besitzt.


    Bei MYSQL ist es einfacher. Du liest einfach alle Tupel aus einer Tabelle aus. Im Grunde genommen recht es dort aus den Namen auszulesen, da dies in SAMP eigentlich immer der Primärschlüssel ist.


    SQL
    SELECT `Name` FROM Table


    DIese gehst du dann, je nach Plugin (BlueG oder Stricken) mit der jeweiligen Methode in einer while schleife durch


    Zitat von Housefrau

    while(mysql_retrieve_row()) //this will be running until all rows are processed
    {
    //you can use mysql_fetch_field and mysql_fetch_field_row here
    }

  • Ich stell' mich irgendwie zu blöd an. Hab' einfach mal alles mögliche probiert und versucht, bis am Ende sowas rauskam:


    mysql_query("SELECT Name FROM samp");
    mysql_store_result();
    new result[512];
    while(mysql_retrieve_row())
    {
    mysql_fetch_field_row(result,"Name");
    }
    mysql_free_result();
    ShowPlayerDialog(playerid,temp,DIALOG_STYLE_MSGBOX,"Hi",result,"Ok","");


    Leider wird der Dialog nicht angezeigt.. Will mir jemand nochmal einen Denkanstoß geben, damit ich wieder in Ruhe schlafen kann? :sleeping:

  • Hast du einen stock der mysql_CheckAccount heißt?


    Ja;


    stock mysql_CheckAccount(playerid)
    {
    new Query[128],Name[MAX_PLAYER_NAME],count;
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name, Name);
    format(Query, sizeof(Query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", Name);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    return count;
    }

  • Ich denke mal du hast einen Befehl mit dem du alle Admins abfragst..
    Im Grunde machst du das genau so mit den accounts..
    Du machst eine Schleife und fragst anstatt das Adminlevel ab ob ein Account der Schleife existiert.
    Also:
    if(mysql_Checkaccount(i) == 1)
    {
    ...
    }


    Les das einfach von deinem Admins Befehl ab.
    Dürfte normalerweise nicht so schwer sein ;)

  • Hast du einen stock der mysql_CheckAccount heißt?


    Lösch bitte deinen Beitrag. Was bringt denn diese Funktion ( Es ist eine Funktion,kein stock ) um aufzulisten, was für Accounts es alles gibt ?
    Soll man jetzt etwa zufällig alle möglichen Namen ausprobieren ?

    Spoiler anzeigen
    Wer aber in seiner Signatur auch Pawno Hilfe anbietet hat sich sowieso disqualifiziert :wacko: 


    Der Beitrag von John_Hunter ist gut.

  • Hää?
    Du kannst doch Abfragen ob der Account von i existiert?
    Wenn er existiert kannst du den namen eintragen lassen...
    Weiß nicht wo da das Problem sein soll, aber gut das du Sachlich bleibst und direkt rumheulen musst.
    GG!

  • Sind denn bei dir alle Spieler auf dem Server die jemals bei dir einen Account angelegt haben ? Ich nehm die Antwort mal vorne weg,Nein.


    Zitat

    Weiß nicht wo da das Problem sein soll, aber gut das du Sachlich bleibst und direkt rumheulen musst.


    Tust du ja gerade.

  • Dann habe ich wohl die Frage falsch vertanden..
    Er möchte Abfragen ob sich User bei ihm registriert haben und sie sollen gleichzeitig eingeloggt sein oder wie?


    Nein ^^


    Er soll mir einfach nur alle vorhandenen Accounts in der Datenbank auflisten, damit ich diese per Dialog löschen kann etc.



    Leider funktioniert der Code von @Josh_Hunter: auch nicht .. :/

  • Entweder stehe ich gerade auf der Leitung oder ich bin gerade einfach nur zu Müde.
    Ich werde das heute Abend testen und werde dir bescheid geben.
    Wäre gut wenn du dich heute Abend so gegen 21:00 Uhr bei mir melden könntest ;)


  • Du sollst auch nicht einfach nur kopieren.Hast du denn überhaupt eine MySQL Datenbank ? Gibt es dort die Tabelle samp und ist dort eine Spalte mit dem Namen Name ? Wird der Dialog angezeigt und ist lediglich der Inhalt leer ?


    Mach doch einfach mal Debug Informationen rein:
    mysql_query("SELECT Name FROM samp");
    mysql_store_result();
    print("debug 1");
    new result[512], string[256];
    while(mysql_retrieve_row())
    {
    print("debug 2");
    mysql_fetch_field_row("Name", result);
    format(string, sizeof(string), "%s\n%s", string, result);
    }
    print("debug 3");
    mysql_free_result();
    print("debug 4");
    print(string);
    ShowPlayerDialog(playerid,temp,DIALOG_STYLE_MSGBOX,"Hi",string,"Ok","");

  • // EDIT:


    Hab' eben 'nen ziemlich blöden Fehler entdeckt, bei mysql_query gehört nicht "SELECT Name FROM samp" sondern "SELECT Name FROM accounts" .. :sleeping:



    Jetzt steht im Log folgendes:


    Code
    [11:45:00] debug 1
    [11:45:00] debug 2
    [11:45:00] debug 3
    [11:45:00] debug 4
    [11:45:00]


    Der Dialog wird angezeigt, nur ist der Inhalt leer.


  • Habe deinen Code jetzt einfach kopiert und eingefügt (ich denke das war jetzt diesmal auch Sinn der Sache, hoffentlich) und im Log steht folgendes:


    Code
    [11:38:46] debug 1
    [11:38:46] debug 3
    [11:38:46] debug 4
    [11:38:46] (null)


    PS: Der Dialog wird überhaupt nicht angezeigt.


    Wie du siehst,"debug 2" wird nie ausgegeben.
    Der Code springt also nie in die while Schleife:
    while(mysql_retrieve_row())
    {
    print("debug 2");
    mysql_fetch_field_row("Name", result);
    format(string, sizeof(string), "%s\n%s", string, result);
    }
    Dadurch füllt sich auch nie string und du bekommst nur (null) ausgegeben für den String. Ich gehe mal davon aus,dass es definitiv Einträge geben sollte ( Die Tabelle ist also nicht leer ).


    Ich weiss jetzt nicht welches Plugin du benutzt,aber änder die mysql_store_result() Zeile in folgendes:
    printf("mysql_store_result() = %d",mysql_store_result() );
    http://wiki.sa-mp.com/wiki/MySQL#mysql_store_result


    Je nachdem welches Plugin du verwendest,gibt es auch das Callback OnQueryError.
    http://wiki.sa-mp.com/wiki/MySQL#OnQueryError
    Dort könntest du eventuelle Fehler abfangen und dir per print ausgeben.
    Zum Beispiel so:
    public OnQueryError(errorid, error[], callback[], query[], connectionHandle)
    {
    printf("OnQueryError(%d,%s,%s)",errorid,error,query);
    return 1;
    }


    //Edit:
    Das oben fällt dann wohl weg.


    Laut Wiki gehört mysql_fetch_field_row etwas anders.
    http://wiki.sa-mp.com/wiki/MySQL#mysql_fetch_field_row
    Es müssten also getausch werden bei dir in
    mysql_fetch_field_row(result, "Name");
    Hast du auch nur 1 Account in der Tabelle ? Sonst müsstest "debug 2" häufiger ausgegeben bekommen.

  • Goldkiller:


    Vielen vielen vielen Dank, es geht endlich!


    Ja, hatte bisher nur einen Account in der Tabelle (zum testen eben), aber es funktioniert (auch mit mehreren Accounts).



    Du hast mir echt sehr geholfen, und das System mit dem OnQueryError werd' ich dann auch ab sofort nutzen bevor ich hier anfange zu posten. :)



    Also nochmals Danke!