我真的搞砸了。有没有人可以帮助我知道使用 php.ini 进行服务器端验证的更简单方法或简单方法是什么?我真的很感激......
问问题
1309 次
3 回答
0
这是一个简单的 PHP 表单验证:
<?php
// validate $_GET['foo'], here I test that it is at least 1 character long
$valid = TRUE;
if( isset($_GET['foo']) && strlen($_GET['foo']) < 1 ) {
$valid = FALSE;
}
// if the form is submitted and $_GET['foo'] is valid, show a success message
if( isset($_GET['bar']) && $valid ) :
// do something with the form data
?>
<p>The form was successfully submitted.</p>
<?php
// show the form
else :
?>
<form method="get" action="">
<div>
<label for="foo">Foo: </label>
<input type="text" id="foo" name="foo" value="<?php echo $_GET['foo']; ?>" />
<?php if( !$valid ) : ?>
<p>Please enter a valid value.</p>
<?php endif; ?>
</div>
<div>
<input type="submit" id="bar" name="bar" value="Bar" />
</div>
</form>
<?php
endif;
?>
于 2012-07-19T17:42:28.773 回答
0
用这个:
<?php
class Validator {
public $data = array();
public $rules = array();
public $messages = array();
public $error = array();
public $pass = true;
public function __construct($options = null) {
foreach ($options as $option => $value) {
$this->$option = $value;
}
}
public function validate() {
foreach($this->rules as $k=>$v) {
$rules = explode('|',$v);
$pass = true;
foreach ($rules as $rule) {
$rule = explode(':',$rule);
switch ($rule[0]) {
case 'required':
if(empty($this->data[$k])) {
$pass = false;
}
break;
case 'min':
if(strlen($this->data[$k]) < $rule[1]) {
$pass = false;
}
break;
case 'max':
if(strlen($this->data[$k]) > $rule[1]) {
$pass = false;
}
break;
case 'equal':
if(strlen($this->data[$k]) != $rule[1]) {
$pass = false;
}
break;
case 'not':
if($this->data[$k] == $rule[1]) {
$pass = false;
}
break;
case 'allow':
$allowed = explode(',',$rule[1]);
if(!in_array($this->data[$k],$allowed)) {
$pass = false;
}
break;
case 'email':
if (!filter_var($this->data[$k],FILTER_VALIDATE_EMAIL)) {
$pass = false;
}
break;
case 'same':
if ($this->data[$k] != $this->data[$rule[1]]) {
if(!isset($this->error[$rule[1]])) {
$this->error[$rule[1]] = '';
}
$pass = false;
} else {
if(isset($this->error[$rule[1]])) {
$this->error[$k] = $this->error[$rule[1]];
}
}
break;
case 'unique':
if (egrediDB_checkUnique($rule[1],$k,$this->data[$k]) != 0) {
$pass = false;
}
}
if($pass == false) {
$this->pass = false;
$this->error[$k] = $this->messages[$k];
}
}
}
//print_r($this->error);
return array(
'error'=>$this->error,
'pass'=>$this->pass
);
}
}
?>
注意:我为数据库检查创建了一个自定义函数:
<?php
// Funktion für die Klasse Validator.php
function egrediDB_checkUnique($table,$column,$value) {
global $egrediDB;
return $egrediDB->count($table,array($column=>$value));
}
?>
<?php
$Validator = new Validator(array(
'data'=>$_POST['data'],
'rules' => array(
'firstname' => 'required',
'lastname' => 'required',
'password' => 'required|min:8',
'password_repeat' => 'required|same:password',
'email' => 'email|unique:user',
'email_repeat' => 'required|same:email',
'timezone' => 'required|not:-1',
'country' => 'required|not:-1|max:2',
'street' => 'required',
'postalcode' => 'required',
'city' => 'required',
),
'messages' => array(
'firstname' => 'Bitte geben Sie ein Vornamen ein',
'lastname' => 'Bitte geben Sie ein Nachnamen ein',
'password' => 'Bitte geben Sie ein Sicheres 8-stelliges Passwort ein',
'password_repeat' => 'Ihre Passwörter stimmen nicht überein',
'email' => 'E-Mail ist ungültig oder schon registriert',
'email_repeat' => 'Ihre E-Mails stimmen nicht überein',
'timezone' => 'Bitte wählen Sie eine Zeitzone',
'country' => 'Bitte wählen Sie ein Land',
'street' => 'required',
'postalcode' => 'required',
'city' => 'required',
),
));
echo json_encode($Validator->validate());exit;
?>
于 2014-12-07T20:08:27.793 回答
0
正如 Marc B 所说,真的没有简单的方法。您可以使用第三方表单验证库/类或使用具有表单验证作为组件的框架。我个人使用Zend 框架,但这对你来说可能是多余的。
如果你自己做,你需要记住以下几点(根据你的需要加上更多):
- 根据特定的所需格式,数据是否正确?(即,电子邮件、电话号码、邮政编码)您可以通过多种方式验证这一点。(常用表达)
- 您是插入数据库还是返回页面?那你应该逃跑。简单的方法包括:htmlentities、htmlspecialchars等。同样,这取决于您的具体需求
- 您想强制执行最大限制吗?如果是这样,您将需要在服务器端执行此操作,因为 DOM 可以由用户操作,并且任何
input
级别限制都可以轻松更改。 - 字段是必需的吗?确保
POST
变量存在且不为空。
您只需要写下您对表单的要求,然后从那里决定您将如何实施验证。
于 2012-07-19T17:35:51.200 回答