Mysql retrieve row gibt nicht da aus was ich möchte

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
  • Da ist nur noch das hier //*****************< mysql_PlayerVehicleLoad >*****************//


    stock mysql_PlayerVehicleSave(playerid)
    {
    for(new fID = 1; fID <= pInfo[playerid][MaxVehicles]; fID++)
    {
    new fIDStr[3], escapedName[20];
    mysql_real_escape_string(PlayerName(playerid), escapedName);
    DestroyVehicle(Vehicle[playerid][fID]);
    format(fIDStr, sizeof(fIDStr), "%d", fID);
    if(mysql_DoubleRowExist(playerid, "db_vehicles", "pName", "vNumber", escapedName, fIDStr))
    {
    if(pVehicle[playerid][fID][Modelid] >= 1)
    {
    new str1[300], str2[300], str3[300], str4[300], query[780];
    format(str1, sizeof(str1), "UPDATE `db_vehicles` SET `Numberplate` = '%s', `vPosX` = '%.4f', `vPosY` = '%.4f', `vPosZ` = '%.4f', `vPosA` = '%.4f'", pVehicle[playerid][fID][Numberplate], pVehicle[playerid][fID][vPosX], pVehicle[playerid][fID][vPosY], pVehicle[playerid][fID][vPosZ], pVehicle[playerid][fID][vPosA]);
    format(str2, sizeof(str2), ", `Fuel` = '%.2f', `Colour1` = '%i', `Colour2` = '%i', `Paintjob` = '%i', `Mod0` = '%i', `Mod1` = '%i', `Mod2` = '%i'", pVehicle[playerid][fID][Fuel], pVehicle[playerid][fID][Colour1], pVehicle[playerid][fID][Colour2], pVehicle[playerid][fID][Paintjob], pVehicle[playerid][fID][Mod0], pVehicle[playerid][fID][Mod1], pVehicle[playerid][fID][Mod2]);
    format(str3, sizeof(str3), ", `Mod3` = '%i', `Mod4` = '%i', `Mod5` = '%i', `Mod6` = '%i', `Mod7` = '%i', `Mod8` = '%i', `Mod9` = '%i'", pVehicle[playerid][fID][Mod3], pVehicle[playerid][fID][Mod4], pVehicle[playerid][fID][Mod5], pVehicle[playerid][fID][Mod6], pVehicle[playerid][fID][Mod7], pVehicle[playerid][fID][Mod8], pVehicle[playerid][fID][Mod9]);
    format(str4, sizeof(str4), ", `Mod10` = '%i', `Mod11` = '%i', `Mod12` = '%i', `Mod13` = '%i' WHERE `pName` = '%s' AND `vNumber` = '%i'", pVehicle[playerid][fID][Mod10], pVehicle[playerid][fID][Mod11], pVehicle[playerid][fID][Mod12], pVehicle[playerid][fID][Mod13], pVehicle[playerid][fID][Mod14], escapedName, fID);
    format(query, sizeof(query), "%s%s%s%s%s%s", str1, str2, str3, str4);
    mysql_function_query(MySQLHandle, query, false, "OnGetReturn", "", "");
    return 1;
    }
    }
    }
    }


    forward OnGetReturn();
    public OnGetReturn()
    {
    return 1;
    }

  • if(mysql_DoubleRowExist(playerid, "db_vehicles", "pName", "vNumber", escapedName, fIDStr))



    Das sollte schonmal nicht mehr funktionieren schätze ich.


    Ausserdem ist da bei deinem
    mysql_function_query(MySQLHandle, query, false, "OnGetReturn", "", "");
    etwas faul. Nach "OnGetReturn" lässt du den String leer, in dem du sagst welche Parameter übergeben werden sollen, übergibst dann aber noch einen leeren String. Lass den Letzten Parameter einfach mal weg.

    Und noch ein kleiner Tipp zu mysql_function_query. Wenn du bei deiner Query keine Daten erwartest kannst du das Callback auch einfach weglassen, sprich den String dafür einfach leer lassen. Dann wird auch kein Callback ausgeführt.
    Die Zeile würde also wie folgt lauten:

    mysql_function_query(MySQLHandle, query, false, "", "");


    Das Callback OnGetReturn kannst du dann entfernen.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Hmm


    stock mysql_RowExist(playerid, Table[], Where[], Is[])
    {
    new query[80];
    mysql_real_escape_string(Table, Table, 1, 20);
    mysql_real_escape_string(Where, Where, 1, 20);
    mysql_real_escape_string(Is, Is, 1, 20);
    format(query, sizeof(query), "SELECT * FROM `%s` WHERE `%s` = '%s'", Table, Where, Is);
    return mysql_function_query(MySQLHandle, query, true, "OnRowExist", "d", playerid);
    }


    stock mysql_DoubleRowExist(playerid, Table[], Where[], Where2[], Is[], Is2[])
    {
    new query[80];
    mysql_real_escape_string(Table, Table, 1, 20);
    mysql_real_escape_string(Where, Where, 1, 20);
    mysql_real_escape_string(Where2, Where2, 1, 20);
    mysql_real_escape_string(Is, Is, 1, 20);
    mysql_real_escape_string(Is2, Is2, 1, 20);
    format(query, sizeof(query), "SELECT * FROM `%s` WHERE (`%s`, `%s`) = ('%s', '%s')", Table, Where, Where2, Is, Is2);
    return mysql_function_query(MySQLHandle, query, true, "OnRowExist", "d", playerid);
    }


    forward OnRowExist(playerid);
    public OnRowExist(playerid)
    {
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows) return 1;
    else return 0;
    }


    Ich weiß das "mysql_RowExist" funktionier nur bei Double... weiß ich das jetzt nicht sollte eig auch ich habe den query angepasst ^^

  • Der Grund warum ich sage, dass das nicht funktionieren kann ist der gleiche wie bei deinem mysql_GetPlayerPasswort vorhin. Das Callback ist vollkommen unabhängig von der Funktion, in der du es erzeugst. Wenn das Callback ausgeführt wird ist die Funktion, in der die Abfrage gestartet wurde schon lange beendet. Das ist gerade das gute am neuen System. Es wird nichts mehr blockiert. Der Gamemode kann problemlos weiterlaufen während die Abfrage läuft.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Du lässt die Überprüfung einfach weg. Wenn die Zeile nicht existiert kann sie auch nicht geupdated werden, und das wird sie auch nicht.


    Wenn du möchtest, dass die Zeile angelegt wird wenn sie noch nicht existiert gibt es dafür ein nützlichen Konstrukt von MySQL selbst:
    http://www.yourhelpcenter.de/2…ert-record-sql-statement/

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Häh aber er muss mir etwas returnen wie soll ich sonst prüfen ob die Zeile existiert ? 8|
    Davon abgesehen wird es doch in nem anderen Thread ausgeführt also sollte es eig funktionieren wenn ich das so mache das er den Gamemode nicht ausbremsen soll also ohne dieses return und so dan bräuchte ich garkeine Threads 8| aber die frage ist dann noch ob es möglich ist

  • Das musst du ja nicht :)


    Du willst eine Zeile in der Tabelle Updaten, die folgende Bedingungen erfüllt:
    WHERE `pName` = '%s' AND `vNumber` = '%i'
    Wenn es keine Zeile in der Tabelle gibt, die diese Bedingung erfüllt dann wird auch nichts geupdated. Die Überprüfung ist daher nicht nötig, das macht die Datenbank schon von ganz alleine.




    edit Ob du in den Callbacks etwas per return zurückgibst oder nicht ist egal. Es wird ignoriert.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Also meinst du wenn ich
    return mysql_function_query(MySQLHandle, query, true, "OnRowExist", "d", playerid);
    ausführe und jetzt das "OnRowExist" raus nehme gibt er mir trotzdem ne 1 oder 0 zurück ? 8|


    Achja das der Pawn compiler abstürtzt liegt irgendwie einzig und alleine an dem enum nur im anderen Script geht das enum

  • Du kannst aus Callbacks nichts an den Code, in dem du die Abfrage gestartet hast zurückgeben.


    Das ganze funktioniert ähnlich wie mit Dialogen, nur kommen die Antworten hier meist etwas schneller :)
    Du erstellst an einer Stelle im Code einen Dialog und an einer anderen Stelle im Code (OnDialogResponse) kommt dann das Resultat zurück.


    Mit Dialogen kannst du ja auch nicht so eine Funktion erstellen:


    stock IsPlayerCool(playerid) {
    return ShowPlayerDialog(playerid, 123412, DIALOG_STYLE_MSGBOX, "", "Bist du cool?", "Ja", "Nein");
    }


    Das funktioniert prinzipiell nicht, weil Funktion IsPlayerCool in dem Moment beendet wird in dem der Dialog an den Spieler geschickt wird. Die Antwort kommt dann in OnDialogResponse zurück.
    Ganz genau so ist es auch mit dem MySQL Plugin. An einer Stelle im Code startest du die Abfrage und an einer anderen, im erstellten Callback, kommt dann die Antwort wenn die Abfrage beendet ist.
    Da muss man zu Anfang ein wenig umdenken.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Wunderbar :)




    if(mysql_DoubleRowExist(playerid, "db_vehicles", "pName", "vNumber", escapedName, fIDStr))
    {

    }


    Diese if-Abfrage brauchst du nicht. In der UPDATE Abfrage hast du ein WHERE Statement:
    WHERE `pName` = '%s' AND `vNumber` = '%i'


    Wenn deine Datenbank keine Zeile finden kann, die die Bedingung nach dem WHERE erfüllt dann passiert nichts. Da kannst du dich da ganz auf deinen MySQL Server verlassen und dein Code wird dadurch sogar kürzer.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

    Einmal editiert, zuletzt von Blowfish ()

  • So noch eine frage dann gehe ich off :P also in meinem mysql log steht überall


    [23:33:46] [ERROR] cache_get_row_float - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type
    [23:33:46] [ERROR] cache_get_row_int - invalid data type


    wie kommt das 8| ?

  • Woher hast du denn überhaupt diese Funktionen? Im standard release sind die soweit ich weiß nicht vorhanden.


    edit: Kommando zurück! :) Die müssen neu sein, kannte ich noch gar nicht...


    char *RowData = NULL;
    Result->GetRowData(params[1], params[2], &RowData);
    if(RowData == NULL || sscanf(RowData, "%d", &ReturnVal) != 1) {
    CLog::Get()->LogFunction(LOG_ERROR, false, "cache_get_row_int", "invalid data type");
    ReturnVal = 0;
    }



    Um genau zu sein kommen die Fehler von diesem Code :)
    Es wird wohl daran liegen, dass du irgendwo cache_get_row_int ausführst obwohl für die angegebene Zeile / Spalte gar kein Ergebnis existiert.

    In deinem OnPlayerVehicleLoad Callback überprüfst du Beispielsweise nicht ob die Abfrage wirklich ein Ergebnis hat.

    Dies zu überprüfen ist sehr simpel. Füge einfach nach cache_get_row folgendes ein:


    if(rows == 0)

    return 0;

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

    Einmal editiert, zuletzt von Blowfish ()