Hallo,
ich habe wieder einmal ein Problem, welches ich alleine nicht lösen kann:
Und zwar werden bei meinen Scripts manche MySQL Befehle einfach ignoriert, bzw einfach nicht ausgeführt.
Das ganze tritt sporadisch, und immer an verschiedenen Stellen im Script auf.
Es wird auch kein MySQL_error zurückgegeben.
Es ist so, als ob das Query lehr währe.
Das ganze stresst mich ziemlich, da jetzt immer öffter User in irgendwelchen Aktionen festhängen, oder ihr geld nicht bekommen.
Hat irgendemand von euch ähnliche Erfahrungen gemacht, oder kann mir irgendwie weiterhelfen?
PS: bitte nicht wieder so vom Thema abkommen wie in meinen letzten beiten Threats :wink:
MySQL Fehler beim Registrieren
gepostet vor 19 Jahre, 9 Monate von MannaZ
gepostet vor 19 Jahre, 9 Monate von Gambler
Hast du deine Werte auch immer schön in Anführungszeichen? Zeig dochmal einen kleinen Ausschnitt dass wir sehn wie du dein MySQL Zeugs so machst.
gepostet vor 19 Jahre, 9 Monate von Störti
Also vom Prinzip her klapp es, aber nur manchmal werden die Queries nicht ausgeführt?
Fragst du ab, ob das Ergebnis der Query auch true ist? Wenn MySQL die Query nämlich gar nicht ausführt, kann es auch gar keinen Rückgabewert geben (was einemfalse gleich kommt). Wenn du das machst und es kommt trotzdem keine Fehlermeldung, dann würde ich das Problem beim PHP suchen...
Benutzt zu eine selbst geschriebene Funktion für Queries (also dass du im Script selbst das mysql_query gar nicht aufrufst sondern in eine Funktin ausgelagert hast)?
Fragst du ab, ob das Ergebnis der Query auch true ist? Wenn MySQL die Query nämlich gar nicht ausführt, kann es auch gar keinen Rückgabewert geben (was einemfalse gleich kommt). Wenn du das machst und es kommt trotzdem keine Fehlermeldung, dann würde ich das Problem beim PHP suchen...
Benutzt zu eine selbst geschriebene Funktion für Queries (also dass du im Script selbst das mysql_query gar nicht aufrufst sondern in eine Funktin ausgelagert hast)?
gepostet vor 19 Jahre, 9 Monate von MannaZ
nein, ich mach das ganz normal mit den Funktionen
$sql = "BLABLA";
mysql_query($sql)or die(mysql_error());
oder
$result = mysql_query($sql) or die(mysql_error());
$fetch = mysql_fetch_array($result);
aber meistens sind es die einfachen inserts, die nicht hinhauen.
Habs auch schon mit einer Klasse probiert - das selbe.
Was ich noch dazu sagen muss, ist das der Server meistens ziemlich ausgelastet ist - hats vielleicht damit etwas zu tun?
$sql = "BLABLA";
mysql_query($sql)or die(mysql_error());
oder
$result = mysql_query($sql) or die(mysql_error());
$fetch = mysql_fetch_array($result);
aber meistens sind es die einfachen inserts, die nicht hinhauen.
Habs auch schon mit einer Klasse probiert - das selbe.
Was ich noch dazu sagen muss, ist das der Server meistens ziemlich ausgelastet ist - hats vielleicht damit etwas zu tun?
gepostet vor 19 Jahre, 9 Monate von Gambler
Ich wollt eigentlich eher mal die Syntaktik deiner SQL Befehle sehn. Da kann man mehr Fehler bei machen.
gepostet vor 19 Jahre, 9 Monate von _Jan_
DB klasse tuts immer gut
gepostet vor 19 Jahre, 9 Monate von MannaZ
Original von Gambler
Ich wollt eigentlich eher mal die Syntaktik deiner SQL Befehle sehn. Da kann man mehr Fehler bei machen.
Es liegt sicher nicht an den Befehlen, da es ja sonnst nie funktionieren - bzw einen MySQL_error liefern würde.
Aber bitte - hier ein allgemeiner Syntax:
"UPDATE `tabelle` SET `asdf` = '0', `s".$variable."` = '$variable', `points`='".$newpoints."', `d`='0' WHERE `uid` = '$variable' LIMIT 1 ;"
# oder auch
"INSERT INTO `tabelle_nr_".$tnum."` ( `qwer` , `asdf` , `wert_max` , `time` , `typ` , `er` , `asdfer` ) VALUES ('$sdfsdf', '0', '0', '".$time."', '$efsefrr', '0', '0' );"
gepostet vor 19 Jahre, 9 Monate von spacevillage
Also ich habe mir die ganzen Queries mal angeschaut, kann mir aber nicht vorstellen, dass es daran liegt.
Du könntest dies aber auch mal mit phpMyAdmin überprüfen..
Man kann davon ausgehen, dass es zwischenzeitlich nicht irgendwelche Daten raushaut oder überschreibt, z.B. die User-ID oder die Mysql-Verbindung
Du könntest dies aber auch mal mit phpMyAdmin überprüfen..
Man kann davon ausgehen, dass es zwischenzeitlich nicht irgendwelche Daten raushaut oder überschreibt, z.B. die User-ID oder die Mysql-Verbindung
gepostet vor 19 Jahre, 9 Monate von Hagbard
Och leute hört doch auf mit $sql = "...VALUES( '','".$blabla"',...)", ist unübersichtlich und sieht bescheuert aus !
macht doch lieber
$sql = "INSERT INTO planet VALUES('',%d,'%s' )";
$sql = sprintf( $sql, $iUserID, $sPlanetName );
:roll:
macht doch lieber
$sql = "INSERT INTO planet VALUES('',%d,'%s' )";
$sql = sprintf( $sql, $iUserID, $sPlanetName );
:roll:
gepostet vor 19 Jahre, 9 Monate von Crafty-Catcher
MannaZ hast du zufälligerweise aus irgend einem Grund doppelte User IDs?
@Hagbard Welche Version ist performanter?
@Hagbard Welche Version ist performanter?
gepostet vor 19 Jahre, 9 Monate von Global
schon mal an die max_execution_time gedacht?
wenn das problem bei größeren usergruppen auftritt und mit der anzahl der user/flotten/updates/whatever relativ proportional ist dann setz die mal hoch. allerdings ist es nicht gut wenn deine updates so lang brauchen, denn wenn dann ein user zwischen auslesen und updaten einen datensatz verändert kann das zur folge haben, dass nix geupdated wird. versuch in dem fall möglichst viele dinge aus den regelmäßigen updates auszugliedern. kurzfristig kannst du eine sperre einbauen für die zeit der updates aber das ist nervig. ideal ist natürlich ein java oder c++ programm, das im hintergrund läuft und ständig updated wenn kapazitäten frei sind. ist aber denkbar kompliziert zu programmieren
wenn das problem bei größeren usergruppen auftritt und mit der anzahl der user/flotten/updates/whatever relativ proportional ist dann setz die mal hoch. allerdings ist es nicht gut wenn deine updates so lang brauchen, denn wenn dann ein user zwischen auslesen und updaten einen datensatz verändert kann das zur folge haben, dass nix geupdated wird. versuch in dem fall möglichst viele dinge aus den regelmäßigen updates auszugliedern. kurzfristig kannst du eine sperre einbauen für die zeit der updates aber das ist nervig. ideal ist natürlich ein java oder c++ programm, das im hintergrund läuft und ständig updated wenn kapazitäten frei sind. ist aber denkbar kompliziert zu programmieren
gepostet vor 19 Jahre, 9 Monate von Hagbard
Original von Crafty-Catcher
MannaZ hast du zufälligerweise aus irgend einem Grund doppelte User IDs?
@Hagbard Welche Version ist performanter?
Zwischen "." (concatenation) und sprintf gibt es nur einen geringen Performanceeinbruch ( kannste mal googlen, da hat jemanden das gemessen, durschnittliche differenz war c.a 15% ).
Optimiere lieber dein code woanders. Anweisungen wie sprintf spielen performance gesehen da überhaupt keine Rolle, die meisten Resourcen verschlingen MySql queries ( kannste ja mit der extension php_apd profilieren und tracen)
gepostet vor 19 Jahre, 9 Monate von MannaZ
Original von Crafty-Catcher
MannaZ hast du zufälligerweise aus irgend einem Grund doppelte User IDs?
@Hagbard Welche Version ist performanter?
Nein, sonnst würde der fehler ja nur bei speziellen usern auftreten, und auserdem sind die UID ein Autincremet Primary Key.
@Global:
Es liegt nicht an der Execution Time, da ansonnsten der nachfolgende Code ja auch nicht ausgeführt werden würde (was er aber tut).
Und ich update nichts im hintergrund, sondern immer live, da mein game in echtzeit abläuft und nicht in tiks.
gepostet vor 19 Jahre, 9 Monate von MannaZ
Original von Crafty-Catcher
MannaZ hast du zufälligerweise aus irgend einem Grund doppelte User IDs?
@Hagbard Welche Version ist performanter?
Nein, sonnst würde der fehler ja nur bei speziellen usern auftreten, und auserdem sind die UID ein Autincremet Primary Key.
@Global:
Es liegt nicht an der Execution Time, da ansonnsten der nachfolgende Code ja auch nicht ausgeführt werden würde (was er aber tut).
Und ich update nichts im hintergrund, sondern immer live, da mein game in echtzeit abläuft und nicht in tiks.
gepostet vor 19 Jahre, 9 Monate von Feagor
@Hagbard:
Aber warum soll man denn nicht anden Stellen optimieren, an denen man optimieren kann? Wenn man das mit dem Concat (also den Punkten) ordentlich schreibt und einrückt sieht's imo sogar noch übersichtlicher aus als ein sprintf(), z.B. weil man immer die passende Variable an passender Stelle hat und nicht alle nacheinander in einer riesigen Schlange. :wink:
@MannaZ:
Benutzt du InnoDB? Wenn ja, dann erstmal dain der Gegend, wo es die Fehler gibt, die Abfragen in Transaktionen betten, so dass entweder alle ausgeführt werden, doer keine. Wenn du einen anderen Tabellentyp benutzt (MyISAM etc.), kannst du sowas mit LOCK TABLES emulieren.
Also das war zumindest bei meinem Spiel mal n Problem, dass ein Update zu lange gedauert hat und deswegen übersprungen wurde, während ein anderes durchgelaufen ist...
Aber warum soll man denn nicht anden Stellen optimieren, an denen man optimieren kann? Wenn man das mit dem Concat (also den Punkten) ordentlich schreibt und einrückt sieht's imo sogar noch übersichtlicher aus als ein sprintf(), z.B. weil man immer die passende Variable an passender Stelle hat und nicht alle nacheinander in einer riesigen Schlange. :wink:
@MannaZ:
Benutzt du InnoDB? Wenn ja, dann erstmal dain der Gegend, wo es die Fehler gibt, die Abfragen in Transaktionen betten, so dass entweder alle ausgeführt werden, doer keine. Wenn du einen anderen Tabellentyp benutzt (MyISAM etc.), kannst du sowas mit LOCK TABLES emulieren.
Also das war zumindest bei meinem Spiel mal n Problem, dass ein Update zu lange gedauert hat und deswegen übersprungen wurde, während ein anderes durchgelaufen ist...
gepostet vor 19 Jahre, 8 Monate von MannaZ
Oh, ich seh grad das mein letzter Beitrag doppelt angekommen ist - wahr wohl ein wenig ungeduldig mit meinem Inet.
@Feagor:
Ich benutze MyISAM und KEIN "lock tables" - kannst du mir eine Seite empfehlen wo man sieht wie man damit umgeht oder es mir erklähren?
@Feagor:
Ich benutze MyISAM und KEIN "lock tables" - kannst du mir eine Seite empfehlen wo man sieht wie man damit umgeht oder es mir erklähren?
gepostet vor 19 Jahre, 8 Monate von felix
Was sagt denn dein error-Log von Mysql? (was immer du machst, nimm MySQL!!!)
gepostet vor 19 Jahre, 8 Monate von Feagor
@MannaZ:
dev.mysql.com/doc/mysql/en/lock-tables.html
@felix:
Wieso immer MySQL? Gibt auch andere nette Datenbanken...
dev.mysql.com/doc/mysql/en/lock-tables.html
@felix:
Wieso immer MySQL? Gibt auch andere nette Datenbanken...
gepostet vor 19 Jahre, 8 Monate von MannaZ
Dieses Sätzchen hat mir die Augen geöffnet:
Wenn Sie einen Tabellen-Handler in MySQL benutzen, der keine Transaktionen unterstützt, müssen Sie LOCK TABLES benutzen, wenn Sie sicherstellen wollen, dass kann anderer Thread zwischen einem SELECT und einem UPDATE dazwischen kommen kann. Das unten stehende Beispiel erfordert LOCK TABLES, um sicher ausgeführt zu werden:
Werde das heute ausprobieren und hoffen, dass es daran gelegen hat.
Danke für eure Hilfe - falls ihr weitere Vorschläge habt immer her damit.
http://dev.mysql.com/doc/mysql/de/lock-tables.html
Wenn Sie einen Tabellen-Handler in MySQL benutzen, der keine Transaktionen unterstützt, müssen Sie LOCK TABLES benutzen, wenn Sie sicherstellen wollen, dass kann anderer Thread zwischen einem SELECT und einem UPDATE dazwischen kommen kann. Das unten stehende Beispiel erfordert LOCK TABLES, um sicher ausgeführt zu werden:
Werde das heute ausprobieren und hoffen, dass es daran gelegen hat.
Danke für eure Hilfe - falls ihr weitere Vorschläge habt immer her damit.