2. Gangzone erstellen funktioniert nicht. (MySQL)

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Mein Problem ist es, das ich 2 Gangzonen in der Datenbank habe,
    er liest zwar beide aus erstellt aber nur die eine.


    stock CreateSektor()
    {
    new str[1024], Query[128];
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    for(new i = 0; i <mysql_num_rows(); i++)
    {
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);
    mysql_query(Query);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    }
    }
    mysql_free_result();
    }


    Code
    [11:09:51] 2 Sektoren gelesen.
    [11:09:51] Sektor No-Name[1] geladen.
    1|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1
  • Der erste Query ist ja nur dazu da, um auszulesen wieviele Zonen ich habe.
    Das funktioniert auch so weit.


    Der fehler müsste in dem Bereich liegen
    for(new i = 0; i <mysql_num_rows(); i++)
    {
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);
    mysql_query(Query);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    }
    }

  • Das ist wie ich finde schon eigenartig geschrieben. das würde sich mit einen einzigen Query wunderbar lösen lassen.


    stock CreateSektor()
    {
    new Query[128], i = 0;
    format(Query, sizeof(Query), "SELECT * FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    while(mysql_fetch_row(Query))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    i++;
    }
    mysql_free_result();
    }


    Ungetestet, sollte aber das gewünschte ergebniss bringen.

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • While ist eine Schleife, die alle einträge abläuft die durch das Query gefunden wurden.


    Das einzige problem wäre: Wenn du eine Gangzone löscht würden sich die ID's verschieben. Falls dies wichtig ist müsste man das etwas umschreiben das er nicht nach i die Id Richtet sondern direkt aus der DB raus,

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • stock CreateSektor()
    {
    new str[1024], Query[128], i = 0;
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", System[SektorOnline]);
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    i++;
    System[SektorOnline] = i;
    }
    mysql_free_result();
    }


    Code
    [15:24:48] [T_MySQL] Verbindung erfolgreich !
    [15:24:48] 0 Sektoren gelesen.
    [15:24:48] Sektor [0] geladen.
    1
    [15:24:48] Sektor [1] geladen.
    2


    Das ist mein Code was sscanf zurück gibt...

    Einmal editiert, zuletzt von [LP]Tochnas ()

  • Den SScanf teil hab ich glatt übersehen :/.


    durch mysql_fetch_row() ist SScanf nicht verwendbar


    Da ich aber will das Leute auchmal was lernen und nicht immer alles vorgearbeitet kriegen: http://wiki.sa-mp.com/wiki/MySQL#mysql_fetch_row_format


    Falls du das aber nicht verstehen solltest helfen wir gerne weiter :)

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • ob i mysql_fetch_row() oder mysql_fetch_row_format() nehme bekomme ich meine Daten von sscanf habe den Fehler behoben,
    dennoch wie bei der Zweiten Zone in die Variable SektorInfo[i][sName] keinen String hinzugefügt. Habe viele Probleme gelöst,
    aber dieses ist Neuland für mich...


    samp_log:

    Code
    [19:25:25] [T_MySQL] Verbindung erfolgreich !
    [19:25:25] 2 Sektoren gelesen.
    [19:25:25] Sektor No-Name[0] geladen.
    [19:25:25] 0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1
    [19:25:25] Sektor 
    [19:25:25] 1|0|DM-Zone|331.6490|-1677.0620|278.3560|-1721.2578|2


    wie man sieht beim zweiten Sektor wird die Message ab dem String abgebrochen... Hab ich noch nie gesehen.


  • meines errachtens ist alles korrekt.

  • Ok muss zugeben das ich nun überfragt bin.


    mysql_fetch_row_format wird nur einmal ausgeführt.


    hast du nur 2 zonen in der Datenbank? oder mehr als 2? wenn nicht, füg mal testhalber eine noch dazu und schau dann mal wieviele geladen werden.

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • Habe einen Neuen Code von Jeffry erklärt bekommen
    und ihn eingefügt, dennoch gibt es Probleme mit der String ausgabe für die Variable SektorInfo[][sName]


    Code:
    stock CreateSektor()
    {
    new str[1024], Query[128], i = 0;
    format(Query, sizeof(Query), "SELECT * FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    while(mysql_fetch_row(str))
    {
    strins(str, "|", strlen(str));
    new oldx=0;
    new count=0;
    for(new x=0; x<strlen(str); x++)
    {
    if(str[x]=='|')
    {
    count++;#
    new tmpstring[sizeof(str)]; tmpstring=str;
    strdel(tmpstring, x, strlen(tmpstring));
    strdel(tmpstring, 0, oldx+1);
    switch(count)
    {
    case 2: {/* Clan-ID */}
    case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring)); // Info: mit strlen() oder ohne kommt das selbe Ergebnis
    case 4: SektorInfo[i][sX1] = floatstr(tmpstring); //f
    case 5: SektorInfo[i][sY1] = floatstr(tmpstring); //f
    case 6: SektorInfo[i][sX2] = floatstr(tmpstring); //f
    case 7: SektorInfo[i][sY2] = floatstr(tmpstring); //f
    case 8: {/* Art der Zone*/}
    }
    oldx=x;
    }
    }
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.", SektorInfo[i][sName],System[SektorOnline]);
    printf("%s", str);
    i++;
    System[SektorOnline] = i;
    }
    mysql_free_result();
    }


    server_log:

    Code
    [21:24:31] 3 Sektoren gelesen.
    [21:24:31] Sektor [0] geladen.
    [21:24:31] 0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1|
    [21:24:31] Sektor [1] geladen.
    [21:24:31] 1|0|DM-Zone|278.3560|-1721.2578|331.6490|-1677.0620|2|
    [21:24:31] Sektor [2] geladen.
    [21:24:31] 3|0|Test|309.0497|-1792.3577|335.5938|-1772.6873|0|


    InGame werden auch die SektorenNamen nicht angezeigt...

  • Sie werden erfolgreich ausgelesen. also kann es schonmal nichtmehr am MySQL teil liegen, print kann sie ja auslesen.


    Wie lässt du sie ingame anzeigen?

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • Teste mal das hier
    stock CreateSektor()
    {
    new str[1024], Query[128];
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    new horst = mysql_num_rows();
    printf("%d Sektoren gelesen.", horst);
    for(new i = 0; i <horst; i++)
    {
    while(mysql_fetch_row(str))
    {
    sscanf(str, "p<|>{i}{i}s[16]ffff{d}",SektorInfo[i][sName],SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[i],str);
    }
    }
    mysql_free_result();
    }

    All in all it's just another brick in the wall

  • Beavis
    die while-Schleife hat bereits die anzahl der Zonen
    hatte es auch dann festgestellt wo es mir erklärt wurde.


    Akuba
    Weiß zwar nicht warum aber hier


    OnPlayerConnect(playerid)
    for(new i = 0; i <System[SektorOnline]; i++)
    {
    GangZoneShowForPlayer(playerid,Sektor[i], 0xFFFF0096);
    }


    Das funktioniert...


    printf("Sektor >>%s<<[%d] geladen.", SektorInfo[i][sName],System[SektorOnline]);
    Das %s sollte ja den Namen der Zone haben, was aber nicht der Fall ist.
    d.h. die Variable SektorInfo[i][sName] ist leer und das ist momentan mein Problem.

  • Um dir mal bewusst zu machen das dein code reiner schrott ist.


    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    Warum ein konstante in den string packen nur um ihn abzusenden wo ist der sinn dahinter ?


    Zu dem sendest du zwei querys ab einmal nur zum zählen das zweite beschränkt nur zum auslesen.
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);


    Nun das aller traurigste ist die for-schleife + die while-schleife
    for(new i = 0; i <mysql_num_rows(); i++)


    die while-schleife in verbindung mit mysql_fetch_row oder mysql_fetch_row_format wo der einzigste Unterschied darin besteht das du den delimiter ändern kannst.
    Geht durch alle Einträge durch und ließt diese je nach dem absgesendeten query aus, da mysql_fetch_row wie auch mysql_retrieve_row zur nächsten zeile springt falls diese vorhanden ist wird 1 zurück gegeben falls nicht 0 daher wird die while schleife auch abgebrochen.


    Zu dem benötigst du keine 1024 zeichen ich geh mal davon aus so grob gezählt reichen dort locker 100 Zeichen(ausgelesenen string die Zeichen durchzählen).


    Ich hoffe du nimmst dir die Punkte zu herzen oder auch nicht.



    stock CreateSektor()
    {
    new str[128],i;
    mysql_query("SELECT * FROM `sektor`;");
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],i,str);
    ++i;
    }
    mysql_free_result();
    }


    //edit
    Wenn du zum hochzählen System[SektorOnline] vorgesehen hast kannst du dies auch anstelle von i benutzen.

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