MySQL Abfrage funktioniert nicht

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,
    Ja, ich mal wieder mit ner MySQL Frage.
    Ich möchte Aus einer Tabelle (Schema id|Von|An|Text) Herauslesen von wem ich SMS bekommen habe.
    Zuerst soll nur die Nummer in einem Dialog angezeigt werden, um das Übersichtlicher zu halten. Jedoch wird der Dialog nicht gezeigt, und die Nachricht (wo nur Testweise da ist) schickt ebenfalls nur einen Leeren String. Nun, wo liegt das Problem?


    MfG


    dcmd_smsfach(playerid,params[])
    {
    #pragma unused params
    new id,Von,An,Text[256];
    new Data[256];
    mysql_query("SELECT * FROM sms WHERE An = %d ORDER BY id",Spielerdaten[playerid][Handy]);
    mysql_store_result();
    new string[256];
    while(mysql_fetch_row_format(Data, "|"))
    {
    sscanf(Data, "p<|>ddds[256]", id,Von,An,Text);
    format(string, sizeof(string), "%s\nVon:%d",string,Von);
    }
    mysql_free_result();
    SendClientMessage(playerid,COLOR_RED,string);
    ShowPlayerDialog(playerid,DIALOG_SMS1,0,"SMS Postfach",string,"Beenden"," ");
    return 1;
    }

  • Ja dann zeig doch mal wie du das ohne sscanf machen würdest. Irgendwie muss man die 3-4 SMS ja Voneinander Trennen

  • Natürlich, And id = 3, And id =4, And id = 5 usw...

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


    stock split(const strsrc[], strdest[][], delimiter = '|')
    {
    new i, li, aNum, len, srclen = strlen(strsrc);
    while(i <= srclen)
    {
    if (strsrc[i] == delimiter || i == srclen)
    {
    len = strmid(strdest[aNum], strsrc, li, i, 128);
    strdest[aNum][len] = 0;
    li = i + 1;
    aNum++;
    }
    i++;
    }
    }

  • @[GTA-World]Owner


    Keines Falls meine ich das böse, aber Dein Einwand war leider völlig sinnbefreit.


    Deine Sonderzeichen `` und ' ', nimmt man zur Scripterleichterung und einfach nur
    um Tabellen und Werte von einander optisch besser trennen zu können.


    Und außerdem, müsstest Du dann folgender Maßen editieren...


    SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id`
    `An` und `id`sind genau wie `sms` die entsprechende Tabelle, oder eben Spalte,
    wechle Du, wer sauber scripten möchten, ebenfalls mit einklammern müsstest.



    @Interpidus


    Nur als Tipp, solltest Du MySQL auch etwas zum sortieren geben, was Dein
    Scriptproblem jetzt allerdings bestimmt nicht lösen wird, aber Deine es sollen
    ja bestimmt Deine neusten Nachrichten, oben im String angezeigt werden.
    Welche nach unten im Alter zunehmen.


    SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id` DESC
    Das DESC steht für nichts weiter als, dass die größere ID - also neuere Nachrichten -
    zuerst angezeigt werden und im Alter nach unten fallen.
    Möchtest Du es genau anders herum haben, musst Du statt DESC einfach ASC verwenden.


    Auch wenn ich mich prächtig mit MySQL auskenne und Dir gern helfen würde,
    verstehe ich Dein Problem noch nicht so ganz und Deinen geposteten Code,
    naja mit ist es etwas zuwenig, um etwas damit anzufangen.


    Denn sollte es wirklich nicht funktionieren, findest Du in der ServerLog, meisten MySQL Fehler.
    Füge ansonsten ein "or die mysql_error())" hinter Deiner Query an, um den Fehler zu sehen...

  • @[GTA-World]Owner


    Das ist kein Problem und vor allem ist es immer schön, wenn sich jemand zur
    Hilfe meldet, aber ich wollte Dir eben mal diesen Tipp geben...


    Daher sagte ich auch, dass es nicht böse gemeint sei, sondern eben nur als Tipp ^^



    Das ist leider meine Art, bei Programmierungen sehr pingelich zu sein :D

  • Danke für den Hinweis, hilft mir leider Wenig bei meinem Aktuellen Problem.


    Auch mit dem Or Mysql Error usw. Kommt kein Fehler im Log.



    Ich Versuch nochmal den Sinn zu erklären.


    Ich habe eine Tabelle mit den Spalten id, Von, An, Text . id Ist eben eine ID(Mit Auto_Increment), Von Ist die Nummer vom Sender, An ist die Nummer von dem an den die Nachricht geschickt wird, die in dem Fall auch Abgefragt wird. Und der Text ist eben der geschriebene Text, der immoment noch völlig Unrelevant ist, da es ja erstmal nur Abfragen soll ob man überhaupt eine SMS bekommen hat, und wenn ja, von wem.

  • SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id` DESC
    Also, ich würde Dir empfehlen eine Abfrage mit mysql_num_rows zu machen.
    Ich erkläre es kurz und knapp...

    Folgender Script Abschnitt liegt ja vor...


    mysql_query("SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id` DESC", Spielerdaten[playerid][Handy]);
    mysql_store_result();


    Mit einer 'mysql_num_rows' Abfrage, prüft MySQL erst einmal, ob es
    überhaupt der ausgeführte Query eine Übereinstimmung findet, d.h. für Dich
    ob Dein Spieler überhaupt eine Nachricht hat.


    if(mysql_num_rows() > 0)
    {
    // Spieler hat min. eine Nachricht
    }
    else
    {
    // Spieler hat keine
    }


    So und nun arbeitest Du einfach in dem Teil weiter, in dem der Spieler
    min. eine Nachricht erhalten hat und fügst Deine while Schleife richtig ein,
    welche Dir dann eigentlich Deinen String ausgeben sollte.


    Probiers vielleicht erst einmal immer mit einer einfach ClientNachricht, die
    immer sagt richtig oder falsch, bevor Du den ShowDialog wieder einbaust, so
    weißt Du dann das es definitiv, oder gar nicht funktioniert.

  • Danke, die Funktion kannte ich noch nicht, das wird mir auf jedenfall weiterhelfen.


    Hm ja, Ingame werde ich jetzt benachrichtigt ich habe keine Nachrichten.
    Der Code sieht nun so aus (So müsste er ja auch Stimmen, von der Frage her ob ich eine SMS habe oder nicht)

    mysql_query("SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id` DESC", Spielerdaten[playerid][Handy]);
    mysql_store_result();
    if(mysql_num_rows() > 0)
    {
    new string[256];
    while(mysql_fetch_row_format(Data, "|"))
    {
    sscanf(Data, "p<|>ddds[256]", id,Von,An,Text);
    format(string, sizeof(string), "%s\nVon:%d",string,Von);
    }
    mysql_free_result();
    SendClientMessage(playerid,COLOR_RED,string);
    ShowPlayerDialog(playerid,DIALOG_SMS1,0,"SMS Postfach",string,"Beenden"," ");
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Du hast keine Nachrichten.");
    }


    Jedenfalls hab ich sicher 3 SMS, ist in der Tabelle enthalten.

  • Hmm... das macht mich irgendwie fertig ^^


    Die Abfrage mit der MySQL num_rows Funktion ist definitiv nicht falsch,
    also kann es ja nur am Query liegen.


    Bist Du Dir sicher, dass Deine Telefonnummer, auch wirklich als dezimale
    im Script gesichert wird und nicht - warum auch immer - zufällig als String?


    Versuch doch mal zum Spaß folgendes...


    mysql_query("SELECT * FROM `sms` WHERE `An` = '%d' ORDER BY `id` DESC", Spielerdaten[playerid][Handy]);


    new string[256];
    format(string, sizeof(string), "Nummer: %d", Spielerdaten[playerid][Handy]);
    SendClientMessage(playerid,COLOR_RED, string);


    mysql_store_result();


    if(mysql_num_rows() > 0)
    {
    SendClientMessage(playerid,COLOR_RED, "Du hast defintiv Post^^");
    // while(mysql_fetch_row_format(Data, "|"))
    // {
    // sscanf(Data, "p<|>ddds[256]", id,Von,An,Text);
    // format(string, sizeof(string), "%s\nVon:%d",string,Von);
    // }
    // mysql_free_result();
    // SendClientMessage(playerid,COLOR_RED,string);
    // ShowPlayerDialog(playerid,DIALOG_SMS1,0,"SMS Postfach",string,"Beenden"," ");
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Du hast keine Nachrichten.");
    }



    Schau mal bitte, ob die Nummer ingame richtig angezeigt wird und vergleich Sie
    bitte EXAKT mit der Nummer in Deiner MySQL Tabelle.

  • Nein, es ist ein Integer, sicher.
    Auch bei diesem Code kommt du hast keine Nachrichten^^


    Bin jez ne Zeit Off