Guten Abend zusammen,
ich sitze zur Zeit an meinem Carsystem und benutze Mysql.
Ich habe nun folgendes Problem:
Mit meinem Befehl für das Erstellen von Fahrzeugen füge ich sämtliche Eigenschaften des Fahrzeuges meiner "fahrzeug" Tabelle hinzu.
Nun hatte ich das Problem, wenn ich beispielsweise 3 Fahrzeuge auf dem Server habe und dann das 2te Fahrzeug per Befehl lösche, das dann ID 2 in meiner Tabelle fehlt, aber ID 1 und ID 3 verwendet werden.
Dann habe ich mir, damit es ordentlicher aussieht, die fehlen ID´s wieder zu ersetzen mit neuen Fahrzeugen die ich erstelle.
Dan ich dafür kein mysql befehl kannte, habe ich einfach abgefragt, wo die ID größer ist als 0, soll nichts passieren und sobald eine ID erscheint die dann 0 lautet, soll ein Fahrzeug zur Tabelle hinzugefügt werden.
Das habe ich wie folgt gelöst:
dcmd_veh(playerid,params[]) {
new vehid, farbe1, farbe2, Float:x,Float:y, Float:z, Float:r,name[MAX_PLAYER_NAME],query[250];
if(sscanf(params, "ddd",vehid,farbe1,farbe2)) {
return SendClientMessage(playerid,farbe_orange,"USAGE: /veh [Fahrzeugid] [Farbe1] [Farbe2]");
}
GetPlayerPos(playerid,x,y,z);
GetPlayerFacingAngle(playerid, r);
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
format(query, sizeof(query), "SELECT * FROM fahrzeug");
mysql_query(handle, query);
new d = 1;
for(new i = 0; i <sizeof(Fahrzeuginfo);i++)
{
printf("%d FID SCHL",Fahrzeuginfo[i][Fahrzeugid]);
if(Fahrzeuginfo[i][Fahrzeugid] != 0)
{
d++;
continue;
}
else
{
Fahrzeuginfo[i][Fahrzeugid] = d;
Fahrzeuginfo[i][Vehid] = vehid;
Fahrzeuginfo[i][Fahrzeughalter] = name;
Fahrzeuginfo[i][cx] = x;
Fahrzeuginfo[i][cy] = y;
Fahrzeuginfo[i][cz] = z;
Fahrzeuginfo[i][cr] = r;
Fahrzeuginfo[i][Farbe1] = farbe1;
Fahrzeuginfo[i][Farbe2] = farbe2;
Fahrzeuginfo[i][Locked] = 1;
CreateVehicle(vehid,x+2,y+2,z,r,farbe1,farbe2,-1);
format(query, sizeof(query), "INSERT INTO fahrzeug (`fahrzeugid`,`vehid`,`fahrzeughalter`,`cx`,`cy`,`cz`,`cr`,`farbe1`,`farbe2`) VALUES ('%d','%d','%s','%f','%f','%f','%f','%d','%d');",
Fahrzeuginfo[i][Fahrzeugid],
Fahrzeuginfo[i][Vehid],
Fahrzeuginfo[i][Fahrzeughalter],
Fahrzeuginfo[i][cx],
Fahrzeuginfo[i][cy],
Fahrzeuginfo[i][cz],
Fahrzeuginfo[i][cr],
Fahrzeuginfo[i][Farbe1],
Fahrzeuginfo[i][Farbe2]);
mysql_query(handle, query);
break;
}
}
return 1;
}
Nun habe ich ja aber das Problem, wenn ich eine Fahrzeug ID lösche, das die Zeile komplett weg ist und ich nicht weiß, wie ich beispielsweise wieder ID 2 verwenden kann. Daher habe ich versucht, anstatt die Zeile zu löschen, einfach alles in der Zeile auf 0 zu setzen.
Das sah dann wie folgt aus:
1. Variante
if(strcmp(cmdtext,"/dfahrzeug",true)==0)
{
new query[1280];
new fid = GetPlayerVehicleID(playerid);
fid = fid -1;
format(query, sizeof(query), "DELETE FROM fahrzeug WHERE `fahrzeugid` = '%d'",Fahrzeuginfo[fid][Fahrzeugid]);
mysql_query(handle, query);
fid = fid +1;
DestroyVehicle(fid);
return 1;
}
2. Variante war die Zeile auf 0 zu setzen
Nicht wundern das ich fid +1 und -1 rechne, das liegt daran das sich die Vehicleid und die ID des Fahrzeugs in der Tabelle um 1 unterscheiden.
Jetzt erhalte ich aber ein mysql error und die Zeile wird einfach nicht komplett auf 0 gesetzt.
Folgender Fehler:
[16:22:29] [ERROR] CMySQLQuery::Execute - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Ich habe schon versucht query hochzusetzen, da ich in anderen Beiträgen gelesen habe, das es daran liegen kann.
Ich habe versucht, statt den vielen 0 einfach = NULL einzusetzen, damit das Feld bestehen bleibt aber leer ist. NULL wird aber nicht erkannt.
Des Weiteren habe ich versucht mit %d und %s zu arbeiten und dann einfach hinten variablen einzusetzen die 0 sind, ging aber leider auch nicht.
Ich habe auch wie oben beschrieben mit "DELETE FROM fahrzeug WHERE fahrzeugid = %d" gearbeitet, aber das hat dann halt die komplette Zeile entfernt.
Jetzt fragt ihr euch bestimmt warum ich ein Problem damit habe das die Zeile komplett entfernt wird?
Da ich mit meinem aktuellen Befehl es endlich so hingekriegt habe, das sich keine ID´s überschneiden und keine lücken entstehen.
Heißt, wenn ich ID2 gelöscht wird und ich ein neues Fahrzeug erstelle, dann sollte sofern mein UPDATE Befehl irgendwann klappen sollte, ID2 als erstes gefüllt werden, bevor mit ID4 weiter gemacht wird.
Vielen Dank schon mal für das durchlesen meines Problems
Vielleicht kann mir jemand helfen.
Gruß
Kempl
//edit Habe es hinbekommen das die Zeile auf 0 gesetzt wird, aber hilft mir auch nicht wirklich weiter
Ich hätte gerne, das wenn eine ID fehlt in der Reihe beim nächsten Fahrzeug erst die fehlende ID verwendet wird