【问题标题】:Send PHP errors back to index将 PHP 错误发送回索引
【发布时间】:2014-06-24 19:30:07
【问题描述】:

所以我有一个index.php 和一个r.phpR.php 是注册部分。 index.php 是实际的形式。我的问题是如何将来自r.php 的错误发送回index.php(如果存在)。因此,我不想在r.php 上显示错误,而是希望在index.php 上显示错误并阻止表单前进。

这是index.php

<!DOCTYPE html>
<html>
    <body>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>

这一切都很简单。现在这里是r.php

<?php
$name = $_POST['name'];

if ($name < 3){
    //display error
}
else {
    //proceed
}
?>

我应该用 JS 做这个吗?或者这有更好的方法。

【问题讨论】:

  • 正常的方法是让 r.php 和 index.php 在同一个文件中。这可以简化事情
  • 我对 Pear 不是很熟悉.... @pce

标签: javascript php html forms security


【解决方案1】:

一种方法是使用会话:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <body>
    <?php echo isset($_SESSION['message']) ? $_SESSION['message'] : ''; ?>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>

<?php
session_start();
unset($_SESSION['message']);
$name = $_POST['name'];

if ($name < 3){  // you probably want strlen($name) < 3
    $_SESSION['message'] = 'error';
    header('Location: index.php');
    exit;
}
else {
    //proceed
}
?>

除了会话之外,您可以使用查询字符串重定向回来并使用它:

header('Location: index.php?message=' . urlencode('some kind of error');

然后:

<?php echo isset($_GET['message']) ? $_GET['message'] : ''; ?>

【讨论】:

  • 一切似乎都很好。但是当我回去后错误仍然存​​在。我试过在exit; 之后使用unset($_SESSION['message']);,但它不起作用。有什么想法我应该把它贴在哪里?
  • 不应该不过滤就回显$_GET变量,至少使用htmlspecialchars或htmlentities,因为这容易受到XSS的攻击。
  • 我知道 SQL 注入和 XSS。在我了解这一点后,我会确保清理它。 @pce
  • 只是一个例子。我用unset($_SESSION['message']);编辑了
  • 仍然没有取消设置。我只希望他们显示一次。就像用户在收到消息后刷新页面后一样,我不希望它们在那里。否则很好的答案。
【解决方案2】:

为此使用单个脚本会更容易,只需将所有内容放在一个文件中,然后检查表单是否已提交。如果表单已提交,您只需立即包含您想要的变量。

这很粗略,但它让你知道你可以用它去哪里:

<?php

if (isset($_POST['name'])) {
    // Begin processing form stuff
    $name = $_POST['name'];

    // Initialise error variable
    $error = null;    

    if ($name < 3) {
        // Display error, for example:
        $error = 'Name is less than 3';
    } else {
        // Proceed
    }
}

?>
<!DOCTYPE html>
<html>
<body>
    <?php if ( ! empty($error)) { ?>
        <p><?php echo $error; ?></p>
    <?php } ?>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>
</html>

【讨论】:

  • 我知道这一点。但我正在尝试使用 2 个文件。
  • 好的,那么您可以使用来自r.php 的重定向并设置一些GET 变量。唯一真正可靠的方法就是拥有一个前端控制器。
【解决方案3】:
<!DOCTYPE html>
<html>
<?php

  $msg = '';

  if(isset($_GET['e'])
  {
    $msg = "Error! Input not valid.";
  }
?>
    <body>
    <?php
        if($msg!='')
        {
          echo "<font color='red'>".$msg."</font>";
        }
    ?>
     <form method="post" action="r.php">
      <input type="text" name="name" placeholder="Name">
      <input type="submit">
    </form>
</body>

如果发现错误,只需使用 GET 请求将变量 e 传递给索引页面。

<?php
$name = $_POST['name'];

if ($name < 3){
    header("Location: index.php?e=error");
}
else {
    //proceed
}
?>

GET请求会使用URL发送变量e,如果发现e有值,说明r.php有错误

【讨论】:

    【解决方案4】:

    使用 javascript 进行简单的表单验证。如果你需要一些安全的东西或数据库的东西,你可以使用 session/cookie 或使用 header 函数返回。

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2013-09-24
      • 2023-03-04
      • 2020-05-27
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多