MySQL Probleme: INSERT in Schleife funktioniert nicht richti

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

MySQL Probleme: INSERT in Schleife funktioniert nicht richti

Beitrag 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...! :roll: 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.... :-(
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag 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']).'"';
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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! :o
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?
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag 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?
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag von smaugilein »

Ich hab doch oben geschrieben, dass selbst wenn ich z.B.

Code: Alles auswählen

$neue_id = 5;
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... :(
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Banger »

Hm... lass Dir $sql doch mal ausgeben und poste es hier bzw. führ die query mal direkt in phpMyAdmin aus... *denk*
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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? :-( :-( :-(
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Wenn Du Bedenken wegen der Funktion Deiner Tabellen hast, kannst Du ja mal vorbeugend ein REPAIR im phpmyadmin anwerfen.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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! :roll:

Danke für die ganzen Tipps! Wenn es noch Probleme gibt, melde ich mich direkt an dieser Stelle! :-D

Viele Grüße!
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Seether
Mitglied
Beiträge: 1446
Registriert: 10.10.2002 23:42

Beitrag 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.
Antworten

Zurück zu „Coding & Technik“