【问题标题】:Multiple the same forms and POST method?多个相同的表单和POST方法?
【发布时间】:2013-05-18 01:26:28
【问题描述】:

我在一个页面上有多个相同表单(姓名/电子邮件/消息字段)的实例。它们都共享一个类('.contact-form')和不同的(动态生成的 ID)。

我使用 jQuery Tools Validator 验证它们(虽然我对此没有任何问题,但这并不相关):

$(".contact-form").validator();

我想问题出在我的 sendmail.php 文件中,这就是我获取所有 POST 值并验证它们的方式:

//grab the fields
$address = trim($_POST['address']);
$title = trim($_POST['title']);
$message = $_POST['message'];

//check if empty
if(empty($name) || empty($title) || empty($message)) { 
   $wrong = true; 
}

if($wrong) { 
        http_response_code(400);
} else { 
    // do stuff
    http_response_code(200);
}

现在,我面临的问题是:

  • 除了页面上的第一个表格外,我无法发送任何其他表格,其余表格(即使已正确填写)我收到此错误:

注意:未定义索引:mysitesaddress 中的地址在第 3 行

  • 在我发送第一个表单后 - 其他表单的行为不像预期的那样 - 即使所有字段都留空,它们也能通过(验证器在前端显示错误,但一秒钟后触发“成功”,因为 sendmail. php 返回“200 OK”。

任何想法如何修复它/检查每个表单而不是只检查第一个表单/发送后清除 POST 数据?我确信在 PHP 中有一种简单的方法可以做到这一点,我对那种语言不太熟悉(主要是前端人员),所以非常感谢任何帮助。

谢谢!

(我已经在谷歌上搜索了一段时间的答案,但看起来“POST”是一个棘手的名字,我得到的主要是 Wordpress/博客/论坛相关的东西......)

[更新]

这是每个表单的 HTML 代码:

<div class="wrapper">

    <form class="contact-form" action="sendmail.php" method="post" novalidate="novalidate">
        <input name="title" type="text" required="required" />
        <input name="address" type="email" required="required" />  
        <textarea name="message" required="required" ></textarea>               
        <input type="Submit" value="Submit" />
    </form> 

    <div class="sucess">
        Success message that replaces form ^.
    </div>
</div>

【问题讨论】:

    标签: php forms validation post


    【解决方案1】:

    通知暗示“地址”键不存在。

    您应该检查$_POST 变量中的索引是否已设置/存在,例如使用 PHP isset() 函数。

    这可能是因为您没有以所有形式发送地址,只是在第一个或类似的形式。

    关于如何使用 isset 进行检查的示例代码:

    if ( isset($_POST['address']) ) {
       //only set $address to the $_POST value if it is set
       $address = trim($_POST['address']);
    }
    

    【讨论】:

    • 对不起,好像我犯了一个错误,'地址'根本不存在,我现在正在用 isset 检查所有其他值,但它仍然不起作用正如预期的那样 - 看起来这个 php 只检查第一个表单(例如,我可以填写第一个表单,然后提交第二个 EMPTY 表单并通过,当第一个表单为空时我仍然无法发送第二个表单)。任何想法如何解决这个问题?
    • 查看第一篇文章。 PHP 代码只检查第一个表单,即使我填写并提交了第二个表单。
    • 是的,我之前犯了一个小错字,不得不将“地址”更改为“地址”:)
    【解决方案2】:

    我看不到你的 HTML 表单代码,但我猜你的表单标签看起来像这样

    <form action="sendmail.php" method="post">
    

    这将从提交的表单中获取所有字段,并通过 $_POST 将它们发送到您的 sendmail.php。处理数据后(edwardmp 提供了一个很好的提示,可以在尝试分配变量之前确保数据存在),然后您将页面重定向到某种类型的成功登陆或返回到原始表单页面。我一直使用的方法是:

    if($wrong) { 
        $error = "Please check your entry and try again.";
        header("Location: http://example.com/formpage.html?error=" . htmlencode($error),true,303);
        exit();
    } else { 
        // do stuff
        $msg = "Your form was successfully submitted.";
        header("Location: http://example.com/formpage.html?msg=" . htmlencode($msg),true,303);
        exit();
    }
    

    这种设计使得 $_POST 数据通过重新加载页面被清除,并允许您将消息发送回您将通过 $_GET['msg'] 或 $_GET['error' 显示的原始页面]。这应该会阻止表单错误提交。

    【讨论】:

    • 这正是我认为我的问题所在,尽管我无法将用户重定向到任何其他页面或刷新当前页面,因为我正在使用 ajax 验证器淡化“消息已发送”div形式。
    • 发布您的 html 表单代码,以便我们了解为什么它不会提交第二个和后续表单...即使您的 javascript 正确验证了表单数据,仍然存在由所有问题引起的问题以相同名称提交的表格?或者,尝试让 ajax 调用运行 $_POST = array(); 的 php 函数
    • jwheel12,我相信 PHP 代码只是检查 $_POST['something'] 的第一次出现并停在那里。因此,例如,即使我使用第二种形式发送 $_POST['address'] - 它仍然返回错误,因为它在第一种形式中是空的......你的回答很棒,它可能会解决我的问题,但我没有想要刷新页面(这就是我首先使用 AJAX 的原因)。
    • 我现在明白了,我不明白为什么提交表单会破坏页面上的其他表单,即使它们共享相同的名称。也许 Ajax 专家会出现并为您指出一些问题。
    • link 试试这个?
    猜你喜欢
    • 2016-08-06
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2013-02-23
    • 2011-05-12
    • 2020-06-11
    • 2016-08-21
    相关资源
    最近更新 更多