WinFuture-Forum.de: Php Mail Innerhalb Von Sql Query - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Php Mail Innerhalb Von Sql Query


#1 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

  geschrieben 01. April 2008 - 09:55

Hallo,
ich bin gerade dabei ein Gästebuch Script zu schreiben. Das Gästebuch wird in einer MySQL-Tabelle abgelegt. Alles klappt wunderbar, blos habe ich ein Problem.
Nachdem ein neuer Eintrag geschrieben wurde, möchte ich per Mail benachrichtigt werden.

Meine PHP-Datei ist so aufgebaut:
Überprüfen, ob es sich um ein Submit handelt {
Eintrag prüfen (Antispam, Name aufgefüllt usw)
Eintrag in Datenbank speichern
Alert-Mail absenden
}

Wird immer durchgeführt:
Gästebuch aus MySQL-Tabelle laden und darstellen.

---
Es funktioniert wie gesagt alles vom feinsten, solange ich diese Zeile weglasse:
@mail ("*******", "Guestbook ".date("Y-m-d"), $alert);

Bleibt die Zeile stehen erhalte ich abwechselnd diese beiden Fehler:
"Lost connection to MySQL server during query"
"MySQL server has gone away"

Die Einträge werden allerdings trotzdem gespeichert blos die anschließende Ausgabe schlägt fehl.
Ob der Mail-Versand funktioniert habe ich noch nicht getestet, da ich es auf meinem Home-Server teste, der eine dynamische IP hat und die großen Hoster ja bekanntlich keine Mail von diesen akzeptieren.

Sollte ich den Mailversand vielleicht als Funktion schreiben und erst durchführen, nachdem die Datenbankverbindung geschlossen wurde?

Gruß, Alex

EDIT:
Also wenn ich es ganz ans Ende stelle (also so:
mysql_close($database);
@mail ("*******", "Guestbook ".date("Y-m-d"), $alert);
)
dann geht es, warum auch immer. Ist für mich aber nicht die wahre Lösung, vielleicht kann mir noch jemand sagen, wo mein Fehler liegt.

Dieser Beitrag wurde von mush bearbeitet: 01. April 2008 - 09:58

insane in the membrane
0

Anzeige



#2 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 01. April 2008 - 14:40

Kann es sein, dass $alter der SQL Query ist, und nicht ein String mit dem Text, den du haben willst?
0

#3 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 01. April 2008 - 19:01

Du meinst sicher $alert. Doch, das funktioniert alles und ist auch richtig so. Den Mail-Versand habe ich einem früheren Script von mir entnommen, den ich eigentlich in einem Kontaktformular verwendet habe.
insane in the membrane
0

#4 Mitglied ist offline   asko 

  • Gruppe: aktive Mitglieder
  • Beiträge: 144
  • Beigetreten: 17. November 02
  • Reputation: 0

geschrieben 01. April 2008 - 19:20

Poste doch mal das ganze Script und nicht nur die eine Zeile, damit man sich ein Bild vom Problem machen kann. Desweiteren ist dein mail() Befehl ungenügend, weil kein Header angegeben wird.
0

#5 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 01. April 2008 - 20:57

Beitrag anzeigenZitat (asko: 01.04.2008, 20:20)

Poste doch mal das ganze Script und nicht nur die eine Zeile, damit man sich ein Bild vom Problem machen kann. Desweiteren ist dein mail() Befehl ungenügend, weil kein Header angegeben wird.

Wenn in der php.ini ein Default Wert angegeben ist wird dieser automatisch als Header benutzt, andernfalls bekommt man sowieso einen Fehler präsentiert.
0

#6 Mitglied ist offline   asko 

  • Gruppe: aktive Mitglieder
  • Beiträge: 144
  • Beigetreten: 17. November 02
  • Reputation: 0

geschrieben 02. April 2008 - 01:30

Beitrag anzeigenZitat ([Elite-|-Killer]: 01.04.2008, 21:57)

Wenn in der php.ini ein Default Wert angegeben ist wird dieser automatisch als Header benutzt, andernfalls bekommt man sowieso einen Fehler präsentiert.


Ich vermute mal, dass mush keinen eigenen Server hat und somit auch keinen Einfluss darauf nehmen kann, was als Default eingestellt ist. Deswegen ist es quasi Pflicht einen eigenen Header anzugeben mit einem Absender (From) und nicht minderwichtig, via Header PHP als X-Mailer mitzuteilen, sonst kann man quasi eine Garantie drauf geben, dass 9 von 10 Mails nicht ankommen, da sie als Spam ausgefiltert werden.

Ein relativ kompletter Mail-Header für HTML Mails sieht etwa so aus:
//Mail-Header Beispiel
$mailheader  = "From: Max Mustermann<noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
$mailheader .= "Reply-To: Mail Daemon<noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
$mailheader .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n";
$mailheader .= "MIME-Version: 1.0\r\n";
$mailheader .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$mailheader .= "Content-Transfer-Encoding: 8bit\r\n";
$mailheader .= "Message-ID: <" .time(). "noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
$mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n";


Wobei der Reply-To auch als 5. Parameter im mail() angegeben werde kann, und sollte, sofern dies der Server unterstützt. Wird kein Reply-To unterstützt, quittiert das PHP mit einem Fehler. Details dazu finden sich in der PHP Dokumentation.
0

#7 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 02. April 2008 - 13:12

Doch, ich habe allerdings einen eigenen Server (lighttpd, php5, mysql); auch mein Hoster scheint es entsprechend konfiguriert zu haben, denn dort funktioniert exakt die selbe Zeile auch problemlos.

Ich werde gleich den ganzen Script hochladen, zuerst werde ich aber was essen ;)
insane in the membrane
0

#8 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 02. April 2008 - 15:52

Hier ist der tolle Code.
Der Code ist dermaßen unsauber, weil ich wirre Gedankengänge habe und diese dann auch so aufschreibe. Aufgeräumt wird zum Schluss. Außerdem ist das mein erster Versuch mit MySQL zu arbeiten.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title></head>
<body>
<?php
error_reporting(E_ALL);
$br = "<br />\n";
$database = @mysql_connect("localhost", "benutzername", "passwort") OR die(mysql_error());
mysql_select_db("datenbankname") OR die(mysql_error());
$apply = @$_GET['action'];
if (!isset($apply) or $apply != "submit") { echo "test<br />"; }  
if (isset($_POST['save']) and $_POST['save'] == "false") {
echo "saved.. ";

/* Soll später Spam verhindern - funktioniert nicht (wird dann noch um die Abfrage
	der IP-Adresse in Verbindung mit dem Datum erweitert,
	aber es funktioniert noch nichteinmal so)
$check = mysql_query("SELECT * FROM guestbook WHERE datetime = CURRENT_TIMESTAMP;") OR die(mysql_error());
if($row = mysql_fetch_assoc($check)) {
 echo "error";
 }
else
 {
 Alles nachfolgende
 }
*/



$name = $_POST["name"];
$content = $_POST["content"];
$showit = "0";
$ipaddress = $_SERVER['REMOTE_ADDR'];
$tempsave = "INSERT INTO guestbook (datetime, name, content, showit, ip) VALUES (CURRENT_TIMESTAMP, '$name', '$content', '$showit', '$ipaddress')";
$presave = mysql_query($tempsave) OR die(mysql_error());
$alert = "From: ".$name."\n";
$alert .= "Message:\n".$content."\n";
$alert .= "----"."\n";
$alert .= "IP: ".$ipaddress."\n";
$alert .= "\n";
$alert .= "Date: ".date("d.m.Y")."\n";
$alert .= "Time: ".date("h:i:s")."\n";
$alert .= "Application: ".$_SERVER['HTTP_USER_AGENT']."\n";
}	
	$mysql = "SELECT datetime, name, content, showit, ip FROM guestbook ORDER BY datetime DESC;";
	$result = mysql_query($mysql) OR die(mysql_error());
	if(mysql_num_rows($result)) {
		$commentcounter = 0;
		while($row = mysql_fetch_assoc($result)) {
		if ($row['showit'] == "1") {
			$commentcounter++;
			$predate = explode("-",$row["datetime"]);
			$printdate = $predate[2].".".$predate[1].".".$predate[0];
			echo $printdate." (".$row['name'].") > ".$row['content'].$br;
			}
		}
		echo "Comments: ".$commentcounter.$br;
	} else {
		echo "Empty".$br;
	}
	mysql_close($database);
	@mail ("Mail-Adresse", "Guestbook ".date("Y-m-d"), $alert);
?>
<br />
<form name="entry" method="post" action="<?php echo $_SERVER['PHP_SELF']."?action=submit" ?>" >
<input type="hidden" name="save" value="false"/>
<input name="name" type="text" size="50" maxlength="120" /><br />
<textarea name="content" id="document" cols="80" rows="28"></textarea><br />
<input type="submit" value="Save"/>
</form>
</body></html>


Hier der Aufbau der MySQL-Tabelle:
Angehängtes Bild: Image1.png

Dieser Beitrag wurde von mush bearbeitet: 02. April 2008 - 15:56

insane in the membrane
0

#9 Mitglied ist offline   bardelot 

  • Gruppe: aktive Mitglieder
  • Beiträge: 517
  • Beigetreten: 20. März 04
  • Reputation: 0

geschrieben 04. April 2008 - 16:10

Deine alert Variable wurde im If Statement definiert aber du verwendest sie ausserhalb. Was für Versionen (PHP, MySQL) verwendest du? Was gibt "SHOW VARIABLES" aus?

Dieser Beitrag wurde von bardelot bearbeitet: 04. April 2008 - 16:16

0

#10 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 04. April 2008 - 23:11

Du hast recht, was ich da jetzt mache ich totaler Schwachsinn. Es sah vorher auch anders aus, allerdings bekam ich dann - wie gesagt - diese Fehler.

Ich kenne SHOW VARIABLES nicht. Es sieht mir nach einem MySQL-Befehl aus, aber ich weiß leider nicht, wie ich ihn benutze.

So?
mysql_query(SHOW VARIABLES);

lighttpd: 1.4.18
PHP: 5.2.3
MySQL: 5.0.45

Gruß, Alex
insane in the membrane
0

#11 Mitglied ist offline   bardelot 

  • Gruppe: aktive Mitglieder
  • Beiträge: 517
  • Beigetreten: 20. März 04
  • Reputation: 0

geschrieben 06. April 2008 - 00:14

http://dev.mysql.com...-variables.html

mysql_query("SHOW variables");

Interessant wäre sicher einmal die wait_timeout
mysql_query("SHOW VARIABLES LIKE 'wait%'");
mysql_query("SHOW GLOBAL VARIABLES LIKE 'wait%");

Irgendwelche besondere Einstallungen in der my.cnf? Möglicherweise musst du im Abschnitt [mysqld] die wait_timeout ändern z.B. wait_timeout=3600
0

#12 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 06. April 2008 - 00:25

Ich glaube nicht, dass das hier richtig ist:

<?php
$database = @mysql_connect("localhost", "dggf", "gdsfgdfshhg") OR die(mysql_error());
mysql_select_db("sdfgsdfgsdfg") OR die(mysql_error());
$a = mysql_query("SHOW variables");
$b = mysql_query("SHOW VARIABLES LIKE 'wait%'");
$c = mysql_query("SHOW GLOBAL VARIABLES LIKE 'wait%");
echo $a."\n".$b."\n".$c;
mysql_close($database);
?>


Ausgegeben wird das: Resource id #2 Resource id #3
insane in the membrane
0

#13 Mitglied ist offline   mush 

  • Gruppe: aktive Mitglieder
  • Beiträge: 895
  • Beigetreten: 29. Mai 07
  • Reputation: 7

geschrieben 06. April 2008 - 13:37

*push*
insane in the membrane
0

#14 Mitglied ist offline   bardelot 

  • Gruppe: aktive Mitglieder
  • Beiträge: 517
  • Beigetreten: 20. März 04
  • Reputation: 0

geschrieben 06. April 2008 - 14:03

$query = "SHOW VARIABLES LIKE 'wait%'";
$result = mysql_query($query);
while ($row = mysql_fetch_row($result))
var_dump($row);
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0