Autor Zpráva
Adrián Prelovský
Profil
Ahoj mám tento kód pro odesílání emailu:
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf8">
</head>
<body>
<?php
$conn = mysql_connect("localhost","andre97","bffb@andre");
mysql_query("SET NAMES 'utf8'");
mysql_select_db('wppokus', $conn);
if (!$conn)
  {
  die('Nemohu se pripojit k db: ' . mysql_error());
  }
mysql_select_db("cis_id", $conn);
$sql="INSERT INTO `wp_generator` (`jmeno`, `email`, `sleva`)
VALUES
('$_POST[jmeno]','$_POST[email]','$_POST[sleva]')";

if (!mysql_query($sql,$conn))
  {
  die('Chyba: ' . mysql_error());
  }
echo '<b>';
echo 'Byl vám odeslán e-mail'. " $random_chars";
echo '</b>';
?>
 
 <?php
 
$prijemca = "email";
$jmeno = $_POST['jmeno'];
$sleva = $_POST['sleva'];
$predmet = "Suns nábytek - SLEVOVÝ KUPON 10%!!";
 
 
if ($jmeno && $sleva && $prijemca){
 
  if (mail($prijemca, "$predmet $jmeno",
           "Dobrý den $jmeno, /n na základě vypnění slevového formuláře jsme Vám odeslali slevový kupon. /n Slevový kupón můžete uplatnit v naší prodejně. /n
           Kód Vašeho slevového kupónu je: $sleva" )) 
      echo "<script>alert('DOPLNIT!')</script>";
}
 

 
elseif (($jmeno && $sleva && $prijemca) == false){
 
echo "Váš <b>email nebyl odeslaný</b>.";
 
}
 
?>
 
</body>
</html>

Po odeslání formuláře se zapíše do DB, ale email se neodešle i přesto, že se mi vypíše, že email byl odeslán.
Předem mnohokrát děkuji.
lionel messi
Profil
Adrián Prelovský:
Kód trpí niekoľkými chybami:

• Konštrukcia or die() patrí maximálne na produkčný testovací server, na ostrom (= produkčnom) serveri je jej použitie nevhodné.

• Rozšírenie MySQL je zastarané a v novej verzii PHP bude odstránené, lepšie je použiť MySQLi (prípadne PDO/dibi…).

• Užívateľský vstup pri vkladaní do databázy vždy escapuj. V tomto stave je db nechránená pred SQL Injection. Skús zadať meno Sarah O'Connor.

• Hlášku o úspešnom odoslaní mailu vypisuješ vždy bez ohľadu na to, či bola správa skutočne odoslaná.

• Premenná $random_chars nie je (prinajmenšom v uvedenom úryvku) definovaná.

• Jednoduchá funkcia mail často nestačí.

• Zmysel riadku 41 mi unikol.

• Riadky 30-50 by som rozhodne prepísal:

if (isset($_POST['jmeno'], $_POST['sleva'])) {
$prijemca = "email"; //nezmyselný tvar e-mailu
$jmeno = $_POST['jmeno'];
$sleva = $_POST['sleva'];
$predmet = "Suns nábytek - SLEVOVÝ KUPON 10%!!";
}

 
 
if (isset($prijemca, $jmeno, $sleva, $predmet)){
 
   $zprava = "Dobrý den $jmeno, /n na základě vypnění slevového formuláře jsme Vám odeslali slevový kupon. /n Slevový kupón můžete uplatnit v naší prodejně. /n
           Kód Vašeho slevového kupónu je: $sleva";
    if (mail($prijemca, "$predmet $jmeno", $zprava)) {
      echo "<script>alert('DOPLNIT!')</script>";
      echo "Váš e-mail by úspěšně odeslaný."
      }
}
 
 
 
else {
 
  echo "Váš <b>email nebyl odeslaný</b>.";
 
}

Zapracované pripomienky z [#3], ďakujem za dôležitú korekciu.
Alphard
Profil
lionel messi:
• Konštrukcia or die() patrí maximálne na produkčný server, na ostrom serveri je jej použitie nevhodné.
Doufám, že jde jen o překlep a myšlen je testovací/debug server.

Riadky 30-50 by som rozhodne prepísal:
Ani takhle není optimální ošetření vstupních dat. Pokud příslušné položky v $_POST neexistují, bude se generovat Notice na řádcích 2 a 3, do proměnných se uloží NULL a na jejím základě vrátí isset false. Sice to funguje, ale přistoupili jsme k neexistující proměnné. isset by se mělo aplikovat přímo na vstupní pole, až pak si v případě potřeby tvořit kopie.

Blok po if nemáš v {}, takže se jako podmíněný bere jen řádek 13, tj. 14. se vypíše bez ohledu na úspěšnost funkce mail.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: