Seite 1 von 2
MySQL Probleme: INSERT in Schleife funktioniert nicht richti
Verfasst: 10.08.2006 19:33
von smaugilein
Tag, ich hab ein "kleines" MySQL-Problem. Ich hab folgenden Programmcode:
Code: Alles auswählen
$neue_id = mysql_insert_id();
$sql = "SELECT username FROM users WHERE username != '" . $userdata['username'] . "'";
$result = mysql_query($sql) OR die(mysql_error());
while($row = mysql_fetch_array($result))
{
$sql = "INSERT INTO forum_ungelesen (forum, thema, username) VALUES (" . $forum . ", " . $neue_id . ", '" . $row['username'] . "');";
$resultater2 = mysql_query($sql) OR die(mysql_error());
}
mysql_free_result($result);
Im Klartext: Bei speichern eines Forenbeitrags (selbst programmiert) sollen alle Benutzernamen außer dem des Beitragsschreibers gelesen werden und für jeden Benutzernamen soll in der Tabelle "forum_ungelesen" das Forum ($forum), die Beitrags-ID ($neue_id) und der Benutzername ($row['username']) gespeichert werden.
In der Tabelle "forum_ungelesen" soll hat bei jedem Eintrag immer für jeden Benutzer ein Eintrag geschrieben werden, dass der Beitrag ungelesen ist. Bei Ansicht wird natürlich dieser Eintrag wieder entfernt und somit gilt der Beitrag als gelesen.
Das Problem: MySQL fügt mir keine Einträge in die Tabelle ein! Wenn ich in $sql in der Schleife das " . $neue_id . " durch eine Zahl ersetze, funktioniert das ganze. Nützt mir aber nichts, da dann ja nicht gespeichert wird, welcher Beitrag ungelesen ist...!

Aber selbst, wenn ich der Variable $neue_id direkt eine Zahl zuweise (also bspw. $neue_id = 5;) geht's nicht.
Was mache ich falsch? Und: Könnte man eine verschachtelte SQL-Anweisung basteln, mit der automatisch für jeden Benutzer (außer dem Beitragsschreiber) ein Tabelleneintrag eingefügt wird? Ich verzweifel hier noch....

Verfasst: 10.08.2006 20:37
von Banger
Servus,
das naheliegenste wäre doch, mal zu überprüfen, welchen Wert $neue_id enthält. Auf welche Query bezieht sich mysql_insert_id(), bzw. führst Du zwischen der bezugnehmenden Query und dem mysql_insert_id() noch weitere SQL-Operationen durch?
Deine letzte Frage ist allerdings ganz fix beantwortet:
Code: Alles auswählen
$sql = 'INSERT INTO `forum_ungelesen` (`forum`, `thema`, `username`)
SELECT '.(int)$forum.', '.(int)$neue_id.', `username`
FROM `users`
WHERE `username` <> "'.mysql_escape_string($userdata['username']).'"';
Verfasst: 11.08.2006 11:15
von smaugilein
Vielen Dank für die Schleife, Banger - jetzt spar ich ein paar Zeichen im Sourcecode und hab was dazu gelernt, aber das Problem bleibt bestehen.
Verwunderlich ist auch, dass nach dem Ausführen des Befehls (aber auch meiner vorherigen Schleife) mein phpMyAdmin in der Tabelle "forum_ungelesen" unter "Speicherplatzverbrauch" ständig ein Überhang entsteht. Zur Zeit sind es 624 Bytes. Also Speicherplatzverbrauch ohne Daten in der Tabelle!

Nach dem Optimieren ist alles wieder beim alten (kein Überhang mehr) - aber kaum führe ich obige SQL-Befehle noch einmal aus, gibt's wieder Überhang. Könnte dies auf das Problem hindeuten?
Verfasst: 11.08.2006 14:30
von Banger
Halloooohoooooo, lesen bitte!
Banger hat geschrieben:das naheliegenste wäre doch, mal zu überprüfen, welchen Wert $neue_id enthält. Auf welche Query bezieht sich mysql_insert_id(), bzw. führst Du zwischen der bezugnehmenden Query und dem mysql_insert_id() noch weitere SQL-Operationen durch?
Verfasst: 11.08.2006 14:39
von smaugilein
Ich hab doch oben geschrieben, dass selbst wenn ich z.B.
vorher eintrage, das ganze nicht funktioniert. Es liegt
nicht an der Funktion mysql_insert_id(), welche nur die aktuelle ID des vorherigen gespeicherten Eintrags in die Tabelle "forum_beitraege" holt und diese ID dann halt für die Tabelle "forum_ungelesen" benützt.
Der Wert von $neue_id ist vollkommen korrekt - das war das erste, was ich überprüft habe. Aber selbst, wenn er nicht korrekt wäre: Es müsste entweder eine Fehlermeldung auftreten oder es müssten Zeilen in die Tabelle "forum_ungelesen" eingetragen werden! Aber
nichts von beidem passiert!
Woran liegt es dann? Ich bin mit meinem (PHP/MySQL-)Latein am Ende...

Verfasst: 11.08.2006 15:00
von Banger
Hm... lass Dir $sql doch mal ausgeben und poste es hier bzw. führ die query mal direkt in phpMyAdmin aus... *denk*
Verfasst: 11.08.2006 15:07
von smaugilein
Wenn es einen Fehler in der SQL-Anfrage gäbe, schriebe mir MySQL das. Aber dem ist ja
leider nicht so! (Wenn es einen Fehler gäbe, könnte ich diesen natürlich beheben - aber (s.u.) es gibt keinen von meiner Seite!!)
Das "lustige" ist nämlich: Ich habe in einer anderen Datei namens "kleinanzeigen.php" genau die gleiche SQL-Schleife wie vorher: Beim Speichern einer neuen Kleinanzeige wird für jeden Benutzer ein Eintrag in einer Tabelle namens "kleinanzeigen_ungelesen" gesetzt, dass diese Anzeige neu ist. UND ES FUNKTIONIERT!
Ich hab diese Schleife eins zu eins in meine forum.php übernommen, den Tabellennamen angepasst und musste noch die Namen "forum" und "thema" ergänzen. Wieder das gleiche wie vorher: Keine Reaktion von MySQL.
Ich habe jetzt die Tabelle "forum_ungelesen" komplett gelöscht und eine neue erstellt mit dem Namen "forum_ungelesenebeitraege" (doofer Name) und die Codezeilen entsprechend angepasst. Aber auch hier: Keine Reaktion. Nur immer dieser dubiose "Überhang" in phpMyAdmin.
Ist meine Datenbank defekt? Muss ich meinen Provider anschreiben? Ich krieg hier langsam Panik - nicht, dass noch irgendwelche "wichtigen" Daten verloren gehen (werden). Obwohl das bei allen anderen Sachen (Bilderkommentare, Gästebucheinträge, Forenbeiträge an sich, Kleinanzeigen, Linkliste, ...) kein Problem ist! Da funktioniert alles 1a! ...
Verstehst ihr jetzt, warum ich verzweifel?

Verfasst: 11.08.2006 16:15
von Miriam
Wenn Du Bedenken wegen der Funktion Deiner Tabellen hast, kannst Du ja mal vorbeugend ein REPAIR im phpmyadmin anwerfen.
Verfasst: 11.08.2006 16:17
von smaugilein
Na, ich glaube, ich hab's jetzt irgendwie geschafft... hab die ganze Schleife und alles drumherum in eine Extra-Funktion gepackt und die dann an der jeweiligen Stelle im Quelltext aufgerufen - bisher funktioniert's!
Danke für die ganzen Tipps! Wenn es noch Probleme gibt, melde ich mich direkt an dieser Stelle!
Viele Grüße!
Verfasst: 11.08.2006 18:37
von Seether
Warum machst Du es nicht umgekehrt?
Also die Beiträge, die ein User gelesen hat speichern.
Stell Dir folgendes vor: Du hast 10.000 User und 100.000 Beiträge. Dann würden bei jedem neuen User 100.000 Einträge gemacht und bei jedem neuen Beitrag 10.000. Auch bei Usern die eh schon inaktiv sind....
Andersrum würde die Funktion das gleiche erfüllen, aber die Belastung wäre gringer....
S.