【问题标题】:How to pass and put variable from a php page into a another page(form)?如何将变量从 php 页面传递并放入另一个页面(表单)?
【发布时间】:2020-06-13 00:54:39
【问题描述】:

我在两个页面上工作,第一个页面有一个包含三个字段的表单:名称、电子邮件和消息)。此页面会将这些数据发送到第二个页面,该页面将验证这些字段是否符合条件。

如果在第二页,这些字段中的任何一个不符合条件,我想重定向到第一页(或第三个 php 页面),用以前的信息填写表单并告诉用户正确更正字段.

我正在努力将数据从第二页发送到第一页(或第三页)。有谁知道一个好方法吗?

这是我的代码:

首页 - contato.html

<form action="validate.php" method="POST" name="emailform">
    <div class="form-group">
        <input type="text" id="name" name="nome" placeholder="Type your name">
    </div>
    <div class="form-group">
        <input type="text" id="email" name="email" placeholder="type your@email.com here">
    </div>
    <div class="form-group">
        <textarea class="form-control" cols="30" rows="10" maxlength="300" id="message" name="mensagem" placeholder="Leave your message." ></textarea>
    </div>

    <div class="form-group">
        <input type="submit" name="submit" value="Send message" onclick="alert('Thank you!')" ></form>

第二页 - validate.php

if(isset($_POST['nome'])) $nome = $_POST['nome'];
if(isset($_POST['email'])) $email_visitante = $_POST['email'];
if(isset($_POST['mensagem'])) $mensagem = $_POST['mensagem'];

// if does not meet the criteria, redirect to contato.html and update the form with the info
if(empty($nome)){
    Header("location:contato.html"); 
}
if(empty($email_visitante)){
    Header("location:contato.html");
}
if(empty($mensagem)){
    Header("location:contato.html");
}
// check for letters and space only
if (!preg_match("/^[a-zA-Z ]*$/",$nome)) {
    Header("location:contato.html");
}
// check if e-mail address is well-formed
if (!filter_var($email_visitante, FILTER_VALIDATE_EMAIL)) {
    Header("location:contato.php");
}

有人知道怎么做吗?发送到第三页或重定向到第一页(然后再次填写表格)

【问题讨论】:

    标签: php html forms parameter-passing


    【解决方案1】:

    您必须使用会话并将数据存储在一个页面中并在另一个页面中访问,这是一个小用法

    <?php
    // page 1
    session_start();
    // Set session variables
    $_SESSION["nome"] = $nome;
    $_SESSION["email"] = $email_visitante;
    $_SESSION["mensagem"] = $mensagem;
    
    <?php
    // page 2|3|N - any other page
    session_start();
    // Get session variables
    $nome = $_SESSION["nome"];
    $email_visitante = $_SESSION["email"];
    $mensagem = $_SESSION["mensagem"];
    

    【讨论】:

    • 您不必使用会话。尽可能避免。
    • 请在不使用会话的情况下发布您的答案,我也对此感兴趣
    • @Progrock 是的,如果您可以在没有会话的情况下分享您的解决方案,我很感兴趣
    • 由于此表单很短,如果值验证失败,您可能会显示错误并要求用户使用他们的后退按钮。如果值通过验证,则将它们传递给另一个函数以对它们做任何你想做的事情,然后重定向用户。较长的表格、多页表格和错误手持会增加复杂性。但是您可以将以前收集的值嵌入隐藏字段中。会话管理会增加复杂性和开销。
    • 如果你把一些值放到会话中,取其他页面并删除它们,是否会增加复杂性和开销?那么为什么会话是在php中创建的呢?如果您验证第一页的输入,并将值放在第二页的隐藏输入中,如果用户编辑隐藏的输入值会发生什么?在这种情况下,您必须再次验证它们,并且您必须验证它们的次数与您拥有的页面数量一样多。所以我认为这比会话存储更难管理
    【解决方案2】:

    您的部分问题是,在任何失败的验证中,您都在使用重定向。或者,您可以向用户显示错误消息:建议他们需要通过返回页面(浏览器返回)来更正输入。

    当表单变长时,用户需要一些手来纠正错误。他们的错误需要通过一条消息清楚地指出,并说明他们如何修复它。

    避免使用上面的“浏览器返回”方法,将表单发送到自己的 url 是很常见的。我在下面提供了一个示例。

    通过这样做,您可以在出现错误时使用发布的值重新填充表单并添加错误反馈。在这种情况下,您必须小心转义用户输入。

    我添加了通用错误反馈通知。以目前的形式来说,这并没有多大帮助。您可以通过调整验证代码来改进这一点,以返回一组错误通知,并在您的表单中使用它来获得更有针对性的错误反馈。您还可以添加 - 所有字段都是必需的 - 帮助用户的文本。

    验证成功后,将用户重定向到确认页面。这可以防止重新提交表单。

    您当前形式的名称正则表达式模式不允许使用连字符或撇号。下面我没改。请记住这一点。 “Michael O'leary”将面临一个错误并且可能不明白为什么。对用户输入使用严格的规则时需要小心。这也会拒绝一些 unicode。

    您还需要适当地转义用户输入。请注意,您可能会对验证后的姓名和电子邮件遵循特定模式感到满意,但要注意原始用户输入。消息文本在验证后以原始方式传递。

    <?php
    $nome            = $_POST['nome']     ?? null;
    $email_visitante = $_POST['email']    ?? null;
    $mensagem        = $_POST['mensagem'] ?? null;
    $feedback        = null;
    
    if(isset($_POST['submit'])) {
        if(validate($nome, $email_visitante, $mensagem) !== false) {
            process($nome, $email_visitante, $mensagem);
            // Redirect to success/thankyou/confirmation page.
            header('location:success.html');
            exit;
        }
        // This is a generic message, could this be more helpful?
        $feedback = 'Your form has errors.  Please correct them.';
    }
    form($nome, $email_visitante, $mensagem, $feedback);
    
    function process($nome, $email_visitante, $mensagem) {
        // do something with your values.
    }
    
    function validate($nome, $email_visitante, $mensagem) {
        if(empty($nome)) {
            return false;
        }
        if(empty($email_visitante)){
            return false;
        }
        if(empty($mensagem)){
            return false;
        }
        if (!preg_match("/^[a-zA-Z ]*$/",$nome)) {
            return false;
        }
        if (!filter_var($email_visitante, FILTER_VALIDATE_EMAIL)) {
            return false;
        }
    
        return true;
    }
    
    function form($nome = null, $email_visitante = null, $mensagem = null, $feedback = null) {
    ?>
        <?= $feedback ?>
        <form action='' method='POST' name='emailform'>
            <div class='form-group'>
                <label for='name'>Your name:</label>
                <input type='text' id='name' name='nome' value='<?= htmlspecialchars($nome) ?>'>
            </div>
            <div class='form-group'>
                <label for='email'>Your email address:</label>
                <input type='text' id='email' name='email' value='<?= htmlspecialchars($email_visitante) ?>'>
            </div>
            <div class='form-group'>
                <label for='message'>Your message:</label>
                <textarea class='form-control' cols='30' rows='10' maxlength='300' id='message' name='mensagem'><?= htmlspecialchars($mensagem) ?></textarea>
            </div>
            <div class='form-group'>
                <input type='submit' name='submit' value='Send message'>
            </div>
        </form>
    <?php
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多