Datenbank frage
- Gurkie94
- Geschlossen
- Erledigt
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
-
-
Entferne die AUTO_INCREMENT (A_I) Einstellung bei der Spalte "id".
Dann kannst du mit einem INSERT INTO die Zeile mit der ID 3 einfügen (id im Query angeben).
-
Ja habe ich mir auch schon irgendwie so gedacht wusst aber nicht ganz wie ich das umsetzten sollte
gibt es eine abfrage ob die zeile mit der id leer ist ?
-
-
format(query,sizeof(query),"SELECT FROM hanf WHERE id IS NULL (drogenx,drogeny,drogenz,reife,ernte) VALUES ('%f','%f','%f','0','1') ",X,Y,Z);
jetzt erstellt er keine mehr
-
Nein, das geht so nicht.
Du müsstest erst eine SELECT Abfrage machen, die die Tabelle ausliest, dann durchläufst du die Indizes und prüfst, wann ein Sprung kommt (von 2 auf 4 z.B.), sprich wann die momentane ID größer als die vorherige ID+1 ist.Dann machst du einen INSERT auf die vorherige ID+1.
-
komm nicht hinter mit dem was du von mir möchtest
format(query,sizeof(query),"INSERT INTO hanf WHERE id IS NULL (drogenx,drogeny,drogenz,reife,ernte) VALUES ('%f','%f','%f','0','1') ",X,Y,Z);
mysql_function_query(dbhandle,query,false,"","");habe es derzeit so und es wird nichts erstellt wie meinst du das jetzt genau ?
-
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;
} -
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 kommt den unter ein extra public richtig?
-
Genau, so wie bei deinen anderen SELECT Queries im Code auch.
Die Anzahl der Rows musst du wie gewohnt mit cache_get_data auslesen.
-
-
1. Query:
SELECT id FROM hanf;
Und wie lege ich bei dem befehl den die id fest ?
-
Das Query kann genau so aussehen, da hier id als Angabe für die zu selektierende Spalte steht.
Heißt genau dieses Query musst du ausführen, nichts daran ändern. -
ocmd:pflanzen(playerid, params[])
{
if(GetPlayerInterior(playerid) != 0)return SendClientMessage(playerid,Rot,"Du kannst hier keine Drogen pflanzen!");
if(sInfo[playerid][samen]>=1)
{
new query[350];
format(query,sizeof(query),"SELECT id FROM hanf");
mysql_function_query(dbhandle,query,true,"Hanfid","i",playerid);
}else{SendClientMessage(playerid,Weiss,"Du hast keine Samen mehr!");}
return 1;
}
public Hanfid(playerid)
{
new oldID, newID;
new num_fields,rows;
cache_get_data(rows, num_fields, dbhandle);
for(new i = 0; i < rows; i++)
{
newID = cache_get_row_int(i, 0);
if(newID > oldID + 1)
{
new Float:X,Float:Y,Float:Z,query[350];
GetPlayerPos(playerid,X,Y,Z);
CreateObject(3409, X, Y, Z-2, 0, 0, 0, 75);
sInfo[playerid][samen]=sInfo[playerid][samen]-1;
format(query,sizeof(query),"INSERT INTO hanf (drogenx,drogeny,drogenz,reife,ernte) VALUES ('%f','%f','%f','0','1') ",X,Y,Z);
mysql_function_query(dbhandle,query,false,"","");
format(query,sizeof(query),"Hanfid: %i\nReifeprozes: %i",newID);
Create3DTextLabel("Pflanzenid: %i\nReifeprozes: %i", 0x05C800FF, X, Y, Z-0.8, 7.0, 0);
break;
}
oldID = newID;
}
return 1;}
wo leigt der fehler er erstellt immer noch keine
-
Ändere
format(query,sizeof(query),"INSERT INTO hanf (drogenx,drogeny,drogenz,reife,ernte) VALUES ('%f','%f','%f','0','1') ",X,Y,Z);
zu
format(query,sizeof(query),"INSERT INTO hanf (id, drogenx,drogeny,drogenz,reife,ernte) VALUES (%d, '%f','%f','%f','0','1') ",oldID+1,X,Y,Z);Ändere dann, da danach nichts mehr folgt, das
break;in einreturn 1;und füge nach der Schleife, also direkt vor dem zweiten return 1 das ein:
format(query,sizeof(query),"INSERT INTO hanf (id, drogenx,drogeny,drogenz,reife,ernte) VALUES (%d, '%f','%f','%f','0','1') ",oldID+1,X,Y,Z);
mysql_function_query(dbhandle,query,false,"","");
Damit auch ein Eintrag erstellt wird, wenn keine leere Zwischenzeile gefunden wurde. -
Danke dir vielmals habe es jetzt hinbekommen
Nächstest Problem beim laden
er haut mir die ids von den pflanzen durch einander wo vorher hanfid 5 war ist jetzt aufeinmal 0 aber 0 ist trotdem als 5 gespeichert das weiß ich
Gamemodeinit
new query[120];
format(query,sizeof(query),"SELECT * FROM hanf WHERE ernte='1'");
mysql_function_query(dbhandle,query,true,"Hanfladen","");
public Hanfladen(playerid)
{
new num_fields,num_rows,str[126];
cache_get_data(num_rows, num_fields, dbhandle);
for(new i=0; i<num_rows; i++)
{
HanfInfo[i][h_ID] = cache_get_field_content_int(i,"id",dbhandle);
new hid=HanfInfo[i][h_ID];
HanfInfo[hid][h_X] = cache_get_field_content_float(i, "drogenx", dbhandle);
HanfInfo[hid][h_Y] = cache_get_field_content_float(i, "drogeny", dbhandle);
HanfInfo[hid][h_Z] = cache_get_field_content_float(i, "drogenz", dbhandle);
HanfInfo[hid][h_reif] = cache_get_field_content_int(i, "reif", dbhandle);
HanfInfo[hid][h_reife] = cache_get_field_content_int(i, "reife", dbhandle);
HanfInfo[hid][h_wasser] = cache_get_field_content_int(i, "wasser", dbhandle);
HanfInfo[hid][h_Pflanze] = CreateObject(3409, HanfInfo[hid][h_X], HanfInfo[hid][h_Y], HanfInfo[hid][h_Z]-2, 0, 0, 0, 75);
format(str,sizeof(str),"Hanfid: %i\nReif: %i g\nReifeprozess: %i % \nWasservorrat: %i %",hid,HanfInfo[hid][h_reif],HanfInfo[hid][h_reife],HanfInfo[hid][h_wasser]);
HanfInfo[hid][h_Label] = Create3DTextLabel(str, 0x05C800FF, HanfInfo[hid][h_X], HanfInfo[hid][h_Y], HanfInfo[hid][h_Z]-0.6, 7.0, 0);
}
return 1;
} -
Ändere
format(str,sizeof(str),"Hanfid: %i\nReif: %i g\nReifeprozess: %i % \nWasservorrat: %i %",hid,HanfInfo[hid][h_reif],HanfInfo[hid][h_reife],HanfInfo[hid][h_wasser]);
zu
format(str,sizeof(str),"Hanfid: %i\nReif: %i g\nReifeprozess: %i % \nWasservorrat: %i %",HanfInfo[i][h_ID], HanfInfo[i][h_reif],HanfInfo[i][h_reife],HanfInfo[i][h_wasser]);Und ändere
new hid=HanfInfo[i][h_ID];
zu
new hid=i;Oder ändere alle
[hid]
zu
[i] -
Wenn ich eine Pflanze ingame erstele gehen die Label weg sobalb ich diese update woran kann das liegen ?
Hier mal der code wo das Label geupdatet wird.
dürfte eigentlich ja kein fehler sein weil wenn ich es aus der datenbanklade sprich server starte klappt es auch also das Label verschwindet nicht.
for(new i = 0; i < MAX_HANF; i++)
{
if(HanfInfo[i][h_wasser]>=1)
{
if(HanfInfo[i][h_reife]<100)
{
HanfInfo[i][h_reife]++;
format(string,sizeof(string),"HanfID: %i\nReif: %i g\nReifeprozess: %i % \nWasservorrat: %i %",HanfInfo[i][h_ID],HanfInfo[i][h_reif],HanfInfo[i][h_reife],HanfInfo[i][h_wasser]);
Update3DTextLabelText(HanfInfo[i][h_Label], 0x05C800FF, string);
format(string,sizeof(string),"UPDATE hanf SET reife='%i'WHERE id='%i'",
HanfInfo[i][h_reife],HanfInfo[i][h_ID]);
mysql_function_query(dbhandle,string,false,"","");
}
if(HanfInfo[i][h_reife]==100)
{
HanfInfo[i][h_reife]=0;
switch(random(10))
{
case 0:{HanfInfo[i][h_reif]=103;}
case 1:{HanfInfo[i][h_reif]=125;}
case 2:{HanfInfo[i][h_reif]=136;}
case 3:{HanfInfo[i][h_reif]=142;}
case 4:{HanfInfo[i][h_reif]=157;}
case 5:{HanfInfo[i][h_reif]=169;}
case 6:{HanfInfo[i][h_reif]=175;}
case 7:{HanfInfo[i][h_reif]=181;}
case 8:{HanfInfo[i][h_reif]=193;}
case 9:{HanfInfo[i][h_reif]=273;}
}
format(string,sizeof(string),"HanfID: %i\nReif: %i g\nReifeprozess: %i % \nWasservorrat: %i %",HanfInfo[i][h_ID],HanfInfo[i][h_reif],HanfInfo[i][h_reife],HanfInfo[i][h_wasser]);
Update3DTextLabelText(HanfInfo[i][h_Label], 0x05C800FF, string);
format(string,sizeof(string),"UPDATE hanf SET reif='%i'WHERE id='%i'",
HanfInfo[i][h_reif],HanfInfo[i][h_ID]);
mysql_function_query(dbhandle,string,false,"","");
}
}
if(HanfInfo[i][h_wasser]==0)
{
new query[150];
HanfInfo[i][h_ID]=0;
HanfInfo[i][h_reif]=0;
HanfInfo[i][h_reife]=0;
HanfInfo[i][h_wasser]=0;
HanfInfo[i][h_X]=0;
HanfInfo[i][h_Y]=0;
HanfInfo[i][h_Z]=0;
DestroyObject(HanfInfo[i][h_Pflanze]);
Delete3DTextLabel(HanfInfo[i][h_Label]);
mysql_format(dbhandle,query,sizeof(query),"DELETE FROM hanf WHERE id='%i'",i);
mysql_function_query(dbhandle,query,false,"","");
}
}
return 1;
}ich denke mal das der fehler darin liegt wenn ich es erstelle oder irre ich mich ?
-
Wenn das Label weg geht, wird die Pflanze dann auch aus der Datenbank gelöscht?
Wenn ja, dann ist HanfInfo[i][h_wasser] auf 0. -
Ne wird sie nicht es ist echt nur das Label weg das pflanzen Objekt bleibt sowie der Eintrag in der Datenbank
-
Hast du eine Variable um abzufragen, ob eine Pflanze existiert?