Threadbasiertes Forum mit PHP
Langweilo
- php
http://aktuell.de.selfhtml.org/artikel/php/php-forum/
Es geht um oben genanntes Forum, da Anleitung ist ja echt super, auch scheint es soweit zu funktionieren, jedoch kann ich die Threads nicht öffnen.
Habe alle Dateien wie beschrieben angelegt die Index wird auch angezeigt. wenn ich aber in der Index einen Thread zum lesen öffnen will passiert nichts. scheinbar klappt die Übergabe der Variablen nicht.
hat jemand von euch ne Idee wo da der Fehler sitzt?
ich denke er muss hier liegen:
if( isset($eintrag) ) { // Wenn $eintrag übergeben wurde..
$eintrag = (int) $eintrag; // ... $eintrag erst mal zu einem Integer machen ..
if( $eintrag > 0 ) { // ... und schauen ob es größer als 0 ist ..
$result=mysql_query("SELECT ID, TID, DATE_FORMAT(Zeitpunkt,'%T') AS Uhrzeit,
DATE_FORMAT(Zeitpunkt, '%e. %m. %Y') AS Datum, AutorName, AutorEmail,
Betreff, Text FROM Forum WHERE ID = ".$eintrag);
if(!$result) die("Die Datenbank konnte nicht abgefragt werden");
if( mysql_num_rows($result) > 0) { // überprüfen ob ein Eintrag mit dieser ID in der Datenbank ist
$Eintragsdaten = mysql_fetch_array($result); // Und ggbf. aus der Datenbank holen
}
}
}
if(!isset($Eintragsdaten)) { // Irgendwas ist schiefgelaufen
header("Location: index.php"); // Benutzer zur Startseite umleiten
exit(); // Skript beenden
}
hier auch der Link zum Testforum:
http://klassentreffen.rerori.de/forum/
Hi!
wenn ich aber in der Index einen Thread zum lesen öffnen will passiert nichts. scheinbar klappt die Übergabe der Variablen nicht.
Was hast du getan, um deine Vermutung zu beweisen oder zu widerlegen? Kontrollausgaben (mit var_dump()) können dazu vorgenommen werden. Ebenfalls hilfreich ist ein auf E_ALL stehendes error_reporting (nebst display_errors=on).
hat jemand von euch ne Idee wo da der Fehler sitzt?
Der Artikel ist von 2002 (Datum im Kopfabschnitt des HTML-Quelltextes) und seitdem hat sich einiges geändert in der PHP-Landschaft. Beispielsweise hat sich $HTTP_GET_VARS zu $_GET gewandelt, POST genauso. Im Abschnitt zu den Magic Quotes ist aber noch die alte Variante zu sehen. Außerdem ist das dortige Vorgehen nicht besser als register_globals eingeschaltet zu haben (war damals auch noch Standard). Hoffentlich war Henryk damals schon so sicherheitsbewusst und hat alle verwendeten Variablen mit definiertem Anfangswert erstellt, damit register_globals nicht zur Sicherheitslücke wird.
Dann verwendet er mysql_pconnect(), was in der Form erstmal keine Punkte bringt, eher im Gegenteil. Das solltest du mindestens auch gegen die Nicht-p-Variante austauschen.
Das waren nur Kleinigkeiten, die mir beim Drüberschauen so aufgefallen sind. Insgesamt scheint mir, dass der Beitrag eine grundlegende Sanierung nötig hat. Es ist aber nicht alles schlecht, immerhin hat er die Struktur nach dem EVA-Prinzip aufgebaut. Da ich mir von den Alternativen keine näher angeschaut habe, kann ich dir auch keinen Ersatz empfehlen.
Lo!
Hallo
http://aktuell.de.selfhtml.org/artikel/php/php-forum/
Es geht um oben genanntes Forum, da Anleitung ist ja echt super, auch scheint es soweit zu funktionieren, jedoch kann ich die Threads nicht öffnen.
Habe alle Dateien wie beschrieben angelegt die Index wird auch angezeigt. wenn ich aber in der Index einen Thread zum lesen öffnen will passiert nichts. scheinbar klappt die Übergabe der Variablen nicht.
hat jemand von euch ne Idee wo da der Fehler sitzt?
ich denke er muss hier liegen:
if( isset($eintrag) ) { // Wenn $eintrag übergeben wurde..
$eintrag = (int) $eintrag; // ... $eintrag erst mal zu einem Integer machen ..
// ...
}
Ja, es liegt genau daran. Wie dedlfix schon sagte, wurden im Code damals übliche, aber heute veraltete Vorgehensweisen benutzt. Die Variable `$eintrag`{:.language-php} wird einfach übernommen, anstatt sie aus dem dafür vorgesehenen Array zu holen. Das war damals wohl `$HTTP_GET_VARS`{:.language-php}, heute wäre es `$_GET`{:.language-php}. Im Code wird noch davon ausgegangen, dass — wie damals üblich — die übergebenen Variablen bei eingeschaltetem register\_globals direkt zur Verfügung stehen, was aber zu Sicherheitslücken führen kann (und auch oft tut).
Zudem ist das Skript eigentlich nur eine Vorlage oder Skizze, um das grundsätzliche Vorgehen beim Programmieren eines Forumsskripts aufzuzeigen. Eine Forumssoftware, die auf Grundlage dieses Artikels entstand, ist [MyLittleForum](http://mylittleforum.net/). Sie liegt momentan in der Version 2.1.4 vor und Version 2.2 ist im Endstadium der Entwicklung. Wenn du also nicht auf Basis des Artikels selbst lernen willst ein Forum zu programmieren, sondern nur ein einfaches Forum suchst, das du auf deiner Seite verwenden kannst, kannst du mlf runterladen und benutzen.
Tschö, Auge
--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
[Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
Hallo
http://aktuell.de.selfhtml.org/artikel/php/php-forum/
Es geht um oben genanntes Forum, da Anleitung ist ja echt super, auch scheint es soweit zu funktionieren, jedoch kann ich die Threads nicht öffnen.
Habe alle Dateien wie beschrieben angelegt die Index wird auch angezeigt. wenn ich aber in der Index einen Thread zum lesen öffnen will passiert nichts. scheinbar klappt die Übergabe der Variablen nicht.
hat jemand von euch ne Idee wo da der Fehler sitzt?
ich denke er muss hier liegen:
if( isset($eintrag) ) { // Wenn $eintrag übergeben wurde..
$eintrag = (int) $eintrag; // ... $eintrag erst mal zu einem Integer machen ..
// ...
}
>
> Ja, es liegt genau daran. Wie dedlfix schon sagte, wurden im Code damals übliche, aber heute veraltete Vorgehensweisen benutzt. Die Variable `$eintrag`{:.language-php} wird einfach übernommen, anstatt sie aus dem dafür vorgesehenen Array zu holen. Das war damals wohl `$HTTP_GET_VARS`{:.language-php}, heute wäre es `$_GET`{:.language-php}. Im Code wird noch davon ausgegangen, dass — wie damals üblich — die übergebenen Variablen bei eingeschaltetem register\_globals direkt zur Verfügung stehen, was aber zu Sicherheitslücken führen kann (und auch oft tut).
>
> Zudem ist das Skript eigentlich nur eine Vorlage oder Skizze, um das grundsätzliche Vorgehen beim Programmieren eines Forumsskripts aufzuzeigen. Eine Forumssoftware, die auf Grundlage dieses Artikels entstand, ist [MyLittleForum](http://mylittleforum.net/). Sie liegt momentan in der Version 2.1.4 vor und Version 2.2 ist im Endstadium der Entwicklung. Wenn du also nicht auf Basis des Artikels selbst lernen willst ein Forum zu programmieren, sondern nur ein einfaches Forum suchst, das du auf deiner Seite verwenden kannst, kannst du mlf runterladen und benutzen.
>
> Tschö, Auge
>
Danke für den Tipp mit [MyLittleForum](http://mylittleforum.net/),
allerdings ist mir dies alles zu aufwendig, ich möchte keine Benutzerverwaltung, auch brauch ich nicht ganz so viele Spielereien.
ich suche wirklich nur ein kurzes Forum wo jeder zu einem Eintrag eine Antwort schreiben kann. hier geht es wirklich nur um eine Webseite für ein Klassentreffen, da sind max. 20 Personen am Gespräch beteiligt und es geht auch nur um kurze absprechen.
also wenn einer <http://aktuell.de.selfhtml.org/artikel/php/php-forum/#a1> 2010 konform bekommt, so dass man es nutzen kann oder mir eine wirklich ähnliche Lösung zeigen kann wäre ich sehr dankbar.
danke und mfg René
Hi!
also wenn einer http://aktuell.de.selfhtml.org/artikel/php/php-forum/#a1 2010 konform bekommt, so dass man es nutzen kann oder mir eine wirklich ähnliche Lösung zeigen kann wäre ich sehr dankbar.
Ich denke, es sollte erstmal reichen, $HTTP_*_VARS durch das Pendant $_* auszutauschen und bei mysql_pconnect() das p zu entfernen, um das Script zum Laufen zu bekommen. Der nächste Schritt wäre, mit E_ALL-gestelltem error_reporting zu schauen, ob Notices auftauchen. Als weitere Prüfung solltest du mal Texte mit Sonderzeichen einzugeben versuchen, also mit ' und " und \ und <b>test</b> drin. All das muss genauso wieder ausgegeben werden. Wenns das tut, kann man schon mal annehmen, dass es auch sicher ist.
Lo!
Entschuldigung für mein Doppelpost, da diese frage nun schon etwas spezieller war hatte ich einen neuen Thread eröffnet und nicht bedacht das ich die frage hier ebenfalls weiterstellen kann.
Nachdem ja nun der Doppelpost geschlossen ist, hier nochmal die Frage.
danke trotzdem für eure hilfe!
Es geht um das tutorial von Henryk Plötz
http://aktuell.de.selfhtml.org/artikel/php/php-forum/
Das der Beitrag schon älter ist und somit nicht ganz konform ist mir klar, habe diesen jetzt aber soweit zur Funktion gebracht.
es können auch Einträge gemacht werden, jedoch scheint bei der Übergabe an der MYSQL Datenbank was nicht zu stimmmen.
hier mal die nun neue "neu.php"
<?php
include("funktionen.php"); // Nützliche Funktionen importieren
unset($errors); // Ein Array in das wir Fehlermeldungen schreiben
unset($Thread); // Variablen die evt. uninitialisiert benutzt werden, löschen
$connid = DBverbinden(); // Datenbankverbindung herstellen
if(!isset($_GET[eintrag]) || $eintrag < 0) $eintrag = 0;
else $eintrag = (int) $_GET[eintrag]; // $eintrag auf einen vernünftigen Wert setzen
if($bearbeitet != true && $eintrag != 0) { // Es wurden keine Eingaben gemacht, und es soll eine Antwort verfasst werden
$result = mysql_query("SELECT Betreff, Text FROM Forum WHERE ID =".$eintrag, $connid);
if(!$result) die("Datenbank konnte nicht abgefragt werden");
if(mysql_num_rows($result) != 1) { // Eintrag entweder nicht vorhanden oder mehrere Einträge mit derselben ID (hmm?)
$errors[] = "Der Eintrag auf den Sie antworten wollen ist nicht in der Datenbank.
Entweder existierte er nie und Sie spielen grade an den Formularparametern rum
oder er wurde in der Zwischenzeit gelöscht.
Wenn Sie dieses Formular abschicken, wird ein neuer Thread eröffnet.";
$eintrag = 0; // Auf "neuen Thread" setzen
} else {
$eintragsdaten = mysql_fetch_array($result);
$betreff = $eintragsdaten["Betreff"]; // Alte Betreffzeile übernehmen
$text = $eintragsdaten["Text"]; // Alten Text übernehmen
if(get_magic_quotes_runtime())
$text = stripslashes($text); // Die Slashes die beim Auslesen freundlicherweise hinzugefügt werden entfernen
$text = wordwrap($text); // Nachrichtentext automatisch umbrechen
$text = preg_replace("/^/m", "> ", $text); // Zitatzeichen an den Anfang jeder Zeile stellen
$text = addslashes($text); // Gleiche Ausgangsbedingungen für alle Variablen wiederherstellen
}
}
if($_POST[abschicken] != "") { // Nachricht soll abgeschickt werden
// Allgemeine Überprüfungen
if(!isset($_POST[name]) || $_POST[name] == "")
$errors[] = "Es wurde kein Name eingegeben. Bitte geben Sie einen Namen ein.";
if(!isset($_POST[email]) || $_POST[email] == "")
$errors[] = "Es wurde keine Email-Addresse eingegeben. Bitte geben Sie eine Email-Addresse ein.";
else {
$email = trim($_POST[email]); // Leerzeichen vor und hinter der Email-Addresse abschneiden
if(!preg_match("/^[^@]+@.+\.\D{2,5}$/", $_POST[email])) // Überprüfung ob die Email-Addresse das Format name@domain.tld hat
$errors[] = "Die eingebene Email-Addresse sieht nicht richtig aus.";
}
if(!isset($_POST[betreff]) || $_POST[betreff] == "")
$errors[] = "Es wurde keine Betreff-Zeile eingegeben. Bitte geben Sie eine Betreffzeile ein.";
if($eintrag != 0) { // Es soll eine Antwort verfasst werden
$result = mysql_query("SELECT TID FROM Forum WHERE ID=".$eintrag, $connid);
if(!$result) die("Datenbank konnte nicht abgefragt werden");
if(mysql_num_rows($result) != 1) { // Da ist irgendwas faul
$errors[] = "Der Eintrag auf den Sie antworten wollen ist nicht in der Datenbank.
Entweder existierte er nie und Sie spielen grade am Formular rum
oder er wurde zwischenzeitlich gelöscht.
Wenn Sie das Formular erneut abschicken wird ein neuer Thread eröffnet.";
$eintrag = 0;
} else {
list($Thread) = mysql_fetch_row($result);
}
}
$name = $_POST[name];
$betreff = $_POST[betreff];
$email = $_POST[email];
$text = $_POST[text];
if(!isset($errors)) { // Keine Fehler bisher, let's rock
if($eintrag == 0) $Thread = 0; // neuer Thread
$result = mysql_query("INSERT INTO Forum (PID, TID, AutorName, Betreff, AutorEmail, Text)
VALUES ('$eintrag','$Thread','$name','$betreff','$email','$text')", $connid);
if(!$result) die("Konnte den neuen Eintrag nicht in die Datenbank schreiben");
if($eintrag == 0) // Jetzt die Thread-ID des neuen Threads korrekt setzen
if(!mysql_query("UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID = LAST_INSERT_ID()", $connid))
die("Konnte die Thread-ID in der Datenbank nicht aktualisieren.
Die Datenbasis könnte inkonsistent sein.");
// Wenn wir noch leben, dann ist alles glatt gegangen.
header("Location: lesen.php?eintrag=". (int) mysql_insert_id()); // Benutzer auf den neuen Eintrag umleiten
exit(); // Skript beenden
}
}
// HTML-Teil
?>
<?php if($eintrag == 0) { ?>
<h1>Neuen Eintrag verfassen</h1>
<?php } else { echo $eintrag;?>
<h1>Antwort verfassen</h1>
<p>Im Formular ist der Eintrag auf den Sie antworten noch einmal komplett zitiert.
Bitte löschen Sie beim Beantworten nicht benötigte Zitate.</p>
<?php } ?>
<?php if(isset($errors)) { /* es sind Fehler aufgetreten */?>
<h2>Fehler:</h2>
<p>Beim Bearbeiten Ihrer Anfrage sind folgende Fehler aufgetreten:</p>
<ul>
<?php foreach($errors as $error) { /* alle Fehler durchgehen */ ?>
<li><?php wp($error);?></li>
<?php } ?>
<?php } ?>
</ul>
<!-- Jetzt das Formular -->
<h2>Nachricht schreiben</h2>
<form action="neu.php" method="POST">
<!-- Der Eintrag auf den geantwortet wird, oder 0 für neuen Thread -->
<input type="hidden" name="eintrag" value="<?php wp($eintrag);?>">
<!-- Damit die eingegeben Daten nicht aus der Datenbank überschrieben werden -->
<input type="hidden" name="bearbeitet" value="true">
<table>
<tr>
<td>Ihr Name: </td><td><input type="text" size="80" name="name" value="<?php wp($name);?>"></td>
</tr>
<tr>
<td>Ihre Mailaddresse: </td><td><input type="text" size="80" name="email" value="<?php wp($email);?>"></td>
</tr>
<tr>
<td>Betreff: </td><td><input type="text" size="80" name="betreff" value="<?php wp($betreff);?>"></td>
</tr>
<tr valign="top">
<td>Nachrichtentext: </td>
<td>
<textarea cols="80" rows="10" wrap="virtual" name="text"><?php wp($text);?></textarea>
</td>
</tr>
<tr>
<td>
<?php if($eintrag == 0) { ?>
<a href="forum.php">Abbrechen<br><small>Zur Hauptseite</small></a>
<?php } else { ?>
<a href="lesen.php?eintrag=<?php wp($eintrag);?>">Abbrechen<br><small>Zum gelesenen Eintrag</small></a>
<?php } ?>
</td>
<td><input type="submit" name="abschicken" value="Abschicken"></td>
</tr>
</table>
</form>
Die Übergabe an die MYSQL Datenbank klappt soweit, jedoch wird das Feld PID was mit $eintrag gefüllt werden soll, immer nur mit 0 gefüllt, auch das Feld TID wird nicht mit $Thread gefüllt sondern mit fortlaufender ID.
des weiterem erhalte ich folgenden Fehler:
Warning: Cannot modify header information - headers already sent by (output started at */neu.php:11) in */neu.php on line 76
was darauf schließen lässt das hier was nicht stimmt:
if($eintrag == 0) // Jetzt die Thread-ID des neuen Threads korrekt setzen
if(!mysql_query("UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID = LAST_INSERT_ID()", $connid))
die("Konnte die Thread-ID in der Datenbank nicht aktualisieren.
Die Datenbasis könnte inkonsistent sein.");
// Wenn wir noch leben, dann ist alles glatt gegangen.
header("Location: lesen.php?eintrag=". (int) mysql_insert_id()); // Benutzer auf den neuen Eintrag umleiten
exit(); // Skript beenden
Ich bin einfach blind und finde den Fehler nicht, wäre dankbar für jede hilfe.
Hi!
Das der Beitrag schon älter ist und somit nicht ganz konform ist mir klar, habe diesen jetzt aber soweit zur Funktion gebracht.
Wenn du Änderungen einbringst, musst du sehr vorsichtig damit umgehen, besonders wenn du noch nicht vollständig den Code und seine Arbeitsweise durchschaut hast und dir auch noch nicht so viele PHP-Erfahrungen zur Verfügung stehen.
es können auch Einträge gemacht werden, jedoch scheint bei der Übergabe an der MYSQL Datenbank was nicht zu stimmmen.
Dagegen hilft, konkretes Nachschauen (Kontrollausgaben!), welche Werte anliegen, wo sie herkommen und warum sie nicht das Erwartete enthalten.
Das ganze Script setzt auf register_globals = on. Entweder du schreibst es komplett um und erwischst auch alle aus $_GET/$_POST-Eingaben stammenden Variablen oder du baust den register_globals-Mechanismus nach. Lass lieber diese alte Version in Frieden ruhen und nimm my little forum!
Entgegen meiner ersten Annahme reicht es doch nicht, nur in der magic_quotes_fix.php die $HTTP_*_VARS auszutauschen. Es braucht auch noch am Anfang von magic_quotes_fix.php diese 4 Zeilen:
extract($_GET);
extract($_POST);
extract($_COOKIE);
extract($_SERVER);
Das macht das gleiche wie register_gobals = on. Solange ein error_reporting(E_ALL) keine Notice wirft, sollte das auch keine weiteren negativen Auswirkungen haben. Diese Aussage gilt aber nur dann, wenn du beim Testen alle bedingten Zweige testest, also if-Wege und else-Wege. Eine Garantie kann und will ich dazu aber nicht geben.
Man kann auch mit register_globals=on sicher programmieren. Das Problem an diesem Feature ist, dass es Variablen anlegt und man dies leicht übersehen kann.
while (irgendwas)
$string .= 'irgendwas';
echo "<p>$string</p>";
Angenommen, $string existiert noch nicht, so wird es beim ersten Schleifendurchlauf angelegt (nebst einer Notice-Meldung). Mit register_globals=on kann man jedoch über den Querystring oder einen POST-Wert eine Vorbelegung von $string erreichen. Diese Vorbelegung wird zusammen mit dem Schleifentext ausgegeben und schon hat man unerwünschten Code in seiner Webseite. Würde hingegen vor der Schleife explizit $string = ''; gesetzt, so kann das register_globals=on hier keinen Schaden mehr anrichten. Wenn Henryk so umsichtig war, seine Variablen vor dem Erstgebrauch immer zu initialisieren, so sollte nichts weiter passieren. Heutzutage traue ich ihm das ohne weiteres zu, aber ich keine seinen Wissensstand von 2002 nicht.
if(!isset($_GET[eintrag]) || $eintrag < 0) $eintrag = 0;
Hier hast du schon die erste Misch-Stelle. Du testest einerseits auf $_GET[eintrag] (von dir umgeschrieben) und andererseits $eintrag, welches aber nur bei register_globals=on oder dem genannten Substitut zur Verfügung steht. Also entweder alles erwischen oder register_globals nachbilden.
Warning: Cannot modify header information - headers already sent by (output started at */neu.php:11) in */neu.php on line 76
Du hast irgendwo eine Ausgabe, weswegen das header() nicht mehr wirken kann. Die Meldung sagt was von Zeile 11, aber das ist in deinem Code eine Leerzeile innerhalb eines <?php-?>-Bereiches, also nichts was eine Ausgabe erzeigt. Achte darauf, dass in inkludierten Dateien keine Zeilenumbrüche und andere unsichtbare Zeichen nach dem abschließenden ?> stehen oder lass das ?> am Dateiende ganz weg, dann kann sich kein Whitespace dahinterschmuggeln.
Lo!
@dedlfix
Dank dir, das Hat mir echt weiter geholfen!
Die Übergabe klappt jetzt. Es wird alles richtig in die Datenbank übernommen. einzig und allein der Fehler:
Warning: Cannot modify header information - headers already sent by (output started at /srv/www/htdocs/web132/html/klassentreffen/index.php:11) in /srv/www/htdocs/web132/html/klassentreffen/forum_ins.txt on line 76
existiert noch. diesen konnte ich bisher nicht lokalisieren.
Danke auch für den Tip mit my Little Forum, das ist mir aber alles zu umfangreich, ich brauch keine Nutzerverwaltung, UBB und und und.
es geht ihr für ein Forum zu einem Klassentreffen, hier werden maximal 20 Personen mal ihren Senf dazu geben.
Es soll wirklich so einfach wie möglich sein, und da gefällt mir diese Forum einfach super.
also wenn du noch ne Idee hast wo der Fehler genau sitzen könnte bzw. was den Fehler verursacht wäre ich sehr Dankbar.
gern stelle ich die Funktionierende Version dann auch als tutorial zur Verfügung.
Hi!
Warning: Cannot modify header information - headers already sent by (output started at /srv/www/htdocs/web132/html/klassentreffen/index.php:11) in /srv/www/htdocs/web132/html/klassentreffen/forum_ins.txt on line 76
In Zeile 11 der index.php gab es eine Ausgabe. Die darf nicht sein, weil damit das header() nicht mehr arbeiten kann. Wer die Ausgabe gemacht hat, kann ich dir nicht sagen, das ging aus deinem geposteten Code nicht hervor.
Danke auch für den Tip mit my Little Forum, das ist mir aber alles zu umfangreich, ich brauch keine Nutzerverwaltung, UBB und und und.
Ich glaube, du wärst schmerzärmer zum Ziel gekommen, wenn du einfach nur die Konfigurationsoptionen deaktiviert hättest für die Features, die du nicht brauchst.
gern stelle ich die Funktionierende Version dann auch als tutorial zur Verfügung.
So wie die Version jetzt ist, nützt sie auch mit den kleinen Änderungen nicht viel. Das muss, wie gesagt, generell umgebaut werden.
Lo!
Auch das hab ich nun Gelöst, tausend dank nochmal, und auch wenn du meinst ich soll es lassen, sag ich mir jetzt erst recht :-D
jetzt bin ich soweit gekommen, man kann Einträge lesen beantworten und auch neue erstellen, also alles was ich brauch.
ein Fehler ist mir noch aufgefallen, wo ich denke das der nicht so gedacht ist bzw. nicht so sein soll.
if(!isset($errors)) { // Keine Fehler bisher, let's rock
if($eintrag == 0) $Thread = 0; // neuer Thread
$result = mysql_query("INSERT INTO Forum (PID, TID, AutorName, Betreff, AutorEmail, Text)
VALUES ('$eintrag','$Thread','$name','$betreff','$email','$text')", $connid);
if(!$result) die("Konnte den neuen Eintrag nicht in die Datenbank schreiben");
if($eintrag == 0) // Jetzt die Thread-ID des neuen Threads korrekt setzen
if(!mysql_query("UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID = LAST_INSERT_ID()", $connid))
die("Konnte die Thread-ID in der Datenbank nicht aktualisieren.
Die Datenbasis könnte inkonsistent sein.");
// Wenn wir noch leben, dann ist alles glatt gegangen.
header("Location: lesen.php?eintrag=". (int) mysql_insert_id()); // Benutzer auf den neuen Eintrag umleiten
exit(); // Skript beenden
}
}
Wenn ich auf einen Eintrag antworte wird ja $eintrag übergeben (also z.B. 5) demnach wird in der Datenbank im Feld PID der Wert 5 Geschrieben. und die Antwort auf (int) mysql_insert_id() ist die aktuelle ID des neuen Eintrags, somit erfolgt die Ausgabe header("Location: lesen.php?eintrag= mit der Aktuellen ID.
Wenn ich nun aber einen neuen Eintrag ohne Bezug mache, somit also $eintrag = 0 ist, werden zwar alle Felder in der Datenbank gefüllt aber die Antwort auf mysql_insert_id() ist ebenfalls 0. hier fehlt also scheinbar die Rückantwort der Datenbank welche neue ID vergeben wurde.
das Problem ist das die Weiterleitung nach lesen.php?eintrag=0 erfolgt, was ja bekanntlich nicht anzeigt werden kann da es keinen Eintrag mit der ID 0 gibt.
Dank dir dennoch für deine Unterstützung!
Hallo,
ein Fehler ist mir noch aufgefallen
mir auch:
header("Location: lesen.php?eintrag=". (int) mysql_insert_id()); // Benutzer auf den neuen Eintrag umleiten
Die Spezifikation von HTTP verlangt, dass der Location-Header eine vollständige, absolute URL angibt.
So long,
Martin
Hi!
if(!isset($errors)) { // Keine Fehler bisher, let's rock
if($eintrag == 0) $Thread = 0; // neuer Thread
$result = mysql_query("INSERT INTO Forum (PID, TID, AutorName, Betreff, AutorEmail, Text)
VALUES ('$eintrag','$Thread','$name','$betreff','$email','$text')", $connid);
einfügen:
$lastid = mysql_insert_id();
if(!$result) die("Konnte den neuen Eintrag nicht in die Datenbank schreiben");
if($eintrag == 0) // Jetzt die Thread-ID des neuen Threads korrekt setzen
if(!mysql_query("UPDATE Forum SET TID=ID, Zeitpunkt=Zeitpunkt WHERE ID = LAST_INSERT_ID()", $connid))
die("Konnte die Thread-ID in der Datenbank nicht aktualisieren.
Die Datenbasis könnte inkonsistent sein.");// Wenn wir noch leben, dann ist alles glatt gegangen.
header("Location: lesen.php?eintrag=". (int) mysql_insert_id()); // Benutzer auf den neuen Eintrag umleiten
stattdessen:
header("Location: lesen.php?eintrag=". $lastid); // Benutzer auf den neuen Eintrag umleiten
exit(); // Skript beenden
}
}
> Wenn ich nun aber einen neuen Eintrag ohne Bezug mache, somit also $eintrag = 0 ist, werden zwar alle Felder in der Datenbank gefüllt aber die Antwort auf mysql\_insert\_id() ist ebenfalls 0. hier fehlt also scheinbar die Rückantwort der Datenbank welche neue ID vergeben wurde.
Da müsste man jetzt prüfen, wie sich mysql\_insert\_id() nach den UPDATE verhält, das ja dem INSERT mit der neu vergebenen ID folgt. Vermutlich gibt es nun die 0, weil das PHP-Handbuch das auch so beschreibt, dass sich der Wert auf das jüngste Statement bezieht und nicht auf das jüngste mit erhöhter ID. Entweder ist das damals auch schon ein Fehler gewesen oder erst durch eine Änderung seitens PHP/MySQL entstanden. Die obige Korrektur sollte helfen, denke ich. (Und wenn du ganz genau bist, gibst du dem Location-Header eine vollständige URL.)
Lo!
Manchmal ist man doch so Blöde :-D
Das gleiche hatte ich auch schon probiert, allerdings eine Zeile tiefer, also nach if(!$result)
da hat es natürlich auch nicht funktioniert.
aber wenn man auch mal die PHP Manual lesen würde, würde man folgendes finden:
mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat. Falls Sie den Wert zur späteren Verwendung speichern möchten, stellen Sie sicher, dass Sie mysql_insert_id() direkt nach der Abfrage aufrufen, die einen Wert erzeugt hat.
Dir sei nochmal recht herzlich gedankt, es funktioniert super.
Ach allen anderen sei gedankt die hier Tipps gegeben haben.
jetzt geht es an die Anpassungsarbeit. da hab ich noch bisschen was vor mir.
soll ja biss ins Style passen, da sollt ich aber alleine hinbekommen ;-)