Letzten 10 Einträge aus der DB per Mail verschicken

olguil

Mitglied
Hallo,

ich probiere seit ca. 2 Tagen folgendes:

Ich möchte aus der MySql-Datenbank die letzten 10 Einträge auslesen und mit dem mail ( - Befehl diese Einträge an mich versenden, sodass ich auf dem Laufenden bin, was sich dort getan hat.

Mein bisheriges Chaos sieht so aus:
PHP:
// hier steht die Datenbankverbindung
 
$result = mysql_query("SELECT id,titel,datum,klicks FROM $tabelle ORDER BY `datum` ASC LIMIT 10")or die (mysql_error());
 
while ($daten = mysql_fetch_array($result)){ 
 
  mail ("meine@email.de","	 
Wochenübersicht über die letzten 10 Einträge auf www.... <BR><BR>

Hier die letzten 10 Einträge:
<table align=center border=0 cellspacing=0 cellpadding=2> 
	 <tr><td></td><td></td><td></td><td></td><td></td></tr> 
 
	  <tr><td align=left>$daten[id]</td><td align=left>$daten[titel]</td><td> </td><td align=left>$daten[datum]</td><td align=left>$daten[klicks]</td>
	  
   
</table>
  ", "From: meine@email.de>"	  
  
	  
	   );
  
echo "mail weg";

Nun ist das Ergebnis, leider, dass ich 10 Mails erhalte. Ich möchte jedoch nur eine mit den 10 letzten Einträgen.

Weiss im Moment echt nicht weiter.

Gruss Oliver
 
Ist schon klar warum 10 Mails kommen. Die Mail-Funktion mail() hast du in die while-Schleife geschrieben, sie wird also 10 mal aufgerufen ;-)

Baue dir in der while-Schleife einen Text in eine String-Variable zusammen und rufe die Mail-Funktion erst nach der Schleife auf. Dann klappt's auch mit einer Mail.

Gruß

Marian
 
PHP:
// hier steht die Datenbankverbindung

$result = mysql_query("SELECT id,titel,datum,klicks FROM $tabelle ORDER BY `datum` ASC LIMIT 10")or die (mysql_error());

while ($daten = mysql_fetch_array($result))
    $eintraege[] = $daten;

$content = "    
Wochenübersicht über die letzten 10 Einträge auf www.... <BR><BR>

Hier die letzten 10 Einträge:
<table align=center border=0 cellspacing=0 cellpadding=2>
     <tr><td></td><td></td><td></td><td></td><td></td></tr>
";
for($i=0;$i<10;$i++) {
      $content .='<tr><td align=left>'.$eintraege[$i]['id'].'</td><td align=left>'.$eintraege[$i]['titel'].'</td><td> </td><td align=left>'.$eintraege[$i]['datum'].'</td><td align=left>'.$eintraege[$i]['klicks'].'</td></tr>';
}

$content .= '   
</table>
  ';


  mail ("meine@email.de",$content, "From: meine@email.de>");
  
echo "mail weg";
 
Zuletzt bearbeitet:
Hallo,


vielen Dank funktioniert super, man ich war schon echt frustriert.

Nochmals die Zusammenfassung:

PHP:
$result = mysql_query("SELECT id,titel,datum,klicks FROM $tabelle ORDER BY `datum` ASC LIMIT 10")or die (mysql_error());
 

 
while ($daten = mysql_fetch_array($result)) 
	$eintraege[] = $daten; 
$content = "	 
Wochenübersicht über die letzten 10 Einträge auf www.... <BR><BR> 
Hier die letzten 10 Einträge: 
<table align=center border=0 cellspacing=0 cellpadding=2> 
	 <tr><td></td><td></td><td></td><td></td><td></td></tr> 
"; 
for($i=0;$i<10;$i++) { 
	  $content .='<tr><td align=left>'.$eintraege[$i]['id'].'</td><td align=left>'.$eintraege[$i]['titel'].'</td><td> </td><td align=left>'.$eintraege[$i]['datum'].'</td><td align=left>'.$eintraege[$i]['klicks'].'</td></tr>'; 
} 
$content .= '	
</table> 
  '; 

  mail ("meine@email.de",$content, "From: meine@email.de>"); 
   
echo "mail weg "; 
  
  
?>
 
Es könnte auch wie folgt aufgebaut und optimiert werden:
PHP:
<?php

	$query = "
		SELECT
		        `id`,
		        `titel`,
		        `datum`,
		        `klicks`
		  FROM
		        `".$tabelle."`
		  ORDER BY
		        `datum` ASC
		  LIMIT
		        10
		";
	$result = mysql_query($query) or die(mysql_error());

	$content = '<table>';
	while( $row = mysql_fetch_array($result, MYSQL_ASSOC) ) {
		$content .= sprintf(
			'<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
				$row['id'],
				htmlspecialchars($row['titel']),
				htmlspecialchars($row['datum']),
				htmlspecialchars($row['klicks'])
		);
	}
	$content .= '</table>';

	mail('user@example.net', $content, 'From: sender@example.net');

?>
 
Hallo,


auch eine elegante Lösung, aber in der Mail erscheint der HTML-Code dazu.

Meine Frage kann ich das unterbinden, da es eine Textmail sein soll?

Nicht hauen.

Gruss Oliver
 
Du kannst den Inhalt als HTML deklarieren. Dazu musst du dem Header-Parameter der mail()-Funktion einfach das „Content-Type“-Header-Feld anfügen:
PHP:
<?php

	…

	mail('user@example.net', $content, "From: sender@example.net\r\nContent-Type: text/html");

?>
 
olguil hat gesagt.:
aber in der Mail erscheint der HTML-Code dazu.

Wenn HTML drin ist, wird es auch so angezeigt, es sei denn, du deklarierst es als HTML-Mail (wie Gumbo richtig bemerkt hat). Das ist allerdings nicht unbedingt die beste Idee, weil HTML-Mails bei vielen Leuten recht unbeliebt sind und sehr oft automatisch im Spamfilter landen.

Meine Frage kann ich das unterbinden, da es eine Textmail sein soll?

Wenn es nur eine Textmail sein soll, darfst du nur Text reinschreiben ;-)

Ganz im Ernst: In einer normalen Textmail hast du nicht viel Möglichkeiten um den Text zu formatieren. Du kannst die Daten entweder mit Tabulator ("\t") trennen, oder einfach Leerzeichen dazwischen schreiben. Meistens werden die Daten dann aber nicht sauber untereinander dargestellt.

Die einzige sichere Methode: Mit genau abgezählten Leerzeichen formatieren (z.B. mit der Funktion printf) und in der Mail darauf hinweisen, dass die Daten nur mit einer Schrift mit fester Schriftbreite (z.B. Courier) sauber dargestellt werden.


Gewalt ist auch keine Lösung, wir helfen da lieber ;-)

Gruß

Marian
 
Zurück