[MYSQL] Dynamisches Haussystem Problem

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 Morgen liebe Breadfish User,


    da ich keine lust mehr auf die Speicherart "dini" habe, habe ich versucht mein Dynamisches Haussystem bzw. Staatsgebaeude System umzuschreiben.
    Jedoch funktioniert es nicht so wie ich es will.


    Wenn ich Ingame bin, habe ich meine Standartbefehle die Funktionieren, jedoch er Erstellt & Speichert diese nicht in der MySQL - Tabelle.
    Ich benutze das MySQL Plugin, von "maddins Tutorial".


    Hier mal der Code:


    Hiermit erstelle ich das Gebäude...
    ocmd:createsgebaeude(playerid,params[])
    {
    new Float:x,Float:y,Float:z,gebaeudenamen[28],int,world,opentime,closetime;
    new Zeit = gettime();
    if(sscanf(params,"sdddd",gebaeudenamen,int,world,opentime,closetime))return SendClientMessage(playerid,ROT,"FEHLER:/createsgebaeude [GEBAEUDENAME] [INT-NR] [V-WELT] [OpenTime] [CloseTime]");
    if(int < 1 || int > 3)return SendClientMessage(playerid,ROT,"FEHLER:Die INTERIOR-NUMMER muss zwischen 1 - 3 liegen!");
    if(Zeit < 0 || Zeit < 24)return SendClientMessage(playerid,ROT,"FEHLER:Die LADEN-ZEITEN müssen zwischen 0 - 24Uhr liegen!");
    GetPlayerPos(playerid,x,y,z);
    ErstelleSGebaeude(x,y,z,gebaeudenamen,int,world,opentime,closetime);
    switch(int){
    case 2: SetPlayerMapIcon(playerid,int,x,y,z,38,0,MAPICON_LOCAL);
    case 3: SetPlayerMapIcon(playerid,int,x,y,z,52,0,MAPICON_LOCAL);
    case 4,5: SetPlayerMapIcon(playerid,int,x,y,z,30,0,MAPICON_LOCAL);
    }
    return 1;
    }


    Hier wird es Erstellt...
    stock ErstelleSGebaeude(Float:x,Float:y,Float:z,gebaeudenamen[28],int,world,opentime,closetime)
    {
    new query[256];
    for(new i = 1; i <MAX_STAATSGEBAEUDE; i++){
    format(query, sizeof(query), "INSERT INTO `staatsgebaeude` (`GebaeudeName`, `PosX`, `PosY`, `PosZ`, `Interior`, `VirtuelleWorld`, `Oeffnungszeiten`, `Schliesszeiten`) VALUES ('%s', '%f', '%f', '%f', '%d', '%d', '%d', '%d')", gebaeudenamen,x,y,z,int,world,opentime,closetime);
    mysql_query(query);
    StaatsInfo[i][Erstellt] = 1;
    return LadeSGebaeude(i);
    }
    return true;
    }


    Hier wird es wieder geladen...
    stock LadeSGebaeude(staatsid)
    {
    new StaatsDatei[64];
    format(StaatsDatei,64,"%d",staatsid);
    format(StaatsInfo[staatsid][GebaeudeNamen],28,mysql_GetString("staatsgebaeude","GebaeudeName","ID",StaatsDatei));
    StaatsInfo[staatsid][PosX] = mysql_GetFloat("staatsgebaeude","PosX","ID",StaatsDatei);
    StaatsInfo[staatsid][PosY] = mysql_GetFloat("staatsgebaeude","PosY","ID",StaatsDatei);
    StaatsInfo[staatsid][PosZ] = mysql_GetFloat("staatsgebaeude","PosZ","ID",StaatsDatei);
    StaatsInfo[staatsid][Interior] = mysql_GetInt("staatsgebaeude","Interior","ID",StaatsDatei);
    StaatsInfo[staatsid][World] = mysql_GetInt("staatsgebaeude","VirtuelleWorld","ID",StaatsDatei);
    StaatsInfo[staatsid][OpenTime] = mysql_GetInt("staatsgebaeude","Oeffnungszeiten","ID",StaatsDatei);
    StaatsInfo[staatsid][CloseTime] = mysql_GetInt("staatsgebaeude","Schliesszeiten","ID",StaatsDatei);
    StaatsInfo[staatsid][Erstellt] = mysql_GetInt("staatsgebaeude","Erstellt","ID",StaatsDatei);
    if(StaatsInfo[staatsid][Erstellt] == 1){
    StaatsInfo[staatsid][Pickup] = CreatePickup(1559,23,StaatsInfo[staatsid][PosX],StaatsInfo[staatsid][PosY],StaatsInfo[staatsid][PosZ],0);


    new string[196],string2[196];
    format(string,196,"{FFFFFF}Gebäude: {0080FF}%s\n{FFFFFF}Öffnungszeiten: {0080FF}%i {FFFFFF}- {0080FF}%i\n{FFFFFF}Eingang: {0080FF}ENTER-TASTE",StaatsInfo[staatsid][GebaeudeNamen],StaatsInfo[staatsid][OpenTime],StaatsInfo[staatsid][CloseTime]);


    format(string2,196,"{FFFFFF}Gebäude: {0080FF}%s\nAusgang: ENTER-TASTE",StaatsInfo[staatsid][GebaeudeNamen]);
    }
    return 1;
    }


    Ich hoffe mir kann geholfen werden.


    - YizOP_

  • Könntest du uns eventuell einen Auszug des MySQL-Logs liefern?
    Eventuell findet man dort genauere Informationen darüber, wieso er dir den Datensatz nicht in die Tabelle schreiben will.


    Die Logdatei sollte sich in deinem Hauptverzeichnis des SA:MP-Serverordners befinden.


  • Könntest du uns eventuell einen Auszug des MySQL-Logs liefern?
    Eventuell findet man dort genauere Informationen darüber, wieso er dir den Datensatz nicht in die Tabelle schreiben will.


    Die Logdatei sollte sich in deinem Hauptverzeichnis des SA:MP-Serverordners befinden.


    Habe dazu nichts gefunden, aber ich kann es gerne mal printen und dann ein Screen machen.

  • Jo, weis schon. :D
    Bloß bin da nicht klar gekommen.


    Hier mal Pastebin für mein Debug Code:


    http://pastebin.com/M4QdtmXD


    [06:03:07] CMySQLHandler::Query(SELECT `VirtuelleWorld` FROM `staatsgebaeude` WHERE `ID` = '1') - An error has occured. (Error ID: 1054, Unknown column 'VirtuelleWorld' in 'field list')


    Zeig mal die Zeile, wo du VirtuelleWorld selectest?


    //E: Da ist n Schreibfehler drinne..


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • ocmd:createsgebaeude(playerid,params[])
    {
    new Float:x,Float:y,Float:z,gebaeudenamen[28],int,world,opentime,closetime;
    new Zeit = gettime();
    if(sscanf(params,"sdddd",gebaeudenamen,int,world,opentime,closetime))return SendClientMessage(playerid,ROT,"FEHLER:/createsgebaeude [GEBAEUDENAME] [INT-NR] [V-WELT] [OpenTime] [CloseTime]");
    if(int < 1 || int > 3)return SendClientMessage(playerid,ROT,"FEHLER:Die INTERIOR-NUMMER muss zwischen 1 - 3 liegen!");
    if(Zeit < 0 || Zeit < 24)return SendClientMessage(playerid,ROT,"FEHLER:Die LADEN-ZEITEN müssen zwischen 0 - 24Uhr liegen!");
    GetPlayerPos(playerid,x,y,z);
    ErstelleSGebaeude(x,y,z,gebaeudenamen,int,world,opentime,closetime);
    switch(int){
    case 2: SetPlayerMapIcon(playerid,int,x,y,z,38,0,MAPICON_LOCAL);
    case 3: SetPlayerMapIcon(playerid,int,x,y,z,52,0,MAPICON_LOCAL);
    case 4,5: SetPlayerMapIcon(playerid,int,x,y,z,30,0,MAPICON_LOCAL);
    }
    return 1;
    }


    Hier is der ganze Befehl, da wähle ich auch die V-World aus.


  • `VirtuelleWorld`


    Bist du sicher dass du das überall so hast, auch in der Datenbank?


    Weil:
    virtueleworld != VirtuelleWorld
    Laut dem Debug ist da n Schreibfehler drinne.


    //E: Und nicht nur einen Schreibfehler:


    [06:03:07] CMySQLHandler::Query(SELECT `Oeffnungszeiten` FROM `staatsgebaeude` WHERE `ID` = '1') - An error has occured. (Error ID: 1054, Unknown column 'Oeffnungszeiten' in 'field list')


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Joa, hab selbst jetzte alles gefunden die Schreibfehler, jedoch meckert er schon bei der Erstellung.


    [06:26:24] CMySQLHandler::Query(INSERT INTO `staatsgebaeude` (`GebaeudeName`, `PosX`, `PosY`, `PosZ`, `Interior`, `VirtuelleWorld`, `Oeffnungszeiten`, `Schliesszeiten`) VALUES ('Test', '1059.564208', '-289.121398', '73.992187', '1', '0', '3', '24')) - An error has occured. (Error ID: 1062, Duplicate entry '0' for key 'PRIMARY')


    Nur noch das crashed.

  • An error has occured. (Error ID: 1062, Duplicate entry '0' for key 'PRIMARY')


    An error has occured. (Error ID: 1062, Duplicate entry '0' for key 'PRIMARY')


    Wenn ichs richtig verstehe, duplizierst du den Eintrag 0, wo der PRIMARY KEY (Meistens "ID") ist.


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!


  • Er meckert weil es schon einen Eintrag mit der ID 0 gibt. Setz mal deinen Primarykey als AUTO INCREMENT, dann sollte alles funktionieren.


    Oke gemacht, jetzte meckert er nirgends rum, jedoch setzt er kein "Erstellt", das heißt da wird bei mir auch kein Pickup.


    stock ErstelleSGebaeude(Float:x,Float:y,Float:z,gebaeudenamen[28],int,world,opentime,closetime)
    {
    new query[256];
    for(new i = 1; i <MAX_STAATSGEBAEUDE; i++){
    format(query, sizeof(query), "INSERT INTO `staatsgebaeude` (`GebaeudeName`, `PosX`, `PosY`, `PosZ`, `Interior`, `VirtuelleWorld`, `Oeffnungszeiten`, `Schliesszeiten`) VALUES ('%s', '%f', '%f', '%f', '%d', '%d', '%d', '%d')", gebaeudenamen,x,y,z,int,world,opentime,closetime);
    mysql_query(query);
    StaatsInfo[i][Erstellt] = 1; //Dieser Wert wird nicht gespeichert bzw. in die Tabelle eingetragen.
    printf("Name: %s ; X: %f ; Y: %f ; Z: %f ; Interior: %d ; World: %d ; Oeffnungszeiten: %d ; Schliesszeiten: %d",gebaeudenamen,x,y,z,int,world,opentime,closetime);
    return LadeSGebaeude(i);
    }
    return true;
    }

  • format(query, sizeof(query), "INSERT INTO `staatsgebaeude` (`GebaeudeName`, `PosX`, `PosY`, `PosZ`, `Interior`, `VirtuelleWorld`, `Oeffnungszeiten`, `Schliesszeiten`)


    Du hast den Wert da ja auch garnicht drinne, wie soll er da was speichern? :D


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Joa :D


    Ehm hab es s gemacht.

    format(query, sizeof(query), "INSERT INTO `staatsgebaeude` (`GebaeudeName`, `PosX`, `PosY`, `PosZ`, `Interior`, `VirtuelleWorld`, `Oeffnungszeiten`, `Schliesszeiten`, `Erstellt`) VALUES ('%s', '%f', '%f', '%f', '%d', '%d', '%d', '%d', 1)", gebaeudenamen,x,y,z,int,world,opentime,closetime);
    mysql_query(query);
    return LadeSGebaeude(i);


    Es funktioniert auch, jedoch Lädt er es nicht sofort neu, nur wenn ich den Server neustarte, dann liest er es von der Datenbank ab und Erstellt meinen Pickup.


  • Denn zeig uns doch mal den Ladenstock? :D


    So können wir dir da nicht helfen. :wacko:


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Ups, sorry vergessen. ^^


    stock LadeSGebaeude(staatsid)
    {
    new StaatsDatei[64];
    format(StaatsDatei,64,"%d",staatsid);
    format(StaatsInfo[staatsid][GebaeudeNamen],28,mysql_GetString("staatsgebaeude","GebaeudeName","ID",StaatsDatei));
    StaatsInfo[staatsid][PosX] = mysql_GetFloat("staatsgebaeude","PosX","ID",StaatsDatei);
    StaatsInfo[staatsid][PosY] = mysql_GetFloat("staatsgebaeude","PosY","ID",StaatsDatei);
    StaatsInfo[staatsid][PosZ] = mysql_GetFloat("staatsgebaeude","PosZ","ID",StaatsDatei);
    StaatsInfo[staatsid][Interior] = mysql_GetInt("staatsgebaeude","Interior","ID",StaatsDatei);
    StaatsInfo[staatsid][World] = mysql_GetInt("staatsgebaeude","VirtuelleWorld","ID",StaatsDatei);
    StaatsInfo[staatsid][OpenTime] = mysql_GetInt("staatsgebaeude","Oeffnungszeiten","ID",StaatsDatei);
    StaatsInfo[staatsid][CloseTime] = mysql_GetInt("staatsgebaeude","Schliesszeiten","ID",StaatsDatei);
    StaatsInfo[staatsid][Erstellt] = mysql_GetInt("staatsgebaeude","Erstellt","ID",StaatsDatei);
    if(StaatsInfo[staatsid][Erstellt] == 1){
    StaatsInfo[staatsid][Pickup] = CreatePickup(1559,23,StaatsInfo[staatsid][PosX],StaatsInfo[staatsid][PosY],StaatsInfo[staatsid][PosZ],0);


    new string[196];
    format(string,196,"{FFFFFF}Gebäude: {0080FF}%s\n{FFFFFF}Öffnungszeiten: {0080FF}%i {FFFFFF}- {0080FF}%i\n{FFFFFF}Eingang: {0080FF}ENTER-TASTE",StaatsInfo[staatsid][GebaeudeNamen],StaatsInfo[staatsid][OpenTime],StaatsInfo[staatsid][CloseTime]);
    StaatsInfo[staatsid][Label] = Create3DTextLabel(string,WEISS,StaatsInfo[staatsid][PosX],StaatsInfo[staatsid][PosY],StaatsInfo[staatsid][PosZ],20,0,0);
    }
    return 1;
    }

  • for(new i = 1; i <MAX_STAATSGEBAEUDE; i++)


    Bist du sicher, dass die Schleife nicht bei 0 anfangen sollte? 0 Wäre in dem Fall deine eigene Playerid.


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

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