Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
datenverlust durch mysqli? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
datenverlust durch mysqli?


 
joextra
07-07-2010, 13:03 
 
hallo,

ich habe vor einiger zeit in meinen scripts von mysql auf mysqli funktionssatz gewechselt. läuft auch alles prima. allerdings sind jetzt doch ab und zu datenverluste aufgetreten bei der tabelle wo ein insert durchgeführt wurde. dies passiert zwar selten, aber dann doch sehr ärgerlich. jetzt frage ich mich ob das an mysqli liegt. hat jemand ähnliche probleme festgestellt?

noch eine sache. ich mache vor insert & update ein "LOCK TABLES `$table` WRITE" und danach ein "UNLOCK TABLES;". aber daran könnte es ja wohl nicht liegen, oder?

 
AmicaNoctis
07-07-2010, 13:20 
 
Hallo,

garantieren kann ich es dir nicht, aber ich bin sicher, das hat nichts miteinander zu tun. Protokolliere jedes Fehlverhalten mit allem drum und dran, dann sollte sich irgendwann eine reproduzierbare Ursache herauskristallisieren.

*move* ins SQL-Forum.

Gruß,

Amica

 
onemorenerd
07-07-2010, 13:47 
 
Wieso blockierst du die Tabelle überhaupt? Was machst du da genau in den INSERTs und UPDATEs?

MySQL :: MySQL 5.0 Reference Manual :: 12.3.5.1 Interaction of Table Locking and Transactions (http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)

 
joextra
07-07-2010, 14:16 
 
@Amica
ich protokoliere welche aktionen der user macht. und es passiert eben hauptsächlich beim insert.

@onemorenerd
ich denke das es sicherer ist. ist es nicht so das dann die inserts nach ein ander ausgeführt werden? oder habe ich das falsch verstanden.

ein typischer insert bei mir sieht z.b. so aus:
SQL = LOCK TABLES `tabelle` WRITE
SQL = insert into tabelle (sortID, date, shortText1, shortText2, longText1, activity) values ('8', '1278453600', 'test', 'test', 'test', '1')
SQL = UNLOCK TABLES;
also ganz normal

 
AmicaNoctis
07-07-2010, 15:01 
 
ein typischer insert bei mir sieht z.b. so aus

Dann ist das Locking komplett überflüssig, da dieses eine Insert in sich selbst atomar ist und auch keine anderen Tabellen beeinflusst, es sei denn, du hast noch irgendwelche Trigger gesetzt.

 
joextra
07-07-2010, 16:19 
 
ne, trigger benutze ich nicht. dann kann ich das "locken" also weg machen. trotzdem frage ich mich wie es zu diesem datenverlust kommen kann.

 
ThemBones
09-07-2010, 12:07 
 
Hi,
was genau meinst du mit Datenverlust? Ganze Sätze? Oder korrumpierte Daten in einzelnen Spalten in einzelnen Sätzen? etc.

 
joextra
10-07-2010, 18:20 
 
die tabelle, in der zb. ein insert durchgeführt wurde, war auf ein mal leer (nur der letzte datensatz der eingetragen/geendert wurde war noch drin). das problem habe ich bis jetzt bei 3 verschiedenen projekten bei unterschiedlichen hostern.
auf meinem localhost (win7, entwicklungsrechner) hatte ich das problem noch nicht

 
combie
10-07-2010, 18:37 
 
die tabelle, in der zb. ein insert durchgeführt wurde, war auf ein mal leer
Werden z.B. zum löschen Links verwendet?
Und hat eine SUMA evtl. die Seite gefunden?
Und dann auf allen Links rumgetrampelt?
:)

 
joextra
10-07-2010, 19:44 
 
1. um ins backend zu gelangen, muss man sich erst einloggen. ohne einloggen kann man keine aktion ausführen. wenn man ohne eingeloggt zu sein, einen link ausführt, landet man direkt auf die login seite.
2. das backend ist für suchmaschinen(bots) gesperrt.
3. es wurde ein insert bzw. update durchgeführt, aber KEIN delete.
4. problem ist passiert wenn ein "mensch" etwas geinsert oder geupdatet hatte. da ich die aktionen mittracke, kann ich auch ausschließen das jemand absichtlich die ganzen daten gelöscht hat.
also kann ich das ausschließen ;)

 
ThemBones
10-07-2010, 19:56 
 
hm, also ich kann mir beim besten willen nicht vorstellen dass das irgendwas mit mysqli zu tun hat. kannst bugs ausschliessen? kann man ja eigentlich nie. hatte letzthin was aehnliches u nach stundenlanger suche stellte sich raus, ich hab das where vergessen. peinlich peinlich. handelts sich um sehr grosse datenmengen? welche storage engine? immer die gleiche mysql version bei den versch hostern?

 
joextra
11-07-2010, 12:04 
 
also, ich verwende eine kleine lib die ich geschrieben habe. davor lief die mit den mysql befehlssatz (ohne probleme). dann habe ich diese auf mysqli umgestellt. allerdings habe ich ein paar sachen eingebaut.
1. ich mache gleich nach der connection ein $this->query("SET NAMES 'utf8'");
2. die daten werden "normalisiert" mit: $mysqlString = "'" .((strcmp(PHP_VERSION, '4.3.0') < 0) ? $this->connection->escape_string($mysqlString) : $this->real_escape_string($mysqlString)). "'";
3. die tables werden gelockt beim schreiben und updaten (das habe ich aber vor kurzem wieder entfernt, da es für meine zwecke wohl unnötig ist)

 
h3ll
11-07-2010, 12:10 
 
mysqli löscht keine Daten von alleine.

Ich würde mal alle Queries mitloggen, die ausgeführt werden. Wenn hier nichts ersichtlich ist würde ich noch einen Schritt weiter gehen und den Query-Log (http://dev.mysql.com/doc/refman/5.1/en/query-log.html) von MySQL sezieren.

Was natürlich auch sein könnte ist, dass bestimmte Schreibvorgänge gar nicht erfolgreich sind. Aber dies wirst du doch hoffentlich abfangen und mitloggen.

Und zu allerletzt könnte es auch sein, dass du eine Transaktion startest, diese aber nicht commitest.

 
AmicaNoctis
11-07-2010, 12:11 
 
Fragst du auch nach jedem Statement eventuell aufgetretene Fehler ab?

 
joextra
11-07-2010, 16:23 
 
ich sollte dann bei gelegenheit die klasse erweitern und noch mehr mitloggen

welche storage engine?
MYISAM

 
joextra
12-07-2010, 20:06 
 
kann es eigentlicht sein, das auch irgend welche browser plug-ins dieses problem hervorrufen? ich kann mich früher erinnern, das die google toolbar öfters probleme gemacht hat.

wie ich grad im log gesehen habe, hat der user FunWebProducts & ZangoToolbar installiert (wohl ohne es zu wissen).

 
h3ll
12-07-2010, 20:39 
 
Werden irgendwo Löschoperationen per Link oder GET-Parameter gemacht? Wenn ja, dann solltest du das ändern. Löschen nur per POST erlauben.

 
wahsaga
12-07-2010, 20:40 
 
@h3ll: Da war combie schneller... (http://www.php-resource.de/forum/sql-datenbanken/99842-datenverlust-durch-mysqli.html#post642735)

 
h3ll
12-07-2010, 20:42 
 
@h3ll: Da war combie schneller... (http://www.php-resource.de/forum/sql-datenbanken/99842-datenverlust-durch-mysqli.html#post642735)

Er hat aber keine zufriedenstellende Antwort bekommen, deswegen hab ichs nochmal versucht. Vielleicht klappts ja diesmal :)

 
joextra
12-07-2010, 20:51 
 
Werden irgendwo Löschoperationen per Link oder GET-Parameter gemacht?
nur post, kein get. aber in meinem log wurde nur ein update durchgeführt. ich logge immer inserts, updates, deletes, alter & truncate.

 
h3ll
12-07-2010, 20:53 
 
Die letzte Möglichkeit, dir mir noch einfallen würde, wäre der Query-Log von MySQL

 
joextra
12-07-2010, 21:02 
 
dafür braucht man doch aber shell zugang, korrekt? und bei normalen providern kannste das vergessen.

 
joextra
12-07-2010, 23:20 
 
fehler gefunden. bei einen bereich habe ich meine delete methode mit einen parameter zu viel aufgerufen. ich habe 4 parameter übergeben, obwohl da nur 3 möglich sind. komisch das keine fehlermeldung ausgegeben wurde. :confused:

 
combie
12-07-2010, 23:40 
 
obwohl da nur 3 möglich sind. komisch das keine fehlermeldung ausgegeben wurde.Eine PHP Eigenheit!
Siehe: func_get_args()

PS:
Überflüssige Parameter richten keinen Schaden an.

 
joextra
13-07-2010, 11:00 
 
also ich kann mich erinnern, das ich in früheren version (4?) eine fehlermeldung bekommen habe, wenn ich mehr parameter angegeben habe als erlaubt. ist m.m.n. auch besser. sonst wäre ich nie auf die idee gekommen, das das der fehler ist.
kann man das nicht irgendwie einschalten?

 
eagle275
13-07-2010, 17:04 
 
error_reporting(E_ALL);
ini_set('display_errors', 1);


sollte das erledigen ...

 
h3ll
13-07-2010, 17:21 
 
Nö.

php > error_reporting(-1);
php > function foo($bar) {}
php > foo(1, 2, 3);
php > foo();

Warning: Missing argument 1 for foo(), called in php shell code on line 1 and defined in php shell code on line 1

 
joextra
13-07-2010, 19:10 
 
error_reporting(-1);
ist nicht gut, das zeigt nicht nur fehler an. notices brauche ich nicht. zudem übergibst du mehr argumente "foo(1, 2, 3);" aber da meckert der nicht?

 
AmicaNoctis
13-07-2010, 19:32 
 
notices brauche ich nicht.

Warum nicht? Wenn die abgeschaltet sind, ist das fast schon ein Garant für schlampige Programmierung.

Zum Thema „zu viele Parameter“: PHP: Funktionsparameter - Manual (http://de2.php.net/manual/de/functions.arguments.php#functions.variable-arg-list)

 
wahsaga
13-07-2010, 20:32 
 
error_reporting(-1);
ist nicht gut, das zeigt nicht nur fehler an. notices brauche ich nicht.
Die Philosophie ist analog zu „wenn im Auto was klappert, mach' ich halt einfach das Radio lauter ...“


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:23 Uhr.