Autor Zpráva
sidlo
Profil
Ano vím, stokrát opakované téma, ale ani po třech dnech, co jsem přečetl všechny diskuze a FAQ na toho téma, se mi stále nepodařilo to zprovoznit. Můžete mi s tím prosím vás pomoct? Předem díky
Je to rezervační formulář do restaurace - jeden mail restauraci a jeden zákazníkovi
Vymazal jsem z toho všechny pokusy (např. function autoUTF z FAQ)
<?php

header("Content-Type: text/html; charset=UTF-8");

if(!$_POST) exit;
 
		$name     = $_POST['name'];
        $email    = $_POST['email'];
        $phone   = $_POST['phone'];
        $comments = $_POST['comments'];
        $date     = $_POST['date'];
        $time1     = $_POST['time1'];
        $time2     = $_POST['time2'];
        $person     = $_POST['person'];

		if(trim($name) == '') {
        	echo '<div class="error_message">You must enter your name.</div>';
			exit();
        } 
	//TADY JSOU DALŠÍ NEPODSTATNÝ HLÁŠKY PO OVĚŘENÍ OBSAHU	 

		
        if($error == '') {
        
			if(get_magic_quotes_gpc()) {
            	$comments = stripslashes($comments);
            }

          $address = "skvor.jan@gmail.com";
                                         
         $subject = 'Rezervace od ' . $name . '';
         $customer_subject = 'Vaše rezervace';

  
					
		 $body = "Vaše rezervace byla odeslána s těmito údaji\r\n\nJméno: $name \r\nEmail: $email \r\nTelefon: $phone \r\nDatum: $date \r\nČas: $time1 - $time2 \r\nPočet osob: $person \r\n Komentář: $comments";
		 
     $customer_body = "Vaše rezervace byla odeslána s těmito údaji\r\n\nJméno: $name \r\nEmail: $email\r\nTelefon: $phone \r\nDatum: $date \r\nČas: $time1 - $time2 \r\nPočet osob: $person \r\n Komentář: $comments";
	
	 
					
         $msg = $body;

         $headers = "From: $email\r\n";
         $headers = "Reply-To: $email\r\n";
         $headers = "Return-Path: $email\r\n";
         $headers .= "Content-Type: text/html; charset=utf-8";

         $customer_msg = $customer_body;
              

         if((mail($address, $subject, $msg, $headers)) && (mail($email, $customer_subject, $customer_msg, $headers))) {

                   
		
		 echo "<fieldset>";			
		 echo "<div id='success_page'>";
		 echo "<h3>Reservation Sent Successfully.</h3>";
		 echo "<p>Thank you <strong>$name</strong>, if there is some problem, we will get back to you as soon as possible.</p>";
		 echo "</div>";
		 echo "</fieldset>";
		 		 
		 } else {
		 
		 echo '<div class="error_message">ERROR! Try it later or use phone.</div>';
		 
		 }
                      
	}


function isEmail($email) { 
return(preg_match("/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i",$email));
		
}
//A TADY NEPODSTATNÝ OVĚŘOVACÍ FCE

?>
Radek Cvek
Profil
Schválně jsem se díval do FAQ a ta hlavička mailu ($headers) tam vypadá úplně jinak - zkuste to přesně podle tohoto.
Davex
Profil
Asi by bylo dobré, zopakovat si základy PHP a spojování řetězců. Pro konec řádku v hlavičce by bylo dobré použít konstantu PHP_EOL a přidat ho i na poslední řádek.

$headers = "From: $email" . PHP_EOL;
$headers .= "Reply-To: $email" . PHP_EOL;
$headers .= "Return-Path: $email" . PHP_EOL;
$headers .= "Content-Type: text/html; charset=\"utf-8\"" . PHP_EOL;

Dále by tam neměla chybět verze MIME a někdy pomůže i definovat způsob kódování dat.

$headers .= "MIME-Version: 1.0" . PHP_EOL . "Content-Transfer-Encoding: 8bit" . PHP_EOL;

Co prosím není v PHP FAQ srozumitelné? Můžeme to upřesnit.
sidlo
Profil
Díky za upozornění na PHP_EOL. Ale to pořád nevyřešilo můj problém..
Nejde o to, že by to bylo vysvětlené v php faq nesrozumitelně, ale to řešení, které tam je popsané, mi stejně nefunguje.
Alphard_
Profil *
[#4] sidlo
Řešení uvedené v FAQ obyvkle funguje. Nevylučuji, že je u vás něco nestandardního, ale není to pravděpodobné.
Dejte sem ukázku upravenou přesně podle FAQ, jestli to nepůjde, zkusím najít chybu.
sidlo
Profil
Tak tady je celý kód, předem díky za tvůj čas.
<?php

header("Content-Type: text/html; charset=UTF-8");

if(!$_POST) exit;
 
		$name     = $_POST['name'];
        $email    = $_POST['email'];
        $phone   = $_POST['phone'];
        $comments = $_POST['comments'];
        $date     = $_POST['date'];
        $time1     = $_POST['time1'];
        $time2     = $_POST['time2'];
        $person     = $_POST['person'];

		if(trim($name) == '') {
        	echo '<div class="error_message">You must enter your name.</div>';
			exit();
        } else if(trim($email) == '') {
        	echo '<div class="error_message">Please enter a valid email address.</div>';
			exit();
	    } else if(trim($phone) == '') {
        	echo '<div class="error_message">Please enter a valid phone number.</div>';
			exit();
		} else if(!isName($name)) {
        	echo '<div class="error_message">Your name can contain only letters.</div>';
			exit();
		      } else if(!isEmail($email)) {
        	echo '<div class="error_message">Please enter an valid e-mail address.<br /><strong>E.g. info@nasikmeplose.cz</strong></div>';
			exit();
        } else if(!is_numeric($phone)) {
        	echo '<div class="error_message">Phone number can only contain digits.</div>';
			exit();
        }  else if(!isDate($date)) {
        	echo '<div class="error_message">Please enter a valid date.<br /><strong>E.g. 25.3.2011</strong></div>';
			exit();
		      }
		      else if(!isTime1($time1)) {
        	echo '<div class="error_message">Please enter a valid time.<br />It must be in half an hour intervals. <strong>E.g. 15:00, 15:30, 16:00..</strong></div>';
			exit();
		      } else if(!isTime2($time2)) {
        	echo '<div class="error_message">Please enter a valid time.<br />It must be in half an hour intervals. <strong>E.g. 16:00, 16:30, 17:00..</strong></div>';
			exit();
		      } else if(!isPerson($person)) {
        	echo '<div class="error_message">Please enter number of persons from 1 to 49.</div>';
			exit();
		      } 
		 

		
        if($error == '') {
        
			if(get_magic_quotes_gpc()) {
            	$comments = stripslashes($comments);
            }

 /* *************** diskuse.jakpsatweb.cz *** PHP FAQ ********************** */
function autoUTF($s)
{
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) // detect UTF-8
    {
        return $s;
    }
    elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) // detect WINDOWS-1250
    {
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    }
    else // assume ISO-8859-2
    {
        return iconv('ISO-8859-2', 'UTF-8', $s);
    }
}

function cs_mail($address, $subject, $msg, $head = "")
{
    $subject = "=?utf-8?B?".base64_encode(autoUTF($subject))."?=";
    $head .= "MIME-Version: 1.0\r\n";
    $head = "From: $email" . PHP_EOL;
    $head .= "Reply-To: $email" . PHP_EOL;
    $head .= "Return-Path: $email" . PHP_EOL;
    $head .= "Content-Type: text/html; charset=\"utf-8\"" . PHP_EOL;
    $head .= "MIME-Version: 1.0" . PHP_EOL . "Content-Transfer-Encoding: base64" . PHP_EOL;
    
    $msg = base64_encode(autoUTF($msg));
    return mail($address, $subject, $msg, $head);
}
/* ********************************************************************** **  */                  

         $address = "skvor.jan@gmail.com";
                                         
         $subject = 'Rezervace od ' . $name . '';
         $customer_subject = 'Vaše rezervace';

  
					
		 $body = "Vaše rezervace byla odeslána s těmito údaji\r\n\nJméno: $name \r\nEmail: $email \r\nTelefon: $phone \r\nDatum: $date \r\nČas: $time1 - $time2 \r\nPočet osob: $person \r\n Komentář: $comments";
		 
     $customer_body = "Vaše rezervace byla odeslána s těmito údaji\r\n\nJméno: $name \r\nEmail: $email\r\nTelefon: $phone \r\nDatum: $date \r\nČas: $time1 - $time2 \r\nPočet osob: $person \r\n Komentář: $comments";
	
	 
					
         $msg = $body;

         $customer_msg = $customer_body;
              

         if((cs_mail($address, $subject, $msg, $head)) && (mail($email, $customer_subject, $customer_msg, $headers))) {

                   
		
		 echo "<fieldset>";			
		 echo "<div id='success_page'>";
		 echo "<h3>Reservation Sent Successfully.</h3>";
		 echo "<p>Thank you <strong>$name</strong>, if there is some problem, we will get back to you as soon as possible.</p>";
		 echo "</div>";
		 echo "</fieldset>";
		 		 
		 } else {
		 
		 echo '<div class="error_message">ERROR! Try it later or use phone.</div>';
		 
		 }
                      
	}

function isName($name) { 
return(preg_match("/^[^0-9]+$/",$name));
		
}
function isEmail($email) { 
return(preg_match("/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i",$email));
		
}
function isDate($date) { 
return(preg_match("/^(([0-2]?[0-9])|(3[01])).((0?[0-9])|(1[012])).20[0-9]{2}$/",$date));
		
}
function isTime1($time1) { 
return(preg_match("/^(1[2-9]|2[0-3]):(00|30)$/",$time1));
		
}
function isTime2($time2) { 
return(preg_match("/^(1[2-9]|2[0-3]):(00|30)$/",$time2));
		
}
function isPerson($person) { 
return(preg_match("/^([1-9]|[1-4][0-9])$/",$person));
		
}

?>
Davex
Profil
1) Funkce cs_mail() se volá jen jednou. Zákazníkovi se e-mail stále odesílá funkcí mail().
2) Je stránka s formulářem také v kódování UTF-8?

Krom toho vypadá funkce cs_mail() ve FAQ jinak, ale na diakritiku to nebude mít vliv. Vzniká tam jiná chyba.
Radek Cvek
Profil
Co přesně nefunguje? U head je zase přemazaný ten první řádek. Mě to poslalo i se správnou diakritikou. Není tu ten formulář. Jak píše Davex - tam by mohla být chyba.
sidlo
Profil
Ano, zapomněl jsem dopsat, že cs_mail zatim volám jenom jednou a porovnávám výsledky, ale zatim mi na gmail i seznam dojde: Vaše rezervace byla odeslána s těmito údaji Jméno: škvor jan Email: skvor.sidlo@seznam.cz Telefon: 123456789 Datum: 25.11.2012 Čas: 15:00 - 18:00 Počet osob: 12 Komentář: žížala
Smazal jsem řádek, který tam byl navíc
$head .= "MIME-Version: 1.0\r\n";

A formulář mám taky v utf-8, kód zde.
<!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>Reservation</title>
<link href="style.css" rel="stylesheet" type="text/css" /> 

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="js/jquery.jigowatt.js"></script>

</head>

<body>

	<div id="contact">
        
            <h3>ON LINE RESERVATION FORM</h3>
            <p style="text-align: justify;">Through this online reservation form, please send reservations only more than <strong>12 hours in advance</strong>.</p>
            
            <div id="message"></div>
                                
            <form method="post" action="contact.php" name="contactform" id="contactform">
            
            <fieldset>
                    
             
            <label for=name><span class="required">*</span> Your Name</label>
            <input name="name" type="text" id="name" size="15" value="" /> 
        
            <br />
            <label for=email><span class="required">*</span> Your Email</label>
            <input name="email" type="text" id="email" size="15" value="" />
        
            <br />
            <label for=phone><span class="required">*</span> Your Phone</label>
            <input name="phone" type="text" id="phone" size="15" value="" />
        
            <br />
            <label for=date><span class="required">*</span> Date <span class="shadow">(23.2.2011)</span></label>
            <input name="date" type="text" id="date" size="15" value="" />
            
            <br />
            <label for=time1><span class="required">*</span> Time from <span class="shadow">(16:30)</span></label>
            <input name="time1" type="text" id="time1" size="15" value="" />
            
            <br />
            <label for=time2><span class="required">*</span> Time just about till <span class="shadow">(18:00)</span></label>
            <input name="time2" type="text" id="time2" size="15" value="" />
            
            <br />
            <label for=person><span class="required">*</span> Number of persons</label>
            <input name="person" type="text" id="person" size="15" value="" />
        
          
            <br />
            <label for=comments>Your comments</label>
            <textarea name="comments" cols="15" rows="1"  id="comments"></textarea>
                            
                  
            <input type="submit" class="submit" id="submit" value="Submit" />
            
            </fieldset>
        
            </form>
                    
	</div>

</body>
</html>
Alphard_
Profil *
sidlo:
Vaše rezervace byla odeslána s těmito údaji Jméno: škvor jan Email: skvor.sidlo@seznam.cz Telefon: 123456789 Datum: 25.11.2012 Čas: 15:00 - 18:00 Počet osob: 12 Komentář: ĹľĂĹľala

Jak vidíte, diakritika i stringů v PHP bloku je správná, to naznačuje, že se vám kombinují 2 různá kódování. Funkce autoUTF() má své meze. Jsou ty sobory uložené ve stejném kódování a sice v utf-8?
Funkci cs_mail() jste upravil (nebo rozbil) do nesprávné podoby. Proměnná $email (nedefinovaná jako globální) by v tom kontextu neměla být vidět, nebo to snad funguje?
sidlo
Profil
Chytrý :) Vůbec mě nenapadlo zkontrolovat uložení souboru v utf-8. Už to s fcí autoUTF() funguje.
Děkuju všem moc za pomoc.

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:

0