2017-02-17 76 views
0

我想知道如何在用户提交消息时在同一页面上添加错误或成功消息字段正确。
PS:我的工作在本地主机和了解很少PHP的,所以请解释一下像我5.感谢如何在用户用PHP提交邮件时在同一页面添加错误或成功消息

<?php 

    $errorMSG = ""; 

    // NAME 
    if (empty($_POST["name"])) { 
     $errorMSG = "Por favor preencha o seu nome "; 
    } else { 
     $name = $_POST["name"]; 
    } 

    // EMAIL 
    if (empty($_POST["email"])) { 
     $errorMSG .= "Por favor preencha com o seu email "; 
    } else { 
     $email = $_POST["email"]; 
    } 

    // MSG SUBJECT 
    if (empty($_POST["msg_subject"])) { 
     $errorMSG .= "Por favor escreva um assunto da mensagem"; 
    } else { 
     $msg_subject = $_POST["msg_subject"]; 
    } 


    // MESSAGE 
    if (empty($_POST["message"])) { 
     $errorMSG .= "Por favor escreva uma mensagem "; 
    } else { 
     $message = $_POST["message"]; 
    } 

    //email here 
    $EmailTo = "[email protected]"; 
    $Subject = "New Message Received"; 

    //email body text 
    $Body = ""; 
    $Body .= "Nome: "; 
    $Body .= $name; 
    $Body .= "\n"; 
    $Body .= "Email: "; 
    $Body .= $email; 
    $Body .= "\n"; 
    $Body .= "Assunto: "; 
    $Body .= $msg_subject; 
    $Body .= "\n"; 
    $Body .= "Mensagem: "; 
    $Body .= $message; 
    $Body .= "\n"; 

    // send email 
    $success = mail($EmailTo, $Subject, $Body, "De:".$email); 

    //success message 
    if ($success && $errorMSG == ""){ 
     echo "sucesso"; 
    }else{ 
     if($errorMSG == ""){ 
      echo "Algo correu mal :("; 
     } else { 
      echo $errorMSG; 
     } 
    } 

    ?> 


    <!DOCTYPE html> 
    <head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <title>Title</title> 

    <!-- css --> 
    <link href="css/contactform.css" rel="stylesheet" /> 
    <link href="css/bootstrap.min.css" rel="stylesheet" /> 
    <link href="css/style.css" rel="stylesheet" /> 
    </head> 
    <body> 


          <!-- Start Contact Form --> 
    <form role="form" id="contactForm" class="contact-form" data-toggle="validator" class="shake"> 
     <div class="form-group"> 
     <div class="controls"> 
      <input type="text" id="name" class="form-control" placeholder="Nome" required data-error="Por favor escreva o seu nome"> 
      <div class="help-block with-errors"></div> 
     </div> 
     </div> 
     <div class="form-group"> 
     <div class="controls"> 
      <input type="email" class="email form-control" id="email" placeholder="Email" required data-error="Por favor escreva o seu email"> 
      <div class="help-block with-errors"></div> 
     </div> 
     </div> 
     <div class="form-group"> 
     <div class="controls"> 
      <input type="text" id="msg_subject" class="form-control" placeholder="Assunto" required data-error="Por favor escreva o assunto da mensagem"> 
      <div class="help-block with-errors"></div> 
     </div> 
     </div> 
     <div class="form-group"> 
     <div class="controls"> 
      <textarea id="message" rows="7" placeholder="Mensagem" class="form-control" required data-error="Escreva a sua mensagem"></textarea> 
      <div class="help-block with-errors"></div> 
     </div> 
     </div> 

     <button type="submit" id="submit" class="btn btn-effect"><i class="fa fa-check"></i>Enviar</button> 
     <div id="msgSubmit" class="h3 text-center hidden"></div> 
     <div class="clearfix"></div> 

    </form>  

而且,我配置sendmail的“sendmail.ini”和“的php.ini “文件,以测试电子邮件的接收我的本地服务器上,而是不断收到此错误:Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing in

什么custom "From:"?

+1

这通过PHP的方式是不可能的,因为php运行在服务器端,而你需要客户端逻辑来修改已经加载的页面。通常的做法是使用AJAX请求将表单发送到服务器。该响应包含可以通过javascript注入已显示页面的消息。听起来很可怕,但实际上大多数人都期望更容易。 – arkascha

+0

谢谢,我会研究一下。 – patriciacodes

回答

0

在我进一步解释之前,我必须指出,您没有在窗体中定义或指定动作属性。你的PHP代码它书面形式不能工作,首先你必须添加动作和方法属性,形成这样

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post"> 
    //input element here 
</form> 

action属性点脚本的位置(PHP文件在您的情况)元素会处理用户提交的表单数据,但在你的情况下,你希望php本身处理表单数据,$ _SERVER [“PHP_SELF”]包含当前的php文件位置。出于安全原因,php超级全局“$ _SERVER”包装在“htmlspecialchars”函数中,这些函数转义了空间字符。其次,因为您将表单提交给相同的php脚本,您必须检查表单是否已经提交,而不是当用户使用$ _SERVER [“REQUEST_METHOD”]访问php页面时。如果REQUEST_METHOD是POST,则表单已经提交,例如:

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    //put your validation code here 
} 

使其更清晰,这是怎么了你的PHP代码假设样子:

<?php 
    //global variables here 
    $errorMSG = ""; 
    $name = ""; 
    $email = ""; 
    $msg_subject = ""; 
    $message = ""; 
    $EmailTo = ""; 
    $Subject = ""; 
    $Body = ""; 

    //check if user submitted a form 
    if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    // NAME 
    if (empty($_POST["name"])) { 
     $errorMSG = "Por favor preencha o seu nome "; 
    } 
    else { 
     $name = $_POST["name"]; 
    } 

    // EMAIL 
    if (empty($_POST["email"])) { 
     $errorMSG .= "Por favor preencha com o seu email "; 
    } 
    else { 
     $email = $_POST["email"]; 
    } 

    // MSG SUBJECT 
    if (empty($_POST["msg_subject"])) { 
     $errorMSG .= "Por favor escreva um assunto da mensagem"; 
    } 
    else { 
     $msg_subject = $_POST["msg_subject"]; 
    } 

    // MESSAGE 
    if (empty($_POST["message"])) { 
     $errorMSG .= "Por favor escreva uma mensagem "; 
    } 
    else { 
     $message = $_POST["message"]; 
    } 

    //email here 
    $EmailTo = "[email protected]mail.com"; 
    $Subject = "New Message Received"; 

    //email body text 
    $Body = ""; 
    $Body .= "Nome: "; 
    $Body .= $name; 
    $Body .= "\n"; 
    $Body .= "Email: "; 
    $Body .= $email; 
    $Body .= "\n"; 
    $Body .= "Assunto: "; 
    $Body .= $msg_subject; 
    $Body .= "\n"; 
    $Body .= "Mensagem: "; 
    $Body .= $message; 
    $Body .= "\n"; 

    // send email 
    $success = mail($EmailTo, $Subject, $Body, "De:".$email); 

    //success message 
    if ($success && $errorMSG == ""){ 
     echo "sucesso"; 
    } 
    else{ 
     if($errorMSG == ""){ 
     echo "Algo correu mal :("; 
     } 
     else { 
     echo $errorMSG; 
     } 
    } 
    } 
?> 

我注意到,所有的输入元素没有name属性,这是名称的PHP脚本用于访问用户提交表单数据,这是做正确的方式:

<input type="text" name="username" placeholder="Enter your name"/> 

你要注意的另一件事,PHP代码在html和JavaScript有机会之前执行。

不要使用此生产的PHP代码,如何正确操作的更多信息,请访问本网站的https // www.w3schools.com/PHP/

+0

我试过这个,但我不知道我在做对 – patriciacodes

+0

'if($ _SERVER [“REQUEST_METHOD”] ==“POST”){ if($ success && $ errorMSG ==“”)回声“sucesso”; }其他{ 如果($ ERRORMSG == “”){ 回声 “ALGO correu发作:(”; }其他{ 回声$ ERRORMSG; }?} } >',也加入行动按钮,正如你所建议的那样。我在做什么错误?谢谢! – patriciacodes

+0

我已经重新编辑了答案来反映你的问题,我希望它有帮助吗? – Cocest

0

你需要添加动作到窗体这种方式,方法和正确提交..试试这个

<!DOCTYPE HTML> 
<html> 
<head> 
<style> 
.error {color: #FF0000;} 
</style> 
</head> 
<body> 

<?php 
// define variables and set to empty values 
    $nameErr = $emailErr = ""; 
$name = $email = ""; 

    if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["name"])) { 
    $nameErr = "Name is required"; 
    } else { 
    $name = test_input($_POST["name"]); 
    // check if name only contains letters and whitespace 
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) { 
    $nameErr = "Only letters and white space allowed"; 
    } 
    } 

    if (empty($_POST["email"])) { 
    $emailErr = "Email is required"; 
    } else { 
    $email = test_input($_POST["email"]); 
    // check if e-mail address is well-formed 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     $emailErr = "Invalid email format"; 
    } 
    } 


    } 

    function test_input($data) { 
     $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
    } 
    ?> 


    <p><span class="error">* required field.</span></p> 
    <form method="post" action="<?php echo  htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
    Name: <input type="text" name="name" value="<?php echo $name;?>"> 
    <span class="error">* <?php echo $nameErr;?></span> 
    <br><br> 
    E-mail: <input type="text" name="email" value="<?php echo $email;?>"> 
    <span class="error">* <?php echo $emailErr;?></span> 
    <br><br> 

    <input type="submit" name="submit" value="Submit"> 
    </form> 

    <?php 
    echo "<h2>Your Input:</h2>"; 
    echo $name; 
    echo "<br>"; 
    echo $email; 
    echo "<br>"; 

    ?> 

    </body> 
    </html> 
+0

把你的html部分和php部分放下..我认为这可能适合你... –

+0

你的意思是移动PHP脚本上方的HTML吗?我认为它需要先来,所以错误或成功的消息将在加载页面之前读取.. – patriciacodes

+0

我试过你的建议,它不是真的工作。也许我做错了什么。 – patriciacodes

相关问题