MySQL Daten den Variablen zuordnen

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
  • Hallo.
    Ich bin noch nicht so gut in Sachen MySQL, kriege aber ein Login/Registrations-Script locker hin.


    Ich möchte ein Fahrzeug-System erstellen, worin ein Spieler je nach Definierung mehr oder weniger Fahrzeuge haben kann.


    Derzeit soll ein Spieler maximal 5 Private Fahrzeuge besitzen können.
    Das habe ich folgendermaßen erstellt:

    #define MAX_PRIVATE_VEHICLES 5


    enum PrivateVehicles
    {
    vCarID,
    vModelID,
    Float:vPosX,
    Float:vPosY,
    Float:vPosZ,
    Float:vPosRot,
    vColor1,
    vColor2
    }
    new PrivateVehicle[MAX_PRIVATE_VEHICLES][PrivateVehicles];


    Und nun möchte ich die Fahrzeuge beim connecten laden lassen, wo ich aber Probleme mit den MySQL Abfragen habe.
    Ich möchte ja, dass wenn der Spieler z.B. 2/5 Fahrzeuge hat, nur diese erstellt werden und nur diese geladen werden.
    Das habe ich folgendermaßen:

    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][x]){
    new string[128];
    format(string, sizeof(string), "SELECT * FROM `PrivateVehicles` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(string);
    mysql_store_result();
    if(mysql_num_rows() != 0){
    PrivateVehicle[i][vModelID] = mysql_GetInt("PrivateVehicles", "ModelID", "Besitzer", GetName(playerid));
    }
    }
    }
    return 1;
    }


    Nur ich weiß jetzt nicht, ob es richtig ist, und wie ich ggf. weiter machen soll.


    Ich hoffe ihr könnt helfen. :)


    //Edit
    Habs mal geändert, wäre es so richtig?

    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][i]){
    new sql[128], data[128];
    format(sql, sizeof(sql), "SELECT * FROM `PrivateCars` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(sql);
    mysql_store_result();
    if(mysql_num_rows() > 0){
    mysql_fetch_field_row(data, "ModelID");
    PrivateVehicle[playerid][i][vModelID] = strval(data);
    }
    }
    }
    return 1;
    }


    Danke.. ._.

  • es würden beide varianten gehen aber wenn du es einfach und übersichtlich haben möchtest,
    dan nutz dafür SSCANF
    Maddin hat dazu ein Tutorial gemacht
    es geht schnell und ist einfach zu bedienen

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

  • Heißt, so?

    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][i]){
    new sql[128], data[128];
    format(sql, sizeof(sql), "SELECT * FROM `PrivateCars` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(sql);
    mysql_store_result();
    if(mysql_num_rows() > 0){
    while(mysql_fetch_row(data)){
    sscanf(data, "e<p<|>iiffffii>", PrivateVehicle[playerid][i]);
    }
    mysql_free_result();
    }
    }
    }
    return 1;
    }
    ?^^


  • wenn es funktioniert das ist es gut ^^ , was ich so nicht genau denke


    benutz die
    mysql_fetch_row_format für die while schleife und deine verwendung von sscanf wäre hier auch falsch
    while(mysql_fetch_row_format(Query,"|"))
    sscanf(data, "p<|>e<iiffffii>", PrivateVehicle[i]);


    du solltest auch hierzu dann die fahrzeuge erstellen lassen :D.


    Ahja ich hab mal für jemanden ein kleines Script gemacht um autos zu speichern und zu laden auch mit sscanf
    ich post hier mal den pastebin vllt hilft dir das ein bissle weiter.


    http://pastebin.de/28677

  • Habe es jetzt so im Script:

    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][i]){
    new sql[128], data[128];
    format(sql, sizeof(sql), "SELECT * FROM `PrivateCars` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(sql);
    mysql_store_result();
    while(mysql_fetch_row_format(sql, "|")){
    sscanf(data, "p<|>e<iiffffii>", PrivateVehicle[playerid][i]);
    printf("%d", PrivateVehicle[playerid][i][vModelID]);
    }
    }
    }
    return 1;
    }


    In der Datenbank stehen auch 2 Einträge, es erscheint aber nichts in der Console.

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



    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][i]){
    new sql[128], data[128];
    format(sql, sizeof(sql), "SELECT * FROM `privatecars` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(sql);
    mysql_store_result();
    while(mysql_fetch_row_format(sql, "|")){
    sscanf(data, "p<|>iffffii",
    PrivateVehicle[playerid][i][vModelID],
    PrivateVehicle[playerid][i][vPosX],
    PrivateVehicle[playerid][i][vPosY],
    PrivateVehicle[playerid][i][vPosZ],
    PrivateVehicle[playerid][i][vPosRot],
    PrivateVehicle[playerid][i][vColor1],
    PrivateVehicle[playerid][i][vColor2]);
    printf("Model: %i, PosX: %f, PosY: %f, PosZ: %f, PosRot: %f, Color1: %i, Color2: %i", PrivateVehicle[playerid][i][vModelID], PrivateVehicle[playerid][i][vPosX],PrivateVehicle[playerid][i][vPosY],PrivateVehicle[playerid][i][vPosZ],PrivateVehicle[playerid][i][vPosRot],PrivateVehicle[playerid][i][vColor1],PrivateVehicle[playerid][i][vColor2]);
    }
    }
    }
    return 1;
    }


    In der Datenbank ist auch etwas eingetragen ... ._.


    //Edit
    Habe es jetzt so:
    stock LoadPlayerVehicles(playerid){
    for(new i=0;i<MAX_PRIVATE_VEHICLES;i++){
    if(!CarSlotInUse[playerid][i]){
    new sql[128], data[128];
    format(sql, sizeof(sql), "SELECT * FROM `privatecars` WHERE `Besitzer` = '%s'", GetName(playerid));
    mysql_query(sql);
    mysql_store_result();
    while(mysql_fetch_row(data)){
    sscanf(data, "p<|>iffffii",
    PrivateVehicle[playerid][i][vModelID],
    PrivateVehicle[playerid][i][vPosX],
    PrivateVehicle[playerid][i][vPosY],
    PrivateVehicle[playerid][i][vPosZ],
    PrivateVehicle[playerid][i][vPosRot],
    PrivateVehicle[playerid][i][vColor1],
    PrivateVehicle[playerid][i][vColor2]);
    CarSlotInUse[playerid][i] = true;
    printf("Model: %i, PosX: %f, PosY: %f, PosZ: %f, PosRot: %f, Color1: %i, Color2: %i", PrivateVehicle[playerid][i][vModelID], PrivateVehicle[playerid][i][vPosX],PrivateVehicle[playerid][i][vPosY],PrivateVehicle[playerid][i][vPosZ],PrivateVehicle[playerid][i][vPosRot],PrivateVehicle[playerid][i][vColor1],PrivateVehicle[playerid][i][vColor2]);
    }
    mysql_free_result();
    }
    }
    return 1;
    }


    Nur leider zeigt es mir immer noch die ganzen Meldungen an, obwohl maximal 5 kommen dürften, und normalerweise nur 2 Einträge bestehen...

  • sscanf(data, "p<|>iiffffii", PrivateVehicle[playerid][i][Model],Private......);


    deine verwendug kann man zusammen fassen in meinem beispiel hier unten ich hab was unnötiges gemacht und zwar den ganzen spaß auch zusätzlich oben im beispiel gesplittet
    was jedoch unnötig ist wie schon erwähnt geht jedoch trotzdem in meinem beispiel was ich gepostet habe ( pastbin).



    e<p<|>iiffffii> das e steht für enum und das p<|> ist der teiler und teilt die einzelne variabeln auf

  • Habe es jetzt alles gelöst, das Fahrzeug wird auch erstellt, usw.
    Aber derzeit habe ich bei dem Speichern (Updaten) ein Problem.
    Ich möchte alle Spieler-Fahrzeuge speichern lassen, sofern die Spieler connected sind und ein Fahrzeug besitzen.

    public OnPlayerCarUpdate(playerid){
    new Query[512];
    for(new x=0;x<MAX_PRIVATE_VEHICLES;x++){
    if(CarSlotInUse[playerid][x]){
    format(Query, sizeof(Query), "UPDATE `privatcars` SET `CarNitro` = '%d', `CarHyd` = '%d', `CarWheel` = '%d', `CarAusp` = '%d', CarSideL = '%d', CarSideR = '%d', CarFB = '%d', CarRB = '%d', CarSpoiler = '%d', CarRoof = '%d', CarHood = '%d', CarVents1 = '%d', CarVents2 = '%d', CarLamps = '%d', CarPJ = '%d', CarC1 = '%d', CarC2 = '%d', CarPreis = '%d', Bass = '%d', RearBars = '%d', FrontBars = '%d', Status = '%d', Abschlepper = '%s', Kaution = '%d', Fuel = '%f' WHERE CarOwner = '%s' AND AutoID = '%d'",
    PrivateCar[playerid][x][CarNitro], PrivateCar[playerid][x][CarHyd], PrivateCar[playerid][x][CarWheel], PrivateCar[playerid][x][CarAusp], PrivateCar[playerid][x][CarSideL], PrivateCar[playerid][x][CarSideR], PrivateCar[playerid][x][CarFB], PrivateCar[playerid][x][CarRB],
    PrivateCar[playerid][x][CarSpoiler], PrivateCar[playerid][x][CarRoof], PrivateCar[playerid][x][CarHood], PrivateCar[playerid][x][CarVents1], PrivateCar[playerid][x][CarVents2], PrivateCar[playerid][x][CarLamps], PrivateCar[playerid][x][CarPJ], PrivateCar[playerid][x][CarC1],
    PrivateCar[playerid][x][CarC2], PrivateCar[playerid][x][CarPreis], PrivateCar[playerid][x][Bass], PrivateCar[playerid][x][RearBars], PrivateCar[playerid][x][FrontBars], PrivateCar[playerid][x][Status], PrivateCar[playerid][x][Abschlepper], PrivateCar[playerid][x][Kaution],
    vehFuel[PrivateCar[playerid][x][vCarID]], GetName(playerid), x);
    mysql_query(Query);
    }
    }
    }


    Es wird einfach nicht ausgeführt (Der Query) habe schon gedebuggt, geht alles...