2011-03-04 70 views
1

我有一个基本的PHP表单页面,其中包含大量的数据,一旦全部完成,这些数据将被保存到MySql中的大约4-5个不同的表中。由于构建这个保存例程需要一点PHP,我希望POST操作不是指向PHP_SELF,而是指向一个单独的PHP文件进行处理。PHP表单处理器错误传递

当诸如电话号码,电子邮件,邮政编码等所有常规数据之前将被传递到处理器脚本,如果是由处理器返回一个错误提交验证...

什么是在保持数据输入的同时指向原始表单页面(HTTP_REFERER)的最佳实践方式?

<?php 
    if (isset($_POST['date']) && ($_SERVER['HTTP_REFERER'] == "form.php")) 
    { 
      $errors = false; 

      //attempt to put data in database 

      if ($errors) 
      { 
       //Pass back to the form.php page with error message and all data intact 
      } 
    } 
?> 

回答

1

我以前也碰到过这样的问题,我们如何解决,这是把所有的字段到一个会话,然后重定向到形成.php使用标题(“Location:form。php“);

当数据发布到表单时,我们将$ _REQUEST存储到$ _SESSION ['post'];如果验证失败,我们将它发送回表单,填充字段并取消设置该会话。

因此,例如

$_SESSION['post']['field_a'] = $_REQUEST['field_a']; 
$_SESSION['post']['field_b'] = $_REQUEST['field_b']; 

用一些花哨的命名约定,你可以循环这使它容易。

,那么这个表单页面上,我们只是检查,看看是否有一些数据,或只是回显数据,无论如何。

$str_field_a = @$_SESSION['post']['field_a']; 
... 
<input name="field_a" value="<?php echo $str_field_a; ?>" /> 
... 
unset($_SESSION['post']); 

这可能是一种混乱的做法,但它已被证明对我们的目的有效。只是想我会分享。

+0

我从别人那里听说过这个,但是想知道这是否被认为是最佳做法。这是肮脏的,但它确实完成了工作......虽然效率是关键。 – Jeff 2011-03-04 04:54:42

+1

我们之所以选择这种方式有很多原因。让java脚本强制提交重定向将允许用户点击后退按钮并可能导致一些错误。由于我们有超过60个字段的数据,GET方法并不是非常优化的。唯一可用的方法是暂时保留它。我同意,这是一个混乱的方式,但到目前为止还没有任何问题。这实际上取决于个人意见和您面临的选择。 – Dave 2011-03-04 05:00:12

+0

感谢您在javascript上的推理 - 我没有考虑过使用它的原因,而不是提交按钮。 – Jeff 2011-03-04 05:02:25

0

我认为你可以做,使用错误的数组:

窗体页:

<form action="processor.php" action="post"> 
<!-- lots of fields --> 
<input type="submit" id="submitButton" name="Save" value="Save" /> 
</form> 

Processor页面。

  1. 设置错误标志为false(如果发生错误,则将其设置为true,因此不在数据库中存储)。

  2. 检查元件1,如果错误,则其存储在阵列$error['name'] = 'value'

  3. 类似地检查所有的元件,并且使用相同的程序存储。

  4. 在结束时,如果错误标志设置为false不要在数据库中存储和(如果在同一页面上,你将能够访问要显示的错误消息上的形式排列。)

    if(isset($error['elementname'])) echo $error['elementname']; 
    

页面下方。

但是,最好的方法是使用面向对象的方法。

[更新]

  1. storing php objects on html form element and passing php objects through GET method?

  2. how to send redirect page pass variables as post variables from a php script

而且我想,在会话中存储整个对象不会是一个不错的办法

+0

我的问题不在于如何将错误收集到某种数组或StdObject中,而是如何正确地将数据传回HTTP_REFERER页面以允许用户更正错误并重新提交而无需重新输入数据。 – Jeff 2011-03-04 04:42:23

+0

@Jeff你知道你可以通过'GET','POST'和'SESSION'传递数据。我想'GET'将是优雅的(但非常不安全)。和'POST'将是简单的(如果在同一页面上)。和'SESSION'将是最糟糕的一个 – 2011-03-04 04:47:18

+0

正确 - 它将被存储在POST中的可能性更大 - 但是如何处理发送页面控制回到处理器的form.php页面的逻辑?你是否简单地接受了收到的POST,并在$ _POST ['error']上添加一个新项目并将其提交回form.php页面以重新提交?如果是这样 - 你有一个快速的例子吗? – Jeff 2011-03-04 05:00:58

0

我会发一个帖子回form.php包含错误rs和值。我在我的个人项目中使用了相同的方法。

if ($errors) { 
    ?><form action="form.php" method="post" name="error"> 
    <input type="hidden" name="errcode" value="<?php echo $errorcodes; /*or whatever message*/ ?>" /> 
    <input type="hidden" name="anotherdata" value="anothervalue" /> 
    <?php /*you can add all post datas here as hidden field*/ ?> 
    </form> 
    <script type="text/javascript">document.error.submit();</script><?php 
} 

这是类似于我form.php的

//first I set default blank variables for form 
$formvalue=""; 
$formnumericvalue=""; 
//i set them, yay! 

//if I get values from post.php, I update the values 
if (isset($_POST['iserror'])) { //you can either echo a error message or update current data here, I'm showing this for both 
    $formvalue=$_POST['formvalue'];//don't forget to validate these! 
    $formnumericvalue=$_POST['formnumericvalue']; //don't forget to validate these! 
} 
//I also do this method for edit forms 

//and finally I show the form 
?> 
<form name="form" method="post" action="post.php"> 
    <input type="text" name="formvalue" value="<?php echo $formvalue; ?>" /> 
</form> 
+0

我想我不会关注。是表单页面还是form_processor的顶级代码片段?如果来自表单页面,那么它的引用与PHP_SELF相同,我试图远离赋予脚本的本质。如果从你的form_processor中,你为什么要重新插入一个新的表单对象,该对象指向带有隐藏字段的原始表单? – Jeff 2011-03-04 04:57:42

+0

顶级代码位于processor.php中。如果你发现错误,你可以像我写的代码一样将值发送回form.php。即将数据提交回form.php(或不同的页面),以便人员进行更正并重新提交(它只是将提交的数据发送回form.php)。我插入它是因为您将表单操作设置为不同的页面。如果它们都在同一页面中,则不需要制作

。要么你只设置一个数据,包括错误信息或发送所有表单数据,这样提交者只能找到他/她的错误并修复它们。 – Arda 2011-03-04 05:02:05