Datenbank frage

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
  • Füge das hier bei der Erstellung der Pflanzen (und beim Laden) hinzu:
    HanfInfo[i][h_existiert] = true;
    Wenn du eine Pflanze löschst:
    HanfInfo[i][h_existiert] = false;


    Im enum:
    bool:h_existiert,


    Und dann ändere beim Updaten:
    if(HanfInfo[i][h_wasser]==0)
    zu:
    if(HanfInfo[i][h_wasser]==0 && HanfInfo[i][h_existiert])
    Darunter entfernst du die Pflanze ja, also dort nicht vergessen, den Wert auf false zu setzen.

  • ocmd:drogenkaufen(playerid, params[])
    {
    new query[250],samenan,string[126];
    if(sInfo[playerid][inventar]==0)return SendClientMessage(playerid,Weiss,"Du besitzt kein Rucksack! Besorge dir eins im 24/7");
    if(IsPlayerInRangeOfPoint(playerid,5,-1438.7542,-1543.4083,101.7578))
    {
    format(query,sizeof(query),"SELECT COUNT(besitzer) FROM hanf WHERE besitzer = '%s') ",SpielerName(playerid));
    mysql_function_query(dbhandle,query,true,"Drogenanzahl","i",playerid);
    if(sscanf(params,"i",samenan))return SendClientMessage(playerid,Weiss,"Benutzung: /drogenkaufen [anzahl drogensamen]");
    {
    if(sInfo[playerid][samen]+samenan<=maxdrogen[playerid])



    ich habe es jetzt in meinem Befehl


    public Drogenanzahl(playerid)
    {
    new num_fields,num_rows,query[250];
    cache_get_data(num_rows, num_fields, dbhandle);
    new anzahl = cache_get_row_int(0, 0);
    format(query,sizeof(query),"%i",anzahl);
    SendClientMessage(playerid,Weiss,query);
    for(new i=0; i<num_rows; i++)
    {


    }
    return 1;
    }



    erstmal nur als test, muss das"anzahl" in die schleife rein ?

  • Die Schleife benötigst du hier gar nicht. Du kannst es so machen:
    public Drogenanzahl(playerid)
    {
    new num_fields,num_rows,query[145], anzahl;
    cache_get_data(num_rows, num_fields, dbhandle);
    if(num_rows) anzahl = cache_get_row_int(0, 0);
    format(query,sizeof(query),"%i",anzahl);
    SendClientMessage(playerid,Weiss,query);
    return 1;
    }

  • format(query,sizeof(query),"SELECT COUNT(besitzer) FROM hanf WHERE besitzer = '%s') ",SpielerName(playerid));


    format(query,sizeof(query),"SELECT COUNT(besitzer) FROM hanf WHERE besitzer = '%s' ",SpielerName(playerid));

    Das würde ich aber lieber per MySQL-Query und seiner Cache-Funktion machen.
    Da ist ein neues Public dafür in meinen Augen relativ ungeeignet (sofern R33+, keine Ahnung mehr inwiefern sich diese unterscheiden).


    Sprich:

    new Cache:result = mysql_query(verbindungsid,query,true);

    Dann einfach den Inhalt auslesen und mit cache_delete(result); den Speicher bereinigen. :)

  • Bin mir dabei nicht sicher aber wenn du direkt das Ergebnis abfragst ohne callback kann es passieren dass das Spiel laggt wenn der MySQL Server (warum auch immer) länger braucht für die Anfrage dies hast du mit dem Async query nicht. Wie gesagt bin mir da nicht sicher da ich es so bisher nicht vewendet habe bzw. brauchte.

  • es nimmt zusätzliche Ressourcen für einen Wiedergabewert ein, den man auch über das "kleinere" Verfahren herauskriegen kann.

    Möglicherweise, ja, das ist allerdings nicht der Sinn vom Caching und wahrscheinlich auch vernachlässigbar, sondern es geht darum, dass der Server nicht auf die Antwort des MySQL Severs warten muss.
    Braucht dein MySQL Server angenommen 2 Sekunden für die Antwort auf das Query, aus welchem Grund auch immer, dann steht dein SA-MP Server so lange, bis die Antwort da ist. Das resultiert in einem merkbaren Lag. Daher sollte man, wo möglich, die Cache Funktionen in ein public auslagern.

  • 1. Query:
    SELECT id FROM hanf;
    => mysql_function_query -> Dort eine Schleife durch die Anzahl der zurückgegebenen Rows machen und den Cache auslesen.


    new oldID, newID;for(new i = 0; i < rows; i++){ newID = cache_get_row_int(i, 0); if(newID > oldID + 1) { //2. Query: INSERT INTO hanf (id, etc...) VALUES (%d, etc...); break; } oldID = newID;}

    Das kann man auch direkt in der Query lösen.


    Hier mal ein Beispiel:


    SQL
    SELECT MIN(Tabelle.id+1) FROM Tabelle LEFT JOIN Tabelle AS TempData ON Tabelle.id+1 = TempData.id WHERE TempData.id IS NULL AND Tabelle.id > 0
  • Das kann man auch direkt in der Query lösen.

    Gute Methode, funktioniert super! Ist ein sehr geschickter Lösungsweg. Danke für den Hinweis. :good:


    Wenn man mehrere IDs gleichzeitig auslesen will, geht es auch, minimal abgewandelt:

    SQL
    SELECT Tabelle.id+1 FROM Tabelle LEFT JOIN Tabelle AS TempData ON Tabelle.id+1 = TempData.id WHERE TempData.id IS NULL AND Tabelle.id > 0