[PHP] Problem mit Formular

Ich habe ein Problem mit einem Formular, mit dem ich Kommentare verwalten kann.
Wenn ich einen Kommentar erfolgreich bearbeite verschwindet das "Bearbeitungsfeld", bei einem Fehler bleibt es sichtbar. Soweit so gut.

Wenn ich einen Kommentar bearbeite und speichere und gleich darauf nochmal den gleichen Kommentar bearbeiten mag geht das nicht. Mache ich zwischendurch etwas anderes klappts wieder.

Das Problem liegt an meiner Abfrage, aber ich weiß nicht wie ich es richtig machen sollte, hab schon einige Möglichkeiten ausprobiert.

Hier mein Code:
PHP:
$errors = array();        // Nachrichten (Fehler, Erfolg)

//--------------------------------------------------------------------------
// bearbeiteter Kommentar speichern
//--------------------------------------------------------------------------
if(!empty($_POST['kommentar_bearbeiten']))
{
    $p_name = strip_tags(trim(stripslashes($_POST['p_name'])));
    $p_text = htmlspecialchars(trim(stripslashes($_POST['p_text'])));
    $nid = $_GET['p_kbearb'];

    if (empty($p_name))    {$errors[] = 'nachrichtenbox("fehler","Name muss angegeben werden.");';}

    else
    {
        mysql_verbinden();
           $db_abfrage = "UPDATE kommentare SET
        name='" . $p_name . "',
        kommentar='" . $p_text . "';";
           $erfolg = mysql_query($db_abfrage);

        if(!$erfolg)
        {
        $errors[] = 'nachrichtenbox("fehler","Fehler beim Bearbeiten des Kommentars.");';
        }
        else
        {
            $errors[] = 'nachrichtenbox("erfolg","Kommentar erfolgreich geändert!");';
            $status = '1';
        }

    }
}


//------------------------------------------------------------------------------
// Kommentare ausgeben
//------------------------------------------------------------------------------

[...]             // DB-Anweisungen

while($k_zeilenfeld = mysql_fetch_array($k_datensatz))
{

[...]            // Kommentar ausgeben

// Bearbeitungslink ausgeben
echo '<a href="' . $_SERVER['PHP_SELF'] . '?p_kat=news_detail&p_kbearb=' . $comment_id . '
      " title="Kommentar bearbeiten"></a>';
}


//------------------------------------------------------------------------------
// Formular: Kommentar bearbeiten
//------------------------------------------------------------------------------
if(!empty($_GET['p_kbearb']) && !isset($status))
{
[...]             // DB-Anweisungen

        echo '<form action="' . $_SERVER['PHP_SELF'] . '?p_kat=news_detail&p_kbearb='
              . $_GET['p_kbearb'] . '&p_detail=' . $news_id . '#comment_write" method="post">';
        echo '<p><label>Name:</label><input type="text" class="text" value="'  . $zeilenfeld['name']
              . '" name="p_name"></p>';
        echo '<p><label>Kommentar:</label><textarea name="p_text" cols="" rows="">'
              . $zeilenfeld['kommentar'] . '</textarea></p>';

        echo '<div class="buttons"><p><button type="submit" value="kommentar_bearbeiten"
              name="kommentar_bearbeiten"><img src="layout/ok.png" /> Speichern</button></p></form>';
}


//------------------------------------------------------------------------------
// Meldungen ausgeben
//------------------------------------------------------------------------------
if (!empty($errors))
{
    foreach ($errors as $error)
    {
      eval($error);
    }
}
Hoffentlich hab ich jetzt nichts vergessen ;)
 
Hi,

ich verstehe deine Frage nicht ganz.
Du sagtest doch und vom Code her passt das ja, dass das Formular nicht angezeigt wird, wenn die Bearbeitung erfolgreich war.
Dann verstehe ich nicht wie du es meinst wenn du sagst, dass du es direkt wieder bearbeiten willst... Wenn du mir das etwas klarer machen könntest, könnte ich dir evtl. auch helfen.

Viele Grüße,
BigManu
 
ok ich versuchts ;)

Ich habe zwei Kommentare.
Wenn ich kommentar 1 erfolgreich bearbeite, werden mir nach klick auf speichern wieder beide Kommentare angezeigt, inklusive des bearbeiteten Kommentars.
Wenn ich direkt jetzt nochmal auf das Bearbeitenicon von Kommentar 1 klicke passiert nichts, d.h. ich kann den Kommentar nicht nochmal bearbeiten. Erst wenn ich z.b. Kommentar 2 bearbeite und dann wieder 1 funktioniert es.

Das Problem liegt an dem Link.
Hier der Link zum Kommentar 1 bearbeiten:
"index.php?p_kat=news_detail&p_kbearb=74&p_detail=50"
Kommentar 2 hat z.b. diesen Link:
"index.php?p_kat=news_detail&p_kbearb=204&p_detail=50"

Wenn ich nun Kommentar 1 erfolgreich bearbeite steht oben in der Adressleiste immer noch "index.php?p_kat=news_detail&p_kbearb=74&p_detail=50". Und wenn ich nochmal auf bearbeiten klicke, passiert nichts, weil der Link der hinterlegt ist ja schon bereits aufgerufen ist, im Browser.
 
Ahhhhh... ;)
Danke, das war eine gute Erklärung. Ich habe zumindest verstanden wo das Problem liegt.

Meines Erachtens gibt es da jetzt zwei Lösungsansätze für:

Zum einen könnte man nach erfolgreichem aktualisieren per header("Location: index.php"); weiterleiten und hätte das Problem aus der Welt geschafft, zum anderen gibt es natürlich immer die JavaScript-Variante.

Auf Grund dessen, dass nicht unbedingt jeder JavaScript aktiviert hat, bevorzuge ich persönlich immer die PHP-Variante wenn möglich.

Hierzu würde ich einfach den Output buffern, so dass eine header-Modifizierung noch möglich ist und weiterleiten.

Hierzu kannst du dir die Funktionen ob_start(); und ob_flush(); mal anschauen.

Solltest du dich doch für die JavaScript-Variante entscheiden, weil du sagst, die Menschen die das benutzen haben eh JavaScript aktiviert oder du setzt es einfach für die korrekte Funktionalität voraus, dann würdest du nach dem erfolgreichen aktualisieren einfach per
Code:
self.locaction.href='index.php'
weiterleiten!

Viele Grüße,
BigManu
 
ne JS möchte ich nicht benutzen

und mit der Header-Funktion hab ichs schon probiert
allerdings hab ich da ein anderes Problem: meine Meldungen werden dann nicht mehr ausgegeben, in dem Fall dann, dass die Bearbeitung erfolgreich war
 
Na das sollte dann ja das kleinere Übel sein...

PHP:
header("Location: index.php?success=MELDUNG");

Oder wenn es zu lange Meldungen werden... zur Not gibt es ja noch die gute alte Session!
 
Hi,

wenn das ein Cache-Problem ist, könntest Du auch einfach einen Timestamp als zusätzlichen Parameter übergeben. Dann kannst Du Dir die Weiterleitung sparen.

LG
 
Stimmt... das wäre auch eine Möglichkeit.
Vergiss meine Variante, ich finde die von knuddel wesentlich schöner und sie ist wesentlich einfacher umzusetzen!
 
Zurück