Problem beim Löschen und Wiedereinfügen
Problem beim Löschen und Wiedereinfügen
am 13.01.2005 21:00:36 von Thomas Poppner
Hallo,
ich drehe seit ner Stunde am Rad wegen einem sehr merkwürdigen Problem
mit MySql. Mein Provider hat die Version 4.1.8.
Die beiden folgenden Befehle werden direkt hintereinander ausgeführt. Es
werden hier Checkboxen verarbeitet. Der erste Befehl löscht alle
Checkbox-Eingaben, die auf der Seite zu sehen sind (daher "in", auch
wenn es in diesem Fall nur eine ist).
Danach werden die gecheckten Sätze neu geschrieben.
SQL-DEBUG: 1
delete from phamily_freunde where (pyfr_SHB_ID_freund in ( 2 ) )
SQL-DEBUG: 2
insert into phamily_freunde set pyfr_SHB_ID_benutzer = 671,
pyfr_SHB_ID_freund = 2
Merkwürdigerweise scheint der delete- den insert-Befehl irgendwie zu
stören, denn in der Datenbank steht danach (ich hab alles andere
rausgelöscht):
pyfr_SHB_ID_benutzer pyfr_SHB_ID_freund
0 2
Setze ich zwischen beide Befehle ein sleep(1), läuft es richtig und es
kommt:
pyfr_SHB_ID_benutzer pyfr_SHB_ID_freund
671 2
Hat dazu irgendjemand eine Idee oder was zu lesen? Ich bin bisher davon
ausgegangen, dass die Datenbankbefehle vollständig verarbeitet werden,
bevor der nächste kommt. Liege ich da falsch?
Ich bin für Hinweise sehr dankbar.
Viele Grüße
Thomas
Re: Problem beim Löschen und Wiedereinfügen
am 14.01.2005 03:45:56 von Heinz Hombergs
Thomas Poppner wrote:
> SQL-DEBUG: 2
> insert into phamily_freunde set pyfr_SHB_ID_benutzer =3D 671,=20
> pyfr_SHB_ID_freund =3D 2
Das ist aber kein gültiger Insert Syntax. Das ist eine Mischung aus=20
Update und Insert.
Korrekt lautet er so:
INSERT INTO phamily_freunde (pyfr_SHB_ID_benutzer, pyfr_SHB_ID_freund)=20
VALUES (6701,2)
Oder die Kurschreibweise:
INSERT INTO phamily_freunde VALUES (6701,2)
Wobei man bei der Kurzschreibweise alle vorhanden Tabellenfelder=20
aufführen muss.
Evtl. ist das auch schon die Erklärung für dein Problem.
--=20
Aus den Trümmern unserer Verzweiflung bauen wir unseren Charakter.=20
(Ralph Waldo Emerson, 1803-1882)
Re: Problem beim Löschen und Wiedereinfügen
am 14.01.2005 04:24:42 von Johannes Vogel
Hi Heinz, hi Thomas
Heinz Hombergs wrote:
> Thomas Poppner wrote:
>> SQL-DEBUG: 2
>> insert into phamily_freunde set pyfr_SHB_ID_benutzer = 671,
>> pyfr_SHB_ID_freund = 2
> Das ist aber kein gültiger Insert Syntax. Das ist eine Mischung aus
> Update und Insert.
Humbug. Das vorliegende Insert-Statement ist korrekt.
Weshalb hier ein Problem vorliegt, kann ich auch nicht sagen. Ich
empfehle aber ein Replace-Statement stattdessen zu verwenden. Das
bedingt, dass die Identifikationsschlüssel sauber bezeichnet sind.
HTH, Johannes
Re: Problem beim Löschen und Wiedereinfügen
am 14.01.2005 09:51:44 von Hartmut Holzgraefe
Johannes Vogel wrote:
>>> insert into phamily_freunde set pyfr_SHB_ID_benutzer =3D 671,=20
>>> pyfr_SHB_ID_freund =3D 2
>>
>> Das ist aber kein gültiger Insert Syntax. Das ist eine Mischung aus =
>> Update und Insert.
>=20
>=20
> Humbug. Das vorliegende Insert-Statement ist korrekt.
Die UPDATE-artige INSERT-Syntax mit SET ist, so schön sie auch sein mag=
,
eine MySQL-spezifische Erweiterung und nicht ANSI SQL.
Die Syntax hat gegenüber
INSERT INTO tabelle (fieldlist) VALUES (valuelist)
den Vorteil das auch bei Zuweisungen an viele Spalten die Zuordnung
Werten zu Spalten immer sofort klar ist während man bei der ANSI
Syntax nur durch Abzählen in fieldlist und valuelist herausbekommt
welcher Wert zu welcher Spalte gehört. Noch schlimmer wird es wenn
das INSERT Statement ganz ohne fieldlist daher kommt ...
Nachteil der MySQL-Syntax ist aber eben das sie MySQL-spezifisch ist
und von anderen SQL Dialekten nicht unterstützt wird.
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
Are you MySQL certified? www.mysql.com/certification
Re: Problem beim Löschen und Wiedereinfügen
am 14.01.2005 13:31:19 von Thomas Poppner
Hartmut Holzgraefe wrote:
> Nachteil der MySQL-Syntax ist aber eben das sie MySQL-spezifisch ist
> und von anderen SQL Dialekten nicht unterstützt wird.
>
Vielen Dank für den Hinweis.
Ich hatte das nach einer Diskussion nebenan in dclpm mal so übernommen,
wo alle einhellig der Meinung waren, diese "Update"-Schreibweise wäre
besser nachvollziehbar (sehe ich eigentlich auch so).
Ich werde es mal auf die andere Schreibweise umstellen und schauen, ob
es was bringt. Melde mich dann wieder.
Das Problem ist derartig merkwürdig, dass ich völlig ratlos bin. Ich
habe gestern nacht noch 2 Stunden weiterprobiert. Es ist 100%ig sicher,
dass nichts anderes ausgeführt wird. Später hab ich festgestellt, dass
auch das sleep() keine Lösung bringt. Wenn man es öfter probiert, kommt
ab und zu auch mal ein korrektes Ergebnis, aber meistens das falsche.
Gut. Soviel dazu. Ich bekomme gerade Besuch.
Viele Grüße
Thomas
Re: Problem beim Löschen und Wiedereinfügen
am 14.01.2005 16:42:08 von Thomas Poppner
Hallo!
Ich fürchte, ich werde nach diesem Posting hier endgültig nicht mehr
ernstgenommen werden. Ich konnte das Problem beheben, indem ich das
Formular mit "post" und nicht mit "get" abschicke. Verstehen tue ich das
allerdings nicht und schreibe das auch nur, falls jemand von euch auch
mal auf so ein Problem stoßen sollte.
Die im Urspungsposting beschriebenen SQL-Befehle enthalten ja bereits
die Formulardaten, die auch bereits mit intval() behandelt wurden. Die
Ausdrucke wurden gemacht, direkt bevor sie mit mysql_query() an die DB
geschickt wurden. Das heißt die per "get" übertragenen Daten lagen vor,
waren lesbar und korrekt; darum dürfte eigentlich der Umstieg auf "post"
keine Veränderung bringen.
Eine Überprüfung während der Verarbeitung hatte dann ergeben, dass die
Daten auch richtig in die Datenbank geschrieben wurden. Nachdem ich
diese Prüfung schrittweise bis in die letzte Programmzeile verschoben
hatte, konnte ich feststellen, dass bei Verarbeitung der letzten
Programmzeile meiner PHP-Seite noch alles korrekt in der Datenbank
stand. Das bedeutet, die Daten standen so in der Datenbank wie ich es
auch in den Sql-Befehlen geschrieben hatte.
Rief ich dann die Tabelle mit PhpMyAdmin auf, waren die darin
enthaltenen Daten falsch. Das heißt irgendwie müssen die Daten nach der
letzten PHP-Zeile verändert worden sein. Das verstehe wer will.
Gut. Jedenfalls mit "post" sind meine Probleme nun weg. Die Sql-Befehle
sind die gleichen, es gibt keine Redirects und ich schließe dieses Thema
nun ab und verbuche es unter "Dinge, die ich mal verstehen will, wenn
ich groß bin" ;-)
Vielen Dank jedenfalls an alle, die mitnachgedacht haben.
Viele Grüße
Thomas
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 01:24:51 von Heinz Hombergs
Johannes Vogel wrote:
> Humbug. Das vorliegende Insert-Statement ist korrekt.
Wie Harmut schrieb spreche ich fast nur ANSI SQL. Liegt halt daran, daß=
=20
ich auf diversen SQL Servern arbeite. Da nimmt man das KGV. ;)
--=20
Einander kennenlernen heißt, lernen wie fremd man einander ist.=20
(Christian Morgenstern)
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 11:16:36 von werbung
Thomas Poppner schrieb:
> Hallo!
>=20
> Die im Urspungsposting beschriebenen SQL-Befehle enthalten ja bereits=20
> die Formulardaten, die auch bereits mit intval() behandelt wurden. Die =
> Ausdrucke wurden gemacht, direkt bevor sie mit mysql_query() an die DB =
> geschickt wurden. Das heißt die per "get" übertragenen Daten lagen =
vor,=20
> waren lesbar und korrekt; darum dürfte eigentlich der Umstieg auf "po=
st"=20
> keine Veränderung bringen.
Dem sollte so sein ja.
>=20
> Eine Überprüfung während der Verarbeitung hatte dann ergeben, das=
s die=20
> Daten auch richtig in die Datenbank geschrieben wurden. Nachdem ich=20
> diese Prüfung schrittweise bis in die letzte Programmzeile verschoben=
=20
> hatte, konnte ich feststellen, dass bei Verarbeitung der letzten=20
> Programmzeile meiner PHP-Seite noch alles korrekt in der Datenbank=20
> stand. Das bedeutet, die Daten standen so in der Datenbank wie ich es=20
> auch in den Sql-Befehlen geschrieben hatte.
>=20
> Rief ich dann die Tabelle mit PhpMyAdmin auf, waren die darin=20
> enthaltenen Daten falsch. Das heißt irgendwie müssen die Daten nach=
der=20
> letzten PHP-Zeile verändert worden sein. Das verstehe wer will.
>=20
Nur so ein Gedanke. Du arbeitest nicht mit transactionen oder?
Das klingt so als ob ein COMMIT fehlt und dadurch nach ende des Skripts
ein Rollback erfolgt.
> Gut. Jedenfalls mit "post" sind meine Probleme nun weg. Die Sql-Befehle=
=20
> sind die gleichen, es gibt keine Redirects und ich schließe dieses Th=
ema=20
> nun ab und verbuche es unter "Dinge, die ich mal verstehen will, wenn=20
> ich groß bin" ;-)
Warum das aber bei POST geht?
Nur noch mal eine Überlegung
Ren=E9
--=20
Informatiker haben Humor, allerdings lässt sich der nur schwer
im Quelltext ausdrücken. Ausnahme Microsoft: Dort arbeiten die
Kabarettisten der Informatik, die sogar lustigen Quelltext schreiben
können. [Oliver Schad in dclpm=
]
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 12:02:50 von Thomas Poppner
René Raule wrote:
> Nur so ein Gedanke. Du arbeitest nicht mit transactionen oder?
> Das klingt so als ob ein COMMIT fehlt und dadurch nach ende des Skripts
> ein Rollback erfolgt.
Nein, ich arbeite nicht mit Transcations. Abgesehen davon steht danach
ein falscher Eintrag in der DB. Wäre ein Rollback erfolgt, müsste der
Ursprungszustand erhalten bleiben. Das ist aber nicht der Fall.
> Warum das aber bei POST geht?
>
> Nur noch mal eine Überlegung
Ich kann es mir nicht erklären und würde dich für besoffen halten, wenn
du so ein Problem hier gepostet hättest ;-) Das Verrückte ist, es ist
reproduzierbar.
Viele Grüße
Thomas
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 16:37:46 von Johannes Vogel
Hi Thomas
Thomas Poppner wrote:
> Gut. Jedenfalls mit "post" sind meine Probleme nun weg. Die Sql-Befehle
> sind die gleichen, es gibt keine Redirects und ich schließe dieses Thema
> nun ab und verbuche es unter "Dinge, die ich mal verstehen will, wenn
> ich groß bin" ;-)
Vielleicht wäre es interessant, ein Hex-Dump der Queries zu vergleichen?
Und aber auch mal zu versuchen, die Infos über GET, wie auch über POST
zu übermitteln und dann die beiden Query-Ergebnisse zu vergleichen.
Grüess, Johannes
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 18:12:59 von Magnus Rosenbaum
Thomas Poppner wrote:
> Gut. Jedenfalls mit "post" sind meine Probleme nun weg. Die Sql-Befehle
> sind die gleichen, es gibt keine Redirects und ich schließe dieses Thema
> nun ab und verbuche es unter "Dinge, die ich mal verstehen will, wenn
> ich groß bin" ;-)
Ich würde das mal auf einem anderen Server ausprobieren, vielleicht ist es
ein Bug in Deiner PHP oder MySQL Version.
Ich hatte schon öfter Probleme dieser Art, die definitiv nicht
nachvollziehbar waren. Einmal haben z.B. sämtliche Datenbankabfragen nicht
mehr geklappt, wenn ein leeres Hintergrundbild im Stylesheet stand.
Updates haben dann auch oft geholfen.
cu, Magnum
--
Carl Magnus Rosenbaum M.A. Tel: 089 - 700 666 26
Administration - Programmierung - Weiterbildung Fax: 089 - 700 666 86
http://cmr.forestfactory.de/ Mobil: 0163 - 700 666 2
Re: Problem beim Löschen und Wiedereinfügen
am 15.01.2005 22:34:53 von Thomas Hamacher
Magnus Rosenbaum schrieb:
> Thomas Poppner wrote:
>> Gut. Jedenfalls mit "post" sind meine Probleme nun weg. Die
>> Sql-Befehle sind die gleichen, es gibt keine Redirects und ich
>> schließe dieses Thema nun ab und verbuche es unter "Dinge, die ich mal
>> verstehen will, wenn ich groß bin" ;-)
> Ich hatte schon öfter Probleme dieser Art, die definitiv nicht
> nachvollziehbar waren. Einmal haben z.B. sämtliche Datenbankabfragen
> nicht mehr geklappt, wenn ein leeres Hintergrundbild im Stylesheet stand.
Und der Teufel ist ein Eichhörnchen. Egal was da das Problem ausgelöst
haben mag, ein Stylesheet war es sicherlich nicht.