mmofacts.com

UPDATE funktioniert nichmehr O_o

gepostet vor 19 Jahre, 7 Monate von Balduran
Ich schreibe grad ein bisschen an meinem Script der für die Berechnung des ganzen Spiel zuständig is.. ein Teil davon ist eine while-schleife die alle Ressourcen-versendungen bearbeitet hier hab ich folgenden Update script
mysql_query("UPDATE fgate_staedte SET eisen=eisen+".$eisen.", holz=holz+".$holz.", nahrung=nahrung+".$nahrung.", stein=stein+".$stein.", gold=gold+".$gold."  WHERE id = '".$fetchbw['empfaenger']."' AND besitzer='".$tselectionf2['besitzer']."'");

nun hab ich mal geguckt ob die Variablen alle funktionieren mit diesem Befehl:
echo "UPDATE fgate_staedte SET eisen=eisen+".$eisen.", holz=holz+".$holz.", nahrung=nahrung+".$nahrung.", stein=stein+".$stein.", gold=gold+".$gold."  WHERE id = '".$fetchbw['empfaenger']."'

";
da krieg ich das hier als Ausgabe:
UPDATE fgate_staedte SET eisen=eisen+50000, holz=holz+50000, nahrung=nahrung+50000, stein=stein+50000, gold=gold+50000 WHERE id = '1'



soo da sieht man ja das Variablen alle stehen und Syntax technisch is doch auch alles richtig ?!
mysql_error gibt auch keine rückmeldung

wo issen da nun der fehler?

also es wird nichts geupdated
gepostet vor 19 Jahre, 7 Monate von The_Alien
Also mal kurz nebenbei, Tabellen und Felder würde ich in ` einpacken, Integerwerte dagegen nicht in '

Hast du mal geschaut ob $tselectionf2['besitzer'] deffiniert ist?

Wenn keine Fehlermeldung kommt liegt es meistens an fehlenden/falschen werten der WHERE klausel.

Wenn empfaenger und besitzer Strings sind ist das eh keine gute wahl da textvergleiche recht "langsam" sind. Ich würde da empfehlen mit Userids zu arbeiten, was auch schreibfehler vermeidet.
Wenn es schon userids sind lass am besten die ' weg, weil SQL diesen string sonst erst noch in ein integer konvertiert was auch wieder performance kostet. (ist nicht viel aber rechne das mal hoch)

Aber gib doch einfach mal ein select mit der WHERE klausel ein - dann siehst du schonmal ob überhaupt die Daten da sind die du ändern willst.

Falls es immer nur ein Eintrag ist würde ich auch noch LIMIT 1 dahinter setzen, damit nicht immer die komplette Tabelle durchgegangen wird.

Um es dem Speeed halber noch zu erhöhen dann noch ein Index auf die beiden Felder setzen - das bringt meist auch einiges.

mysql_query("UPDATE `fgate_staedte` SET `eisen`=`eisen`+".$eisen.", `holz`=`holz`+".$holz.", `nahrung`=`nahrung`+".$nahrung.", `stein`=`stein`+".$stein.", `gold`=`gold`+".$gold."  WHERE `id` = ".$fetchbw['empfaenger']." AND `besitzer`=".$tselectionf2['besitzer']." LIMIT 1; "); 

gepostet vor 19 Jahre, 7 Monate von The_Alien
Ach ja, da das eine WHILE schleife ist kannst du auch noch DELAYED verwenden damit die Tabelle nicht dauernd gesperrt ist.

Das DELAYED sorgt einfach dafür das das Query in eine warteschlange kommt und bei der nächsten möglichkeit in einem rutsch geschrieben wird.

Weil sonst für jede UPDATE anfrage die Tabelle kurz gespert wird und alle anderen Anfragen solange warten müßen. Mit DELAYED wird die Tabelle nur einmal gesperrt und dann mehreres auf einmal geschrieben

würde dann so geschrieben:
"UPDATE DELAYED `fgate_staedte` SET `eisen`=`eisen ........"

Aber setz einfach mal

$data=mysql_query("SELECT * FROM `fgate_staedte` WHERE `id` = ".$fetchbw['empfaenger']." AND `besitzer`=".$tselectionf2['besitzer']." LIMIT 1;")

if (mysql_num_rows($data)>0)
{
$row=mysql_fetch_array($data);
printr_($row);
}
else
{
echo "
Keine Daten zum Updaten gefunden!";
}


Dahinter - dan siehste schonmal was du upgedatet hast
gepostet vor 19 Jahre, 7 Monate von knalli
Original von The_Alien
Also mal kurz nebenbei, Tabellen und Felder würde ich in ` einpacken, Integerwerte dagegen nicht in '



Kommt drauf an:
Nehmen wir an, $var ist aus irgendeinem Grunde nicht belegt:
$sql = "UPDATE tabelle set col='set' where id=".$var.";";

$sql = "UPDATE tabelle set col='set' where id='".$var."';";


Im 1. Query wird ein fehlerhaftes Query generiert, im 2. ist es nur ein ungültiger Wert im WHERE, aber der Syntax des Queries ist korrekt.
gepostet vor 19 Jahre, 7 Monate von The_Alien
Naja, eigentlich sollte man so programieren das man weiß was man will.

Zumal wenn ein Variable nicht initiert ist kommt bei abfrage der Variable eh ein Fehler, was nebenbei auch auf einen anderen Fehler oder schlechte programierung zurück zu führen ist - und einen String muß man eh in ' setzen.

Und wenn $var nicht belegt ist wird das Query so oder so nicht ausgeführt - statdessen kommt ein PHP Fehler und danach ein SQL Fehler das die angegebene Resource keine gültige SQL abfrage ist (da diese ja nicht ausgeführt wurde)
gepostet vor 19 Jahre, 7 Monate von Balduran
hey danke für die hilfe ich werds gleich mal ausprobieren

du meinstes wenn empfaenger und sender strings sind dann lädt des länger, bringt des was wenn ich intval() machen würd bei denen ?


$besitzer2 = intval($tselectionf2['besitzer']);

$besitzer1 = intval($tselectionf['besitzer']);
$empfaenger = intval($fetchbw['empfaenger']);



mysql_query("UPDATE DELAYED fgate_staedte SET 'eisen'='eisen'+".$eisen.", 'holz'='holz'+".$holz.", 'nahrung'='nahrung'+".$nahrung.", 'stein'='stein'+".$stein.", 'gold'='gold'+".$gold." WHERE 'id' = ".$empfaenger." AND 'besitzer' = ".$besitzer2." LIMIT 1;");
$data=mysql_query("SELECT * FROM `fgate_staedte` WHERE `id` = ".$empfaenger." AND `besitzer`=".$besitzer2." LIMIT 1;");
if(mysql_num_rows($data)>0)
{
$row=mysql_fetch_array($data);
print_r($row);
}
else
{
echo "
Keine Daten zum Updaten gefunden!";
}


sooo hab bisschen was probiert...
delayed eingebaut, ' gesetzt, empfaenger, besitzer als intval gemacht
dein SELECT script eingebaut( der hat kein update angezeigt, selben werte wie vorher)

hat alles nix gebracht :-(
gepostet vor 19 Jahre, 7 Monate von BLUESCREEN
Original von The_Alien
Zumal wenn ein Variable nicht initiert ist kommt bei abfrage der Variable eh ein Fehler

Nur wenn E_NOTICE im Errorlevel gesetzt ist.

Und ich würde auch alle Werte in ' setzen.

Original von The_Alien

Falls es immer nur ein Eintrag ist würde ich auch noch LIMIT 1 dahinter setzen, damit nicht immer die komplette Tabelle durchgegangen wird.
Falls `id` ein Primärschlüssel ist braucht man das nicht.

Original von Balduran

du meinstes wenn empfaenger und sender strings sind dann lädt des länger, bringt des was wenn ich intval() machen würd bei denen?
Nein, du sollst in der Datenbank nicht immer die Benutzernamen speichern, sondern die Benutzer-IDs. Das heißt du solltest die Spalten auch umstellen auf einen Integer-Typ und wenn ein Spieler als Empfänger einen Benutzernamen angibt, dann wandelst du den erstmal in eine Benutzer-ID um und setzt die dann in den Query ein.
gepostet vor 19 Jahre, 7 Monate von Balduran
achso nu versteh ich des


nee meine tabellen arbeiten bereits mit Id's
der nickname is nur in der tabelle fgate_user gespeichert
in allen andren tabellen wird die id benutzt des spielers
gepostet vor 19 Jahre, 7 Monate von Balduran
kann des eigentlich sein das da was andres en problem is? also es ist ja echt alles richtig, variablen, query und alles

vielleicht hat die datenbank ne makke oda is an dem punkt überlastet ?!

es tut echt alles ausser dieses dumme ding mit den ressourcen eintragen :-(
gepostet vor 19 Jahre, 7 Monate von _Jan_
or die(mysql_error());


*hust*
gepostet vor 19 Jahre, 7 Monate von Balduran
hab ich reingehauen.. gibt aber kein mysql_error...
gepostet vor 19 Jahre, 7 Monate von The_Alien
Original von Balduran
hab ich reingehauen.. gibt aber kein mysql_error...


Grade daher tippe ich immer noch darauf das was mit der WHERE klausel nicht stimmt, sie ist zwar richtig so das es keinen Fehler gibt aber kein Datensatz zum ändern gefunden wird.
gepostet vor 19 Jahre, 7 Monate von knalli
Query ausgeben und selber ausführen.. in der Regel das Debug Nonplusunltra, wenn es um das Fehlersuchen geht (dafür ist das etwas.. nun ja.. vllt unprofessionell *g* aber es hilft - und das ist die hauptsache)
gepostet vor 19 Jahre, 7 Monate von BLUESCREEN
Lass dir doch gleich nach dem Ausführen des Queries im Script mal den Rückgabewert von mysql_affected_rows() ausgeben.

Mögliche Werte:
-1: Fehler beim Ausführen des Queries
0: Query war in Ordnung, aber es wurden keine Zeilen gefunden, die zu den WHERE-Bedingungen passen
>0: Query war in Ordnung und es wurden Zeilen geändert
gepostet vor 19 Jahre, 7 Monate von Balduran
gut..er gibt mir ne 0.. das heißt ich check nochma genaustens die WHERE abteilung ab


---



boah endlich tut der mist danke für eure hilfe

hier der komplett richtige QUERY:
mysql_query("UPDATE fgate_staedte SET eisen=".$eisen.", holz=".$holz.", nahrung=".$nahrung.", stein=".$stein.", gold=".$gold."  WHERE id = '".$empfaenger."'") or die(mysql_error()); 

gepostet vor 19 Jahre, 7 Monate von woodworker
naja och würde dir aber empfehlen da mit sprintf zu arbeiten macht dne query um einges besser lesbar

 

$query = 'UPDATE fgate_staedte SET eisen=%u, holz=%u, nahrung=%u, , stein=%u, gold=%u WHERE id = %u';

mysql_query( sprintf($query, $eisen, $holz, $nahrung, $stein, $gold, $empfaenger) ) or die(mysql_error());


bei diesem Query gehe ich davon aus das alle werte unsigend Integer sind

ist doch viel schöner und es hatl gleich den vorteil das man so sql injections verhindern kann

http://de.php.net/sprintf

Auf diese Diskussion antworten