Hilfe bei MySQL/SELECT

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
  • Moin moin,


    ich hätte da ne kleine Frage.
    Ich möchte gerne mittels SELECT einen Datensatz aus der Datenbank selektieren (Mehrere Reihen).
    Jetzt möchte ich jedes einzelne Feld jeder Zeile in ein Array speichern.


    Mein Code sieht bisher so aus:

    new i = 1;
    while(i <= numRowsGetHouse)
    {
    mysql_fetch_row();
    mysql_fetch_field("stadt", strHouseStadt[i]);
    mysql_fetch_field("houseRef", houseRef[i]);
    i++;
    }



    Danach möchte ich für einen ListenDialog eine String-Variable(255) mit allen Elementen aus strHouseStadt befüllen lassen mit abschließendem \n.
    Bisher sieht dies folgendermaßen aus (Ist aber eigentlich quatsch :D):


    strcat(strAusgabeHaus, strHouseStadt[1]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[2]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[3]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[4]);
    strcat(strAusgabeHaus, "\n");


    ShowPlayerDialog(playerid, dialogPaketAufgebenS3, DIALOG_STYLE_LIST, "Spand - Paketlieferservice 3/4", strAusgabeHaus, "Weiter", "Abbrechen");
    In meinem Dialog habe ich jedoch nur eine Zeile danach und dort ist auch kein Text zu sehen.


    Kann ich dies mit in der Schleife tun, oder benötige ich nach dem mysql_free_result eine neue Schleife?
    Besser gesagt, stimmen meine Zuweisungen überhaupt; läuft er so alle Zeilen meines Ergebnisses durch?


    Viele Grüße


    Zusatzinfo: Ich benutze das MySQL-Plugin von StrickenKid in der Version 2.1.1

    5 Mal editiert, zuletzt von legend ()

  • Um mehrer Sachen auszuladen benutze eine while schleife und der SQL-Command dazu wäre
    "SELECT * FROM `...`"


    und in er while schleife benutzt du dann
    mysql_fetch_row();


    die while schleife bricht automatisch ab wenn es keine datensätze mehr gibt

    while(while(mysql_fetch_row(Query,"|")){



    }


    und nun den ausgelesenen string mit sscanf splitten



    new i,Query[200];
    mysql_query("SELECT * FROM `...`");
    while(while(mysql_fetch_row(Query,"|")){


    sscanf(Query,"p<|>s[40]d",strHouseStadt[i],houseRef[i]);
    i++;


    }
    mysql_free_result();


    das solltest du dennoch deinen Werten anpassen und deinem skript

  • Okay gut.


    Wäre es möglich, dass du mir die Funktionsweise von sscanf nochmal genauer erläuterst, denn woanders werde ich nicht fündig.


    jo kein Problem mit sscanf hast du die möglichkeit strings zu splitten was auch effizenter ist als strcat und schneller.


    sscanf(string zu splitten,"die parameter ",Variabeln an dennen was übergeben werden soll);


    nun gut was das splitten angeht welches du hier benötigst benutzt man das p
    p<|>dddd
    | ist der delimiter wo es gesplittet werden soll man kan es auch durch kommas ersetzen was man will.
    dddd das sind die folgenden parameter hier 4 mal d das bedeutet es wird in 4 integer gespeichert.
    Daher sollte der string auch dementsprechend aussehen
    1|2|3|4


    nun gut was du auch machen kannst ist das einem enum gleich zu übergeben.

    enum beispiel
    {
    var,
    string[20],
    Float:ffloat,
    };
    new EnumInfo[MAX_PLAYERS][beispiel];


    sscanf(string,p<|>e<ds[20]f>",EnumInfo);


    das war jetzt nur oberflächlich erklärt und kurz gehalten mehr infos findest du
    hier


    http://forum.sa-mp.com/showthread.php?t=120356

  • Vielen Dank! :)


    //EDIT:
    //Häuser des Empfängers aus der Datenbank auslesen, die einen Briefkasten haben.
    format(queryGetHouseEmpf, sizeof(queryGetHouseEmpf), "SELECT h.* FROM house h, player p WHERE p.playerName = '%s' AND h.playerRef = p.playerRef AND h.briefkasten = 1", inputtext);
    mysql_query(queryGetHouseEmpf);
    mysql_store_result();


    numRowsGetHouse = mysql_num_rows();

    //Wenn mindestens ein Haus mit einem Briefkasten gefunden wurde
    if (numRowsGetHouse > 0)
    {
    new i = 1;
    while(mysql_fetch_row(queryGetHouseEmpf,"connection"))
    {
    sscanf(queryGetHouseEmpf,"p<|>sd",strHouseStadt[i],houseRef[i]);
    SendClientMessage(playerid, ROT, strHouseStadt[i]);
    i++;
    }
    mysql_free_result();
    strcat(strAusgabeHaus, strHouseStadt[1]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[2]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[3]);
    strcat(strAusgabeHaus, "\n");
    strcat(strAusgabeHaus, strHouseStadt[4]);
    strcat(strAusgabeHaus, "\n");

    ShowPlayerDialog(playerid, dialogPaketAufgebenS3, DIALOG_STYLE_LIST, "Spand - Paketlieferservice 3/4", strAusgabeHaus, "Weiter", "Abbrechen");

    } else SendClientMessage(playerid, ROT, "Dieser Spieler hat kein Haus und/oder keinen Briefkasten.");


    Wenn ich meinen SELECT einzeln ausführen lasse in der Console, dann liefert er mir zwei Zeilen zurück.
    Jedoch habe ich bei obigem Code immer noch ein leeres Resultat.


    Wie kann ich das nun beheben?



    //EDIT: Thema hat sich erledigt, danke für die Mühe!

    4 Mal editiert, zuletzt von legend () aus folgendem Grund: Script eingefügt - RS-Fehler :X