PHP MYSQL Abfrage Ergebnise per E-Mail verschicken

Wolly300

Lieutenant
Registriert
Mai 2014
Beiträge
514
Hallo Community,

ich habe auf meinem Webserver eine MySQL Tabelle liegen. Habe jetzt ein paar Zeilen geschrieben, die einfach den Inhalt der Tabelle wiedergeben. Wie muss ich jetzt weitermachen, damit alle Zeilen/Positionen der Datenbank in eine Variable (Array???) geschrieben werden, damit ich alle Ergebnise in eine E-Mail reinpacken kann ?

Hier mal der bisherige Code, der nicht geht.

PHP:
$Betreff = "Auswertung";
$Inhalt = "Das ist der Inhalt der Datenbank!<br/>";
$pdo = new PDO("mysql:host=$host; dbname=$db", $db_user, $pass);

    try
    	{
    		$sql = "SELECT * FROM Statistik ORDER BY id";
        
    		foreach ($pdo->query($sql) as $zeile) 
    		{
			    $Inhalt .= $zeile;
			    $Inhalt .= "<br/>";
    		}
    	}
    		catch (PDOException $e) 
    	{
			echo 'Fehler: ' . htmlspecialchars($e->getMessage());
		}
		
        echo "Inhalt:<br/>";
        echo $Inhalt;

Wie bekomme ich das Blöde Ergbins in eine Variable.

Danke für eure Hilfe.
 
Zuletzt bearbeitet:
Was genau geht an dem Code denn nicht? Funktioniert die Abfrage an sich? Also der PDO-Teil?

Ansonsten könntest du einfach sowas machen (ohne Gewähr, dass das PDO funktioniert, habe damit schon eine Weile nicht mehr gearbeitet):

PHP:
$Betreff = "Auswertung";
$Inhalt = "Das ist der Inhalt der Datenbank!\nInhalt:\n";
$pdo = new PDO("mysql:host=$host; dbname=$db", $db_user, $pass);
$ergebnis = array();
 
    try
    	{
    		$sql = "SELECT * FROM Statistik ORDER BY id";
        
    		foreach ($pdo->query($sql) as $zeile) 
    		{
			    $ergebnis[] = $zeile;
    		}
    	}
    		catch (PDOException $e) 
    	{
			echo 'Fehler: ' . htmlspecialchars($e->getMessage());
		}

mail('empfang@example.com', $Betreff, $Inhalt . print_r($ergebnis, 1));

Die Zeilen werden auf ein Array gepackt und dann per print_r ausgegeben. Das was du machst wäre eine Array-to-String-Conversion und funktioniert nicht so richtig. Du kannst ja nicht einfach ein Array auf einen String packen. "print_r" wandelt das Array in einen richtigen String um, der dann verschickt werden kann.
 
PDO::query liefert ein Statement Object (bzw. Array) zurück, das kannst du nich einfach an einen string pappen.

Du musst dann schon die einzelnen Spalten referenzieren, siehe dafür Beispiel #1 in der PHP Dokumentation.

PS: Soweit ich weiß wirft PDO keine Exception wenn query fehlschlägt, daher ist auch der try-catch-Block nicht unbedingt nötig. Sinnvoller wäre es auf false oder nicht zu prüfen, da es standardmäßig FALSE zurückgibt wenn es fehlschlägt.
 
Zuletzt bearbeitet:
Mihawk90 schrieb:
PS: Soweit ich weiß wirft PDO keine Exception wenn query fehlschlägt

Du hast die Dokumentation doch verlinkt: Gibt bei Fehler false zurück. Dann kommst du aber zum nächsten Problem, dann ein foreach kann kein boolean als Parameter übergeben bekommen und dann crasht es an der Stelle.

Grundsätzlich muss man aber hier wieder auf Sicherheitsprobleme hinweisen:
Der Verbindungsaufbau zur Datenbank sollte in jedem Fall in einem try-catch-Block stehen. Machst du das nicht, können die Zugangsdaten - je nach PHP-Konfiguration - nach außen geleakt werden.
Fehlermeldungen (PDOException) würde ich auch nicht einfach ausgeben, sondern intern loggen.
Die mail-Funktion von PHP sollte man auch mit äußerster Vorsicht verwenden. Da kann viel schief gehen. Besser wäre es, ein Framework wie PHPMailer oder SwiftMailer etc. zu verwenden.
 
Nase schrieb:
Du hast die Dokumentation doch verlinkt: Gibt bei Fehler false zurück. Dann kommst du aber zum nächsten Problem, dann ein foreach kann kein boolean als Parameter übergeben bekommen und dann crasht es an der Stelle.

Stimmt auch wieder, klar :) Denkfehler.
 
Danke für eure Antwort. Also das Problem ist, das die Ergebnisse des foreach in keine Variable geschrieben werden. Außerdem wird zum Mail Versenden PHPMailer schon verwendet.

Aktuell sieht es so aus:

PHP:
$pdo = new PDO("mysql:host=$host; dbname=$db", $db_user, $pass);

    try
    	{
    		$sql = "SELECT * FROM Statistik ORDER BY id";
        
    		foreach ($pdo->query($sql) as $zeile) 
    		{
                $ergebnis[] = $zeile;
    		}
    	}
    		catch (PDOException $e) 
    	{
			echo 'Fehler: ' . htmlspecialchars($e->getMessage());
		}
		
$Betreff = "Auswertung";
        echo "Inhalt:<br/>";
        echo $ergebnis;

Das kommt dann als Ergebnis:

Bild1.PNG

Bild2.PNG
 

Anhänge

  • Bild2.PNG
    Bild2.PNG
    14,8 KB · Aufrufe: 605
Zuletzt bearbeitet:
  1. du hast $ergebnis gar nicht initialisiert
  2. "echo $ergebnis" kann nicht klappen, habe ich dir oben schon erklärt
  3. Lies doch mal die Fehlermeldungen durch und behebe diese Fehler. Dort steht, dass dein foreach kein geeignetes Array etc. bekommt. Also gibt es ein Problem mit deinem PDO

Deine "Ergebnisse des foreach" werden also nicht "auf keine Variable geschrieben", sondern du hast gar kein verwertbares Ergebnis. Steht alles in den Fehlermeldungen.
 
Zuletzt bearbeitet:
Und nochmal ein kleiner Tipp: Entwickle nicht auf einem Produktivsystem, das im Internet hängt und poste dann auch noch die URLs zu deinen Scripts ... :rolleyes:
 
Das ist mir in dem Falle egal, weil es 1. eh nicht geht und 2. da nur Testsachen drauf sind die jeder gerne lesen darf.
 
Zurück
Oben