CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
01.09.2010, 13:00:55
|
Anfänger
|
|
Registriert seit: Jul 2010
Alter: 37
Beiträge: 29
|
|
AW: UPDATE verfälscht SELECT?
Zitat:
Zitat von Domi
das würde ja richtig aussehen, die Frage ist nur, obs bei SELECTs die übere mehrere Tage hinweg laufen Probleme geben kann?
Was nutzt du für ne Engine? Hab hier InnoDB.
|
Ich kann mir ehrlich gesagt nicht vorstellen, dass das über mehrere Tage hinweg anders sein sollte als wenn das Skript nur ein paar Sekunden läuft.
Hierfür hab ich auch InnoDB verwendet.
Aber mal was anderes: Versuch doch einfach mal das komplette Result-Set des SELECTs in ein Array zu speichern und dann das Array zu durchlaufen statt der Ergebnis-Menge und in dieser Schleife die UPDATEs zu machen.
Wenn Du das Problem dann nicht mehr hast, liegt's ja sehr wahrscheinlich wirklich an der SELECT-Abfrage. Wenn das Problem allerdings immer noch besteht, wird's wohl am Code oder was auch immer liegen.
Gruß, Dennis
Ps: Hab's grad mal mit PDO getestet, da geht so ein UPDATE innerhalb einer SELECT-Schleife tatsächlich nicht. Allerdings macht er gar nichts und schmeißt sofort einen Fehler (sinngemäß: Programmiere anständig oder nutze zur Not USE_BUFFERED_QUERY). Bei PDO könnte man sonst auch fetchAll() verwenden um dieses Problem zu umgehen (was glaub ich nichts anderes ist als mein Vorschlag mit dem Array).
|
01.09.2010, 13:04:39
|
Anfänger
|
|
Registriert seit: Jul 2010
Alter: 37
Beiträge: 29
|
|
AW: UPDATE verfälscht SELECT?
Zitat:
Zitat von Domi
klinngt allerings auch plausibel..
|
Finde ich ehrlich gesagt nicht. Für mich hört es sich wie die Bestätigung an, dass das kein Problem darstellt.
Wenn MySQL eine temporäre Tabelle für den SELECT anlegt, die sich von der tatsächlichen Tabelle unterscheiden kann und der UPDATE sich auf die richtige und nicht die temporäre Tabelle bezieht, dürfte sich das Resultset des SELECTs in der temporären Tabelle nicht ändern.
Gruß, Dennis
|
01.09.2010, 13:32:07
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: UPDATE verfälscht SELECT?
Zitat:
Zitat von Der-Dennis
Folgende Tabelle:
Code:
id | wert
----------
1 | 5
----------
2 | 10
----------
3 | 15
----------
4 | 20
----------
und folgendes Test-Skript:
PHP-Code:
$sql = 'SELECT * FROM tabelle ORDER BY wert DESC';
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
echo 'ID ' . $row['id'] . ' vor Update: ' . $row['wert'] . '<br />';
$sql = 'UPDATE tabelle SET wert = wert - 10 WHERE id = ' . $row['id'];
$affected = mysql_query($sql);
echo $affected . ' Datensätze geändert' . '<br />';
echo 'ID ' . $row['id'] . ' nach Update: ' . $row['wert'] . '<br />';
}
liefert bei mir:
ID 4 vor Update: 20
1 Datensätze geändert
ID 4 nach Update: 10
ID 3 vor Update: 15
1 Datensätze geändert
ID 3 nach Update: 5
ID 2 vor Update: 10
1 Datensätze geändert
ID 2 nach Update: 0
ID 1 vor Update: 5
1 Datensätze geändert
ID 1 nach Update: -5
Gruß, Dennis
|
Also eigentlich irritiert mich dieses Ergebnis. Der UPDATE ändert sofort Inhalte des $row aus dem SELECT. Die Frage ist, was steht anschließend in der Tabelle (SELECT * FROM ..) und vermutlich ist AUTOCOMMIT aktiv. D.h. jeder UPDATE macht automatisch einen COMMIT und schreibt die Änderungen in die Tabelle ...hmm
Ich arbeite zumeist mit PDO.
Grüße
Thomas
|
01.09.2010, 13:40:52
|
Anfänger
|
|
Registriert seit: Jul 2010
Alter: 37
Beiträge: 29
|
|
AW: UPDATE verfälscht SELECT?
Hey Thomas,
Zitat:
Zitat von thomas_w
und vermutlich ist AUTOCOMMIT aktiv. D.h. jeder UPDATE macht automatisch einen COMMIT und schreibt die Änderungen in die Tabelle ...hmm
Ich arbeite zumeist mit PDO.
|
Autocommit ist doch standardmäßig immer aktiviert, oder? Dann wird's auch bei mir der Fall sein.
Ich nutze auch nur noch PDO und da besteht, wie vorher beschrieben, auf jeden Fall das Problem.
Gruß, Dennis
|
01.09.2010, 13:52:03
|
Anfänger
|
|
Registriert seit: Jul 2010
Alter: 37
Beiträge: 29
|
|
AW: UPDATE verfälscht SELECT?
Zitat:
Zitat von thomas_w
Also eigentlich irritiert mich dieses Ergebnis.
|
Mich auch... :-)
Jetzt hab ich genau das gemacht, worüber ich vorher beschwert habe. Sorry! Ich hab den falschen Code gepostet (oder besser: einen Teil meines ersten und einen Teil meines zweiten Tests).
Also hier der richtige Code (zum selber ausprobieren ;-) ):
PHP-Code:
$sql = 'SELECT * FROM tabelle ORDER BY wert DESC';
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
echo 'ID ' . $row['id'] . ' vor Update: ' . $row['wert'] . '<br />';
$sql = 'UPDATE tabelle SET wert = wert - 10 WHERE id = ' . $row['id'];
$affected = mysql_query($sql);
echo $affected . ' Datensätze geändert' . '<br />';
$sql = 'SELECT * FROM tabelle WHERE id = ' . $row['id'];
$result2 = mysql_query($sql);
$row2 = mysql_fetch_assoc($result2);
echo 'ID ' . $row2['id'] . ' nach Update: ' . $row2['wert'] . '<br />';
}
Wird hoffentlich nicht mehr vorkommen.
Gruß, Dennis
|
01.09.2010, 14:25:05
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: UPDATE verfälscht SELECT?
Hallo Dennis,
jetzt bin ich aber beruhigt, ich dachte schon, ich gebe jetzt meinen "Schein" ab. Aber okay, nun ist wieder alles im grünen Bereich.
OT:
Ich verwende ganz gerne PDO, aber leider wird PDO in letzter Zeit nicht mehr(?) weiter entwickelt. Die speziellen PECL-Treiber (z.B. für IBM DB2 oder ORACLE) sind inzwischen deutlich besser und aktueller als die PDO Varianten.
Grüße
Thomas
|
01.09.2010, 14:35:30
|
Anfänger
|
|
Registriert seit: Jul 2010
Alter: 37
Beiträge: 29
|
|
AW: UPDATE verfälscht SELECT?
Zitat:
Zitat von thomas_w
Ich verwende ganz gerne PDO, aber leider wird PDO in letzter Zeit nicht mehr(?) weiter entwickelt. Die speziellen PECL-Treiber (z.B. für IBM DB2 oder ORACLE) sind inzwischen deutlich besser und aktueller als die PDO Varianten.
|
Ich arbeite zur Zeit nur mit MySQL, daher weiß ich nicht, wie es um PDO mit den anderen DBMS bestellt ist.
Ich hab aber irgendwo mal gelesen (weiß aber leider nicht mehr wo), dass PDO vorerst nicht weiterentwickelt wird und nur Bugfixes vorgenommen werden, bis PHP 6 einen halbwegs soliden Zustand erreicht hat.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 07:19:23 Uhr.
|