将变量从 PHP 传递到 javascript 并传递到 html 表单

Posted

技术标签:

【中文标题】将变量从 PHP 传递到 javascript 并传递到 html 表单【英文标题】:Passing a variable from PHP to javascript and on to an html form 【发布时间】:2011-07-14 02:53:37 【问题描述】:

我在 WordPress 中使用 jQuery、jQuery 表单和 php Mail 发送表单生成的电子邮件时设置了一个联系表单,这是一个公认的非常小的问题。

为了替换我当前的联系表单,它从联系表单页面中执行 pHp 验证,然后使用 PHP 邮件发送,我设计了以下简单的 html 5 表单(可以在此页面上看到:http://edge.donaldjenkins.net/contact) :

<form id="contact" method="post" action="">
<fieldset>  

    <label for="name">Name</label>
    <input type="text" name="name" placeholder="Your Name" title="Enter your name" class="required">

    <label for="email">E-mail</label>
    <input type="email" name="email" placeholder="yourname@domain.com" title="Enter your e-mail address" class="required email">

    <label for="phone">Phone</label>
    <input type="tel" name="phone" placeholder="ex. (555) 555-5555">

    <label for="website">Website</label>
    <input type="url" name="url" placeholder="http://">

    <label for="message">Question/Message</label>
    <textarea name="message"></textarea>

    <label for="checking" class="hidden">If you want to submit this form, do not enter anything in this field</label><input type="text" name="checking" class="hidden">

    <input type="submit" name="submit" class="button" id="submit" value="Send Message" />

</fieldset>

然后我使用 jQuery validate [jquery.validate.js] 和 form [jquery.form.js] 插件来执行客户端验证:

<script src="js/jquery.validate.js"></script>
<script src="js/jquery.form.js"></script>

<script>
$(function()
$('#contact').validate(
submitHandler: function(form) 
    $(form).ajaxSubmit(
    url: 'send-message.php',
    success: function() 
    $('#contact').hide();
    $('#instructions').hide();
    $('#status').show();
    $('#popular-posts').show();
    $('#status').append("<p>Thanks! Your request has been sent.  One will try to get back to you as soon as possible.</p>")
    
    );
    
);         
);
</script>

验证后,上述脚本使用jQuery.form 的ajaxSubmit function 将日期提交到服务器PHP 页面send-message.php(原因是javascript 无法发送电子邮件)。我使用这个 PHP 文件对数据进行第二次服务器端验证(尽管这可能是多余的,因为设置依赖于 javascript 将数据传递到服务器,因此可以放心地假设没有人会能够在没有启用 javascript 的情况下使用表单)。它还对表单中添加的隐藏输入字段中的数据执行蜜罐验证码检查。然后发送电子邮件:

<?php 
//invoke wp_load in order to use WordPress wp_mail plugin function instead of mail for    better authentification of the sent email
require_once("/path/to/wp-load.php");

//Check to see if the honeypot captcha field was filled in
if(trim($_POST['checking']) !== '') 
$captchaError = true;
$errors .= "\n Error: Captcha field filled in";
 else 

//Check to make sure that the name field is not empty
if(trim($_POST['name']) === '') 
    $errors .= "\n Error: Name field empty";
    $hasError = true;
 else 
    $name = strip_tags($_POST['name']);


//Check to make sure sure that a valid email address is submitted
if(trim($_POST['email']) === '')  
    $emailError = 'You forgot to enter your email address.';
    $hasError = true;
 else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]2,4$", trim($_POST['email']))) 
    $errors .= "\n Error: Message field empty";
    $hasError = true;
 else 
    $email = strip_tags($_POST['email']);


//Check to make sure comments were entered  
if(trim($_POST['message']) === '') 
    $errors .= "\n Error: Message field empty";
    $hasError = true;
 else 
    $phone = strip_tags($_POST['phone']);
    $url = strip_tags($_POST['url']);
    if(function_exists('stripslashes')) 
        $message = stripslashes(trim($_POST['message']));
     else 
        $message = strip_tags($_POST['message']);
    

//If there is no error, send the email
if(!isset($hasError)) 

    // Send Message 
    $emailTo = 'me@mydomain.com';
    $subject = 'Contact Form Submission from '.$name;
    $body = "Name: $name \n\nEmail: $email \n\nPhone: $phone \n\nWebsite: $url \n\nMessage: $message";
    $headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;

    wp_mail($emailTo, $subject, $body, $headers);

    $alert = 'Thanks! Your request has been sent.  One will try to get back to you as soon as possible.';
 else 
    $alert = $errors;

 ?>

服务器在变量 $alert 中跟踪是否发现错误或电子邮件是否成功发送。

pHp 函数完成后,脚本会从联系页面中隐藏表单,并显示之前隐藏的 html 元素,并在该元素上附加一条警告消息。

我无法解决的问题是让 javascript 更改该警报消息的措辞以反映电子邮件是否已成功发送,因为我不知道如何传递必要的 pHp 变量 ($alert) 包含将服务器 PHP 进程中的错误消息列表添加到脚本中,以便在联系表单页面中插入。当然,这也是一个非常理论上的问题,因为由于上述原因,一个容易出错的消息甚至不太可能首先到达 PHP 阶段。

我尝试在 PHP 文件末尾插入以下代码,但无济于事:

<script type="text/javascript">
alert = <?php echo $alert; ?>;
</script>

后一种尝试不会在 Firebug 中产生任何错误,但变量值不会被传递。欢迎任何想法或想法。

更新:我添加了此工作流程图以阐明此问题的设置:

【问题讨论】:

它应该可以工作。查看生成的页面;底部脚本的内容是什么?并且不要忘记引号。 @Tomalak:谢谢!我尝试 (1) 在 pPh 流程页面上将引号添加到上述脚本中,然后 (2) 将联系表单页面上脚本中的相应行更改为 $('#status').append(alert)。它不会在 Firebug 控制台中生成错误,但原始 pHp $alert 的文本不会粘贴到 html 元素中。尽管 Firebug 说该变量已被传递,但请参阅此屏幕截图以获取表单上的空元素:cl.ly/5BPx。 当我发送没有消息文本的提交时,我什至没有收到验证错误:提交成功。你需要大大缩小这个问题的范围,因为我怀疑你有几个。 @Donald:alert 在该代码中来自哪里?你从哪里传递它,以及如何传递?我想我现在明白了。您必须解析 AJAX 请求的结果以从其中检索 alert。我建议 send-message.php 返回 JSON。 您可能应该知道ereg, eregi and friends 在现代 PHP 版本中已被弃用。您可能应该停止使用它们。此外,您的电子邮件正则表达式过于严格,您应该考虑a more comprehensive drop-in solution.. 【参考方案1】:

在 send-message.php 中,将警报文本放入 IDd &lt;div /&gt;:

<div id="statusmsg" style="display: none">
<?php echo $alert ?>
</div>

那么调用页面上的 Javascript 应该如下所示:

<script type="text/javascript">
$(function() 
    $('#contact').validate(
        submitHandler: function(form) 
            $(form).ajaxSubmit(
                url: 'send-message.php',
                success: function(data) 

                    $('#contact').hide();
                    $('#instructions').hide();
                    $('#status').show();
                    $('#popular-posts').show();

                    // Make DOM object from result
                    var $DOMObj = $(data);

                    // Retrieve status message, if any
                    var $status = $('#statusmsg', $DOMObj);

                    // Show status message, if any
                    if ($status) 
                          $status
                                 .css('display', '')
                                 .appendTo('#status');
                    
            
            );
        
    );         
);
</script>

希望您能看到我如何使用 success 回调的参数来检索 AJAX 请求响应的 HTML 内容,找到 statusmsg div 并将其附加到调用页面上的相关元素。

更理想的是,send-message.php 将打印 JSON 而不是 HTML,使这个过程更容易一些。我将把它作为练习留给读者.. 至少在这个问题线程中。

【讨论】:

哇:令人印象深刻,非常感谢。然而,发生的事情是变量现在清楚地进入了调用页面(参见屏幕截图底部的控制台输出:cl.ly/5Cus)。但是您还会从该屏幕截图中看到尚未附加#statusmsg html 元素。我不知道为什么,因为脚本说要附加到#status。 我研究过使用 JSON,发现:&lt;script type="text/javascript"&gt; var o = &lt;?php echo json_encode($alert); ?&gt;; alert(o.name); &lt;/script&gt; 但它似乎也不起作用。 @Donald:该脚本标记与将 JSON 作为请求响应传递完全没有关系。现在让我们只关注 HTML。您需要使用 Firebug 调试我在上面发布的脚本。逐行遍历它,观察每个变量的内容,以及 $('#status') 的内容。另外我忘记了您需要删除display: none CSS(现已更新);即使在浏览器中看不到,您仍应在 Firebug 控制台中看到附加到 $status 的文本。 我已经动员起来让新网站投入生产,但现在是online,所以今晚我将继续对沙盒网站上的联系表进行 beta 测试。使该站点脱离地面是一项大量的工作!现在这个传回数据问题的联系表格是唯一一个我还没有解决的问题……很快就会回来,带来更多结果,再次感谢。【参考方案2】:

您希望返回成功或失败的电子邮件以响应 AJAX 调用。

对于此示例,您可以简单地返回 falsetrue。如果您需要更多信息,请返回 JSON 字符串,例如...


   "success": true,
   "something": ["something", "something-else"]

您可以在 PHP 中使用 json_encode() 轻松将数组转换为 JSON。

【讨论】:

谢谢。当然,我不只是想返回邮件是否发送成功。我还需要传递 pHp 进程存储在$alert 变量中的错误消息。这就是我无法传递给脚本的内容(请记住,pHp 和脚本位于不同的页面上)。

以上是关于将变量从 PHP 传递到 javascript 并传递到 html 表单的主要内容,如果未能解决你的问题,请参考以下文章

Javascript将选项传递给变量并使用php保存到txt文件

如何将变量和数据从 PHP 传递到 JavaScript?

如何将变量和数据从 PHP 传递到 JavaScript?

将变量从 PHP 传递到 Javascript:意外的令牌?

通过 POST 将 JSON 编码的变量从 PHP 传递到 Javascript

通过 ajax 将 Javascript 变量传递给 PHP