Aktualität

Alles rund um PHP und die Datenbanksprache MySQL.

Moderatoren: Thies, Soltano

Antworten
Chriha
Newbie
Newbie
Beiträge: 23
Registriert: So 27 Mär, 2005 12:51 pm
Wohnort: Ruhpolding

Aktualität

Beitrag von Chriha »

Tacho,
hab da schon wieder ein Problem. Und zwar mit der Aktualität von Daten. Ein Beispiel:

Ich hab mir ein schönes PN - System gebastelt, klappt auch alles wunderbar. Jetz hab ich eine Seite, wo alle Nachrichten (die man erhalten hat) aufgelistet werden. Wenn ich aber jetzt eine Nachricht löschen möchte, löscht sie die zwar, aber ich muss dann die Seite wieder aktualisieren, damit diese Nachricht nicht mehr angezeigt wird. Ich hoffe Du verstehst was ich meine ... hier mal meine Dateien
mm.php
[php]session_start();

// Header und Template uncluden
include ("includes/header.php");
include_once "includes/class_ktemplate.inc.php";

// Instanz für das Template erstellen
$t = new KTemplate("templates/mm.html");

$mm_sql = mysql_query("SELECT id, von_name, zu_name, timestamp, nachricht, betreff, gelesen, geloescht
FROM mm
WHERE geloescht = '0' AND zu_name = '$username'
ORDER BY timestamp DESC")
or die (mysql_error());

$t_mms = $t->fetchBlock("mms");
while ($mms = mysql_fetch_array($mm_sql))
{
$t_mms->assign("von_name",$mms['von_name']);
$mmsid = $mms['id'];
$mmsbetreff = $mms['betreff'];
$betreff = "<a href=\"mmread.php?id=$mmsid\">$mmsbetreff</a>";
$t_mms->assign("betreff",$betreff);
$t_mms->assign("zeit",$mms['timestamp']);
if($mms['gelesen'] == 0)
{
$gelesen = 'Nein';
}
else
{
$gelesen = 'Ja';
}
$t_mms->assign("gelesen",$gelesen);
$t_mms->assign("checkid",$mms['id']);
$t -> assign("mms",$t_mms);
$t_mms->reset();
}

if(isset($_POST['loeschen']))
{
$up_del = mysql_query("UPDATE mm
SET geloescht = '1'
WHERE id = '$mmsid'")
or die (mysql_error());
}

// Template ausgeben
$t -> out();

// Footer includen
include ("includes/footer.php");[/php]
und hier das Template mm.html

Code: Alles auswählen

<table width="100%" align="left">
  <tr>
    <td width="84%" align="left" valign="top" bgcolor="#C4C4FF"><span class="style11"></span>
      <br>
      <table width="80%" border="0" align="center" cellpadding="0">
        <tr bgcolor="#9797FF" class="style2">
          <td width="294" class="style2"><div align="center">MobileMessaging - System </div></td>
        </tr>
        <tr bgcolor="#B7B7FF" class="style1">
          <td class="style2"><div align="center"><br>
		      <a href="mmwrite.php">Neue Nachricht schreiben</a></div>
            <br>
			<center>
      <form name="delete_mm" method="post" action="mm.php">
<table width="90%"  border="0">
  <tr>
    <td width="18%"><div align="center">Von</div></td>
    <td width="35%"><div align="center">Betreff</div></td>
    <td width="20%"><div align="center">Zeit</div></td>
    <td width="11%"><div align="center">Gelesen</div></td>
    <td width="16%"><div align="center">Löschen</div></td>
  </tr>
  <!-- BEGIN mms -->
  <tr>
    <td><div align="center">{von_name}</div></td>
    <td><div align="center">{betreff}</div></td>
    <td><div align="center">{zeit}</div></td>
    <td><div align="center">{gelesen}</div></td>
    <td><div align="center"><input type="checkbox" name="{checkid}" value="checkbox"></div></td>
  </tr>
  <!-- END mms -->
  <tr>
    <td> </td>
    <td><div align="center"></div></td>
    <td> </td>
    <td> </td>
    <td> </td>
  </tr>
  <tr>
    <td> </td>
    <td><div align="center"></div></td>
    <td> </td>
    <td> </td>
    <td><div align="center">
      <input name="loeschen" type="submit" id="loeschen" value="Löschen">
    </div></td>
  </tr>
</table>
      </form>
<br>

			</center>
		  </td>
        </tr>
      </table>
      <br>      </td>
  </tr>
</table>
Es wäre also toll, wenn die Nachricht sofort ausgeblendet wird, nachdem ich sie über den Button gelöscht habe. Das wird aber nicht gemacht ...

Achja, ich kann auch leider immer nur eine Nachricht löschen.
Wär super, wenn Du mir da wieder helfen könntest.
Benutzeravatar
Thies
Webmaster
Webmaster
Beiträge: 1482
Registriert: Mo 04 Aug, 2003 8:45 pm
Kontaktdaten:

Beitrag von Thies »

Sorry Chriha,

ich habe den Thread erst heute gesehen, der war mir leider irgendwie "durchgerutscht". Das mit dem Problem der Aktualisierung läßt sich ganz easy lösen:

Der Part

Code: Alles auswählen

if(isset($_POST['loeschen'])) 
    { 
        $up_del = mysql_query("UPDATE mm 
                               SET geloescht = '1' 
                               WHERE id = '$mmsid'") 
                               or die (mysql_error()); 
    } 
muss vor der MySQL-Abfrage der Daten kommen, also vor

Code: Alles auswählen

$mm_sql = mysql_query("SELECT id, von_name, zu_name, timestamp, nachricht, betreff, gelesen, geloescht 
                       FROM mm 
                       WHERE geloescht = '0' AND zu_name = '$username' 
                       ORDER BY timestamp DESC") 
                       or die (mysql_error()); 
Dann wird erst gelöscht, dann die Daten ausgelesen.

Mehrere Nachrichten zu löschen geht auch, ist aber umfangreicher. Dazu musst Du eine checkbox ergänzen, die man anklicken kann und in der jeweils die id des Datensatzes hinterlegt ist. Also z.B.:

Code: Alles auswählen

<input type="checkbox" name="delete[]" value="XXX" />
wobei bei XXX die id eingetragen wird (also z.B. per echo $mms['id']; )

Dann musst Du diese id's löschen, indem Du die einzelnen Daten im Array umwandelst in einen String:

id1, id2, id3, .......

Und diese dann per

DELETE .... WHERE id IN <string>

löschst.

Ich hoffe, du kannst mit dieser "Kurzanleitung" etwas anfangen, wenn nicht, melde Dich nochmal.

CU

Frank-Andre
if ( $ahnung == 'keine' ) { use ( Suche ) }
if ( $antwort == 0 ) { post ( $frage ) }
Chriha
Newbie
Newbie
Beiträge: 23
Registriert: So 27 Mär, 2005 12:51 pm
Wohnort: Ruhpolding

Beitrag von Chriha »

So, jetz hab ich mal wieder Zeit gehabt, was zu machen. Nochmal Danke für Deine Hilfe, find ich echt klasse von Dir!!! ;)
Auf den ersten Teil hätte ich auch selbst drauf kommen müssen :roll2:
Den 2. Teil (mehrere Nachrichten löschen) hab ich jetz mit einer foreach-Schleife gemacht. Auch mit dem Input, was Du mir aufgeschrieben hast. Schaut also so aus:

Code: Alles auswählen

<input type="checkbox" name="delete[]" value="{checkid}">
[php]// Nachricht(en) löschen
if(isset($_POST['loeschen']))
{
foreach ($_REQUEST['delete'] as $k => $v)
{
mysql_query("DELETE FROM mm
WHERE id = '$v'")
or die(mysql_error());
}
}[/php]
Is das so in Ordnung oder gibt es da eine bessere Lösung? Funktionieren tuts jedenfalls :)
Benutzeravatar
Thies
Webmaster
Webmaster
Beiträge: 1482
Registriert: Mo 04 Aug, 2003 8:45 pm
Kontaktdaten:

Beitrag von Thies »

Hi,

es freut mich, dass ich helfen konnte.

Deine Lösung klappt natürlich, ist aber nicht die "optimalste" Lösung, da sie unter Umständen den MySQL-Server bei vielen Löschungen unnötig belastet. Wenn Du 20 Nachrichten löschst, werden auch 20 Anfragen an den MySQL-Server geschickt.

Ich habe bei mir die Variable nicht delete[] sondern $mark_list genannt. Nun übertrage ich das Array folgendermassen:

Code: Alles auswählen

$delete_sql_id = '';
for ($i = 0; $i < sizeof($mark_list); $i++)
	{
	$delete_sql_id .= (($delete_sql_id != '') ? ', ' : '') . intval($mark_list[$i]);
	}
Dadurch bekomme ich eine Liste der ID, die so aussieht:

1,3,6,7,11,15,16

Und die lösche ich in einem Abruf mit

Code: Alles auswählen

$delete_sql = "DELETE FROM " . PM_TABLE . " WHERE pm_id IN (" . $delete_sql_id . ")";
Spart etwas Abarbeitungszeit.

Verstanden, was ich meine?

CU

Frank-Andre
if ( $ahnung == 'keine' ) { use ( Suche ) }
if ( $antwort == 0 ) { post ( $frage ) }
Chriha
Newbie
Newbie
Beiträge: 23
Registriert: So 27 Mär, 2005 12:51 pm
Wohnort: Ruhpolding

Beitrag von Chriha »

Alles klar! Funktioniert :D
Antworten