SMS es wird immer ein und die Selbe ausgelesen

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


    Ich hab ein kleines Problemchen bei meinen SMS System
    Aus irgendeinen Grund wird mir immer die Selbe SMS angezeigt obwohl ich eine Andere auswähle
    Auslesen lass ich die so:
    case diaHandySMS:{
    if(!response)return 1;
    format(query,256,"SELECT `sms`.`betreff`,`sms`.`new`,(SELECT `user`.`username` FROM `user` WHERE `user`.`userid`=`sms`.`from`) as `sender` FROM `sms` WHERE `sms`.`to`=%d;",GetPVarInt(playerid,"userid"));
    mysql_query(query,(-1), (0), sql);
    mysql_store_result(sql);
    new row = mysql_num_rows(sql);
    if(row){
    for(new i=0;i<row;i++){
    new Name[MAX_PLAYER_NAME],head[31],idsss[2];
    mysql_fetch_row_data(sql);
    mysql_fetch_field("sender",Name,sql);
    mysql_fetch_field("betreff",head,sql);
    mysql_fetch_field("new",idsss,sql);
    format(dialog, sizeof(dialog), "%s%s%s - %s\n",dialog,((strval(idsss)==0)?("{FFFFFF}"):("{008000}")),Name,head);
    }
    ShowPlayerDialog(playerid,diaSMSList,DIALOG_STYLE_LIST,"Handy SMS Speicher",dialog,"Lesen","Zurück");
    }
    else{
    SendClientMessage(playerid,cYellow,"[HANDY] Du hast keine SMS im speicher!");
    }
    mysql_free_result(sql);
    return 1;
    }
    Funktioniert Wunderbar
    Der Code wo ich den dialog dann weiterführen lasse ist der:
    case diaSMSList:{
    if(!response)return 1;
    readsms(playerid, listitem);
    return 1;
    }
    Wird auch ausgeführt
    Nun zu der Funktion die nicht so will wie so soll
    readsms(playerid, ids){
    new query[256],smsid[12];
    format(query,256,"SELECT `sms`.`id`,`sms`.`message`,`sms`.`betreff`,`sms`.`from`, (SELECT `user`.`username` FROM `user` WHERE `user`.`userid` = `sms`.`from`) as `sender`, (SELECT FROM_UNIXTIME(`sms`.`time`, '%%d.%%m.%%Y %%T')) as `gesendet` FROM `sms` WHERE `sms`.`to` = %d;",GetPVarInt(playerid,"userid"));
    mysql_query(query,(-1), (0), sql);
    mysql_store_result(sql);
    new row = mysql_num_rows(sql);
    if(row){
    for(new i=0;i<row;i++){
    if(i != ids)continue;
    new Name[MAX_PLAYER_NAME],id[30],betreffs[80],head[31],froms[12];
    mysql_fetch_row_data(sql);
    mysql_fetch_field("id",smsid,sql);
    mysql_fetch_field("from",froms,sql);
    mysql_fetch_field("sender",Name,sql);
    mysql_fetch_field("betreff",head,sql);
    mysql_fetch_field("message",betreffs,sql);
    mysql_fetch_field("gesendet",id,sql);
    format(query, sizeof(query), "%s schieb am %s Uhr:\n\n%s", Name, id, betreffs);
    ShowPlayerDialog(playerid,diaSMSread,DIALOG_STYLE_MSGBOX,head,query,"Antworten","Zurück");
    SetPVarInt(playerid,"SMSusr",strval(froms));
    SetPVarString(playerid,"SMShead",head);
    }
    }
    mysql_free_result(sql);
    format(query,128,"UPDATE `sms` SET `new`=0 WHERE `id`=%d;",strval(smsid));
    mysql_query(query,(-1), (0), sql);
    return 1;
    }
    er liest immer die erste aus die er finden kann
    gedebuggt habe ich es da kam als ids eine 1 hin jedoch zeigt er mir immer die sms 0 an.


    kann jemand von euch einen Fehler finden?
    Ich bin ratlos

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

  • Ich hab es doch schon gedebuggt X(
    Ich schreib sowas nicht einfach hin aber hier das kommt bei raus

    Code
    [10:36:26] dialog: 2 rows
    [10:36:27] funktion: 2 rows - listitem 0
    [10:36:27] funktion: i=0 titel: Hallo Beavis
    [10:36:27] dialog: 0 listitem
    [10:36:29] dialog: 2 rows
    [10:36:31] funktion: 2 rows - listitem 1
    [10:36:31] funktion: i=1 titel: Hallo Beavis <--- da muss was anderes stehen

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

  • Benutze mal "mysql_fetch_field_num" anstelle von "mysql_fetch_row_data".
    Siehst du bei "readsms" in den Zeilen 11 bis 17 irgendwo dein "ids"? row_data ist so nur für eine Zeile.
    Könntest es aber auch umändern in eine while-Schleife mit "mysql_fetch_row_data".

  • Ich schreib sowas nicht einfach hin aber hier das kommt bei raus

    Das liegt hier dran


    if(row){
    for(new i=0;i<row;i++){
    if(i != ids)continue;
    new Name[MAX_PLAYER_NAME],id[30],betreffs[80],head[31],froms[12];
    mysql_fetch_row_data(sql);


    An mysql_fetch_row_data springst von einem ausgelesenen Beitrag zu nächsten der gefunden wird.


    daher wird das auch immer bei 0 bleiben, wie man das erkennen kann von dem oben geposteten code.
    Daher solltest du die funktion direkt aufrufen nach der schleife.
    if(row){
    for(new i=0;i<row;i++){
    mysql_fetch_row_data(sql);
    if(i != ids)continue;
    new Name[MAX_PLAYER_NAME],id[30],betreffs[80],head[31],froms[12];


    1 Eintrag passt nicht zum listitem daher wird dieser übersprungen bis einer zum listitem passt.

  • field_num nehm ich nicht da mir der server verreckt wenn ein Feld leer ist
    Die lösung hab ich bereits musste einfach das
    mysql_fetch_row_data(sql);
    vor die if abfrage machen


    Ok Proto war schneller als ich :D

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

    Einmal editiert, zuletzt von Beavis () aus folgendem Grund: nix for if is dran :D