PHP表单验证与外部处理
我想包具有相同的页面验证,但外部处理此联系人/报价表。我已经设置了一个变量来进行表单操作,当表单验证时,变量/网址从同一页面更改为处理页面。然而,它走的是两条点击提交按钮,以处理后的形式所需的所有领域都被填充:所有必填字段将填写,我点击提交,页面重新加载与保存的数据变量,然后当我点击提交agin,它终于完成,发送电子邮件并加载谢谢页面。我在这里搜索了这些帖子,尝试了很多东西,但还没有找到解决方案。我绝对不是一个PHP专家,还是个新手,所以这可能不是实现这一目标的最佳方式,但我会很感激如何完成这件事的任何想法。这里是我的:PHP表单验证与外部处理
<?php
....
if (empty($Name) && empty($Company) && empty($Address1) && empty($City) && empty($State) && empty($Phone))
{
echo '<p class="tan">The fields marked with an * are required.</p>';
$Process = 'samepageurl';
}
/*else if (empty($Name) || is_numeric($Name))
{
echo '<p class="tan"><b>Please enter your name.</b></p>';
}*/
else if (empty($Company) || is_numeric($Company))
{
echo '<p class="tan"><b>Please enter your company name.</b></p>';
$Process = 'samepageurl';
}
else if (empty($Address1) || is_numeric($Address1))
{
echo '<p class="tan"><b>Please enter your address.</b></p>';
$Process = 'samepageurl';
}
else if (empty($City) || is_numeric($City))
{
echo '<p class="tan"><b>Please enter your city.</b></p>';
$Process = 'samepageurl';
}
else if (empty($State) || is_numeric($State))
{
echo '<p class="tan"><b>Please enter your state.</b></p>';
$Process = 'samepageurl';
}
else if (empty($Phone) || ctype_alpha($Phone))
{
echo '<p class="tan"><b>Please enter your phone number.</b></p>';
$Process = 'samepageurl';
}
else if (strlen($Phone) < 10 || strlen($Phone) > 12 || ctype_alpha($Phone) || ctype_space($Phone))
{
echo '<p class="tan"><b>Please enter a phone number with an area code.</b></p>';
$Process = 'samepageurl';
}
else if (isset($Name) && isset($Company) && isset($Address1) && isset($City) && isset($State) && isset($Phone))
{
$Process = 'processingurl';
}
?>
<form action="<?php echo $Process; ?>" method="post" class="print" >
<p><input type="hidden" name="recipient" value="[email protected]"/>
<input type="hidden" name="subject" value="Web Site Response"/>
<input type="hidden" name="redirect" value="thankyou.html"/></p>
... form fields ...
</form>
谢谢你提前!
遗漏变量首先检查,然后提取和验证的变量,那么会根据他们的内容。
<?php
function verifyPostContains(&$req) {
global $_POST;
$missing = array();
foreach($req as $var => $_) {
if(!isset($_POST[$var])) {
$missing[] = $var;
}
}
return $missing;
}
$requirements = array('name'=>'','city'=>'','state'=>'',...);
$missing = verifyPostContains($requirements);
if(count($missing)>0) {
$content = formErrorReport($missing);
sendHeaders();
echo $content;
exit();
}
// extract, making sure to sanitize
$name = sanitize($_POST["name"]);
...
$errorHtml = array();
// validate by reference. Effectively call testName($name).
if(failsValidation($name, "testName")) {
$errorHtml [] = generateError(NAME_ERROR, $name);
} else { $requirements["name"] = $name; }
if(failsValidation($city, "testCity")) {
$errorHtml [] = generateError(CITY_ERROR, $city);
} else { $requirements["city"] = $name; }
...
if(count($errorHTML)>0) {
generateErrorPage($requirements, $missing, $errorHTML);
} else { processForm($requirements); }
?>
此代码假设你有功能做需要做的各个位,并具有产生错误HTML一些字符串常量。
正如你可能想谷歌的一些教程解释在服务器上做使用PHP形式处理的新人,和JavaScript在客户端。如果你找到一个教程,它给你的代码在测试数据的时候会产生回声错误,比如你的代码,那么就继续前进。这不是一个好的教程。如果您发现一个在发现一个错误后停止的人,也请继续前进。如果你找到一个告诉你,以确保值是正确的在JavaScript,然后说:“我们已经在客户端验证这个,所以我们使用的值直接在PHP”,待着了。寻找一个教程,说明:
- 确保有一个在所有表单域,使用JavaScript数据,因此提交按钮被禁用,直到有一个为所有字段的数据。
- 确保数据符合您的标准,在PHP中,这样的人谁只是张贴到你的服务器而没有使用你的页面没有逃脱注入有趣的东西所有的方式,他们不应该是能够做到
- 您生成的页面中包含解释的所有错误(如果有),并且表单使用错误的数据重新填充,但突出显示为错误
- 如果没有错误,则处理发布请求。
(如果该教程解释POST请求不需要实际上曾经生成页面内容作为响应,比报头指示POST调用是否被接受或拒绝其他。奖励分)
哇,谢谢你的彻底和周到的回应! – heather 2013-03-21 16:56:55
如果这是你所希望的答案,请记住点击“这回答我的问题”复选标记,所以你的问题不会留在“未回答的问题”列表=) – 2013-03-21 22:15:04
这是你的全部代码吗?看起来您并不像您指定您的$ _POST变量,例如'$名称= $ _ POST [“名”];' – romo 2013-03-20 22:04:22
你最好检查这对客户方在我看来的JavaScript。现在您已经通过验证重新回到了服务器端。如果验证失败,您也可以重新导向到表单页面。但不是做事的最佳方式。 – Daniel 2013-03-20 22:06:18
你绝对应该做的客户端验证像丹尼尔说,但服务器端验证也是不错的。看到这里的问题的详细信息,建立一个非常简单的形式与验证:http://*.com/questions/12158229/php-form-submit – jacobangel 2013-03-20 22:21:07