• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Probelm mit Aktualisierung

freakXHTML

Mitglied
Hallo zusammen,
ich habe verschiedenen Buttons, an deren Namen jeweils eine ID einer Mitteilung gehängt wird. Wenn ich nun auf einen Button drücke, so soll die entsprechende Nachricht gelöscht werden. Das klappt auch soweit, doch ich muss stets zweimal auf den Button klicken, damit die Nachricht auch nicht mehr angezeigt wird. Die Buttons befinden sich in einer Tabelle, welche mit einer Schleife erstellt wird.

PHP:
//Hier werden die Arrays gefüllt, die ich in der Tabelle ausgebe
echo ' 
 <table border = "1" rules = "groups">
  <thead>
  //...
  </thead>
  <tbody>';
  for($i = 0; $i < count($subject); $i++) {
   echo '<tr>';
    echo '<td class="tablaction"><a href="'#">Lesen</a></td>';
    echo '<td class="tablsub">'.$subject[$i].'</td>';
    echo '<td class="tablsender">'.$sender[$i].'</td>';
    echo '<td class="tabldate">'.$date[$i].'</td>';
    echo '<td class="tabldel"><form action="" method="post"><input style="background-image:none;" type="submit" name="delP'.$id[$i].'"value="L&ouml;schen" /></form></td>'; //Hier entstehen die Buttons
   echo '</tr>';  
  }
   
 echo '
  </tbody>
 </table>';
 
//ABFRAGE DER BUTTONS ZUM LÖSCHEN:
 
for($i = 0; $i < count($id); $i++) //$id ist ein Array voller ids
 {
  if(isset($_POST['checkdelP'.$id[$i]]))
  {
   $rs = $logger->del_messages($id[$i]); //del_message übernimmt erfolgreich den Löschvorgang
   echo $rs;
  }
 }

Wisst ihr, warum ich immer zweimal auf den Löschenbutton klicken muss, damit die gelöschte Nachricht auch wirklich nicht mehr angezeigt wird?

Vielen Dank
lg, freakXHTML
 
Zuletzt bearbeitet:
wenn ich das richtig sehe, wird erst nach dem erneuten aufruf der nachricht gelöscht.
deswegen kann sie nach dem ersten klick noch mal angezeigt werden, aber nicht mehr nach dem zweiten
 
Hallo,
auch wenn den Löschvorgang vor das Erstellen der Tabelle stelle, erhalte ich das gleiche Phänomen.

Wenn ich auf Löschen drücke, dann wird bereits der Datensatz aus der Datenbank genommen.

Doch damit, die Seite aktualisiert wird, muss ich nochmal auf Löschen klicken bzw auf F5.

EDIT: Ich denke, ich weiß woran es liegt. Beim Auslesen wird erst die Bedingung für meinen Schleifenkopf bekannt, der für das Löschen zuständig ist (count($id)). Deswegem kann ich den Löschbefehl nicht vor das Auslesen stellen.

Könnt ihr mir weiterhelfen? Gibt es da einen Trick?

Vielen Dank
lg, freakXHTML
 
Woher holst du denn deien Datensätze? Aus einer Datenbank?
Wenn ja. Pack in deinen submit Button lieber die id des Eintrages und lass es dann löschen (Dafür wird keine Schleife benötigt)
Und dann lässt du das ganze auslesen.

Wenns ne Datei ist:
Auslesen, löschen, neu schreiben, neu auslesen, ausgeben :D
 
ne elegante lösung (edit: wie die von Gilles :) ) fällt mir gerade nicht ein ohne das script vollkommen umzuschreiben, aber was hältst du von einer variablen, die vor dem aufruf der tabelle prüft, ob gerade was gelöscht wurde und wenn ja, statt der tabelle eine erfolgsmeldung anzeigt, respektive per Header:location dies Seite kurz aktualisiert?
 
Ich weiß nicht, ob der Vorschlag von Gilles funktioniert. Ich brauche nämlich unbedingt eine Schleife. Es werden alle Mitteilungen, die man von Benutzern erhalten hat, aufgelistet. Da man im Voraus nicht weiß, wie viele das sind, hänge ich ja bereits an den Namen des Buttons die ID dran. Dann frage ich jeden Button ab, ob er gedrückt worden ist. Dafür braucht man eine Schleife. Oder verstehe ich dich falsch?

Ich habe versucht einfach in einer static Variablen zu zählen, wieviele Mitteilungen vorhanden sind und diese dann in den Schleifenkopf meiner for Schleife zu stecken. Das funktioniert aber irgendwie nicht, weil die static Variabel wider Erwarten 0 wird.

Und ja, ich hole die Datensätze aus einer Datenbank. Das übernimmt jedoch eine Klasse für mich, deren Instanz $logger heißt.

PHP:
<?php if($logger->get_pmn('all') <= 0) echo '<h4 style="color:red;">Du hast noch keine Nachrichten erhalten.</h4>'; 
else {
 static $cn = 0; 
 for($i = 0; $i < $cn; $i++) //$cn bleibt 0
 { 
  if(isset($_POST['delP'.$id[$i]])) //DAS ARRAY ID WIRD ERST UNTEN ERSTELLT
  {
   $rs = $logger->del_messages($id[$i]); //LÖSCHVORGANG. ABFRAGE DER BUTTONS
   echo $rs;
  }
 } 
 $res = $logger->get_messages('overview'); //Hier werden die Daten ausgelesen und in eindimensionalen Arrays gespeichert.
 foreach($res['ID'] as $value)
  $id[] = $value;
 foreach($res['Betreff'] as $value)
  $subject[] = $value;
 foreach($res['Absender'] as $value)
  $sender[] = $value;
 foreach($res['Sendedatum'] as $value)
  $date[] = $value;
 foreach($res['gelesen'] as $value)
  $read[] = $value;
 
 
 echo ' 
 <table rules = "groups">
  <thead>
//...
  </thead>
  <tbody>';
  for($i = 0; $i < count($subject); $i++) { 
 
   $cn++; //HIER WIRD CN INKREMENTIERT. Oben ist es aber wieder 0
 
   echo '<tr '; if($read[$i] == 0) echo 'style="background-color:#e7e5fc;">'; else echo '>';
    echo '<td class="tablaction"><a href="readmessage.php?profil=readm&messageid='.$id[$i].'">Lesen</a></td>';
    echo '<td class="tablsub">'.$subject[$i].'</td>';
    echo '<td class="tablsender">'.$sender[$i].'</td>';
    echo '<td class="tabldate">'.$date[$i].'</td>';
    echo '<td class="tabldel"><form action="" method="post"><input style="background-image:none;" type="submit" name="delP'.$id[$i].'"value="L&ouml;schen" /></form></td>';
   echo '</tr>';  
  }
 
 echo '
  </tbody>
 </table>'; 
echo $cn; 
}?>
 
Geschafft!

Ich habe zwar etwas gemogelt, aber es funktioniert perfekt. Ich habe den Löschvorgang um eine Zeile modifiert.

PHP:
for($i = 0; $i < count($id); $i++)
 {
  if(isset($_POST['delP'.$id[$i]]))
  {
   $rs = $logger->del_messages($id[$i]);
   header("Location: getpm.php"); //Hier kommt der vollständige Link rein. So wird die Seite aktualisiert
  }
 }

Aber die Lösung ohne Schleife hätte ich gerne von Gilles nochmal erklärt. Ich bin davon überzeugt, dass eine Schleife notwendig ist ;).

Vielen Dank
lg, freakXHTML
 
Zurück
Oben