我有一个联系表单,我通过使用“if”语句逐个检查每个字段来处理错误。我发现这很难,我似乎无法找到更好/更有效的方式让他们工作。如果一个(或更多)是真的,我还想要一个标题“错误”。但我不能让他们使用单独的“if”语句。
这是我的代码:
$name = $_POST['name']; //get data from the form
$email = $_POST['email'];//get data from the form
$message = $_POST['message'];//get data from the form
if($name == ""){
echo"<p class='error'>Please enter a name.</p>";
}
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email)){
echo "<p class='error'>Your email address is not valid.</p>";
}
if($message == ""){
echo"<p class='error'>Please enter a message.</p>";
}
else{
echo"all ok, send email code...";
}
编辑:这些错误用于表单的验证。
答案 0 :(得分:4)
但我不能让他们使用单独的“if”语句。
只是将错误存储在变量中
$error = array();
if($name == ""){
$error[] = "Please enter a name.";
}
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email)){
$error[] = "Your email address is not valid.";
}
if($message == ""){
$error[] = "Please enter a message.";
}
if (!$error) {
// do not echo anything here
// but send an email
// and use header("Location:") to redirect a user to thanks page
} else {
echo "Error";
foreach ($error as $line) {
echo "<p class='error'>$line</p>";
}
}
答案 1 :(得分:1)
答案 2 :(得分:1)
最专业的方法是让每个字段成为具有验证方法的对象。 然后你可以调用每个字段对象并让他们自己验证。
如果您想继续前进(可能会有些过分),您可以将对象放在列表中。 这些对象中的每一个都是使用验证方法的接口的子代。因此,对于列表中的每个对象,您都可以调用验证方法。
答案 3 :(得分:1)
嗯,您无法一起检查所有字段,因为不同的规则可能适用于每个字段。所以你做的很好,除了你犯了一个错误:else部分应该只在没有错误发生时被回应,但在你的情况下,else只适用于 last if。因此,即使名称和电子邮件的验证失败,只要消息没有,最终的操作就完成了。
一旦发现错误,您就可以轻松添加一些包含true的$has_error
变量。或者您可以使用包含所有错误消息的数组,如下所示:
$errors = array();
if ( empty( $name ) )
$errors[] = 'Please enter a name.';
if ( !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email ) )
$errors[] ='Your email address is not valid.';
if ( empty( $message ) )
$errors[] = 'Please enter a message.';
// individual checks done
if ( sizeof( $errors ) > 0 )
{
echo '<p class="error"><strong>Errors found:</strong><br />';
echo implode( '<br />', $errors );
echo '</p>';
}
else
{
echo 'No error, everything is fine.';
}
答案 4 :(得分:1)
首先,不要将ereg*()
函数用于正则表达式匹配,这些函数已弃用且速度很慢。请改用preg_*()
函数。
它提供了检查和验证各种数据的功能,您可以直接使用这些数据或将其合并到您自己的验证器功能中。
编辑:检查电子邮件地址的示例(另请参阅examples on php.net):
if ( !filter_var($email, FILTER_VALIDATE_EMAIL) ) {
echo 'Invalid e-mail "'.$email.'"';
说到以面向对象的方式进行验证,您可以使用具有基本验证功能的通用验证器类(您还可以将filter
函数集成到一致的API中)。
此外,如果您的数据在逻辑上属于一起,以便您可以将它们分组到对象中并对其进行管理,请在这些对象的类中实现validate()
方法,以便使用{{1}检查对象的属性函数和/或验证器类。
filter
然后,您可以将所有表单输入加载到对象中,如下所示:
class Message {
private $name;
private $email;
private $text;
...
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function getEMail() {
return $this->email;
}
public function setEMail($email) {
$this->email = $email;
}
...
public function validate() {
$errors = array();
$nameLength = strlen($this->name);
if ( ($nameLength === 0) or ($nameLength > self::NAME_MAX_LENGTH) )
$errors['name'] = 'Name must be between 1 and '.self::NAME_MAX_LENGTH.' characters.';
if ( !Validator::isEMail($this->email) )
$errors['email'] = 'Invalid e-mail "'.$this->email.'"';
// Other checks
...
// Return TRUE if successful, otherwise array of errors
return ( count($errors) === 0 ? true : $errors );
}
}