Я abit застрял на получении состояния checkbox через PHP. Я провел последние 2 часа в Google, пытаясь использовать разные методы, но ничего не работает...
В принципе мне нужна логика, чтобы сказать "если она не проверена, добавьте ошибку".
Я пробовал следующие методы:
if(!isset($_POST['terms_and_conditions'])){
$this->addError("You must agree to our terms and conditions");
}
if(isset($_POST['terms_and_conditions']) && $_POST['terms_and_conditions'] == 'true'){
$this->addError("You must agree to our terms and conditions");
}
if(!isset($_POST['terms_and_conditions']) && !$_POST['terms_and_conditions'] == 'true'){
$this->addError("You must agree to our terms and conditions");
}
if($_POST['terms_and_conditions'] == "false"){
$this->addError("You must agree to our terms and conditions");
}
if($_POST['terms_and_conditions'] == false){
$this->addError("You must agree to our terms and conditions");
}
и вот код для флажка:
<div id="field">
<input type="checkbox" value="false" name="terms_and_conditions" id="terms_and_conditions"/> <label for="terms_and_conditions">By clicking this you agree to this site <a href="terms_and_conditions.php">Terms and Conditions</a></label>
</div>
я что, глупо и что-то не так? Он выведет ошибку только с помощью этого метода, и если флажок установлен (требуется):
if(isset($_POST['terms_and_conditions'])){
$this->addError("You must agree to our terms and conditions");
}
Но тогда, если я попытаюсь сделать его отрицательным, то есть: с восклицательным знаком "!" он ничего не отображает?
Каким будет мой лучший способ обойти это?
Спасибо за ваше время!
ОБНОВИТЬ
Вот файл register.php:
<?php
require 'core/init.php';
include_once 'includes/files/overall/header_main.php';
$error_array = array();
if(Input::exists()) {
if(Token::check(Input::get('token'))) {
$validate = new Validate();
$validation = $validate->check($_POST, array(
'username' => array(
'required' => true,
'min' => 2,
'max' => 20,
'unique' => 'users'),
'password' => array(
'required' => true,
'min' => 3),
'password_again' => array(
'required' => true,
'matches' => 'password'),
'name' => array(
'required' => false,
'min' => 2,
'max' => 50)
));
if($validation->passed()) {
$user = new User();
$bcrypt = new Bcrypt();
try {
$user->create(array(
'username' => Input::get('username'),
'password' => $bcrypt->hash(Input::get('password')),
'name' => Input::get('name'),
'joined' => date('Y-m-d H:i:s'),
'group' => 1
));
Session::flash('home', 'You have been registered and can now log in!');
Redirect::to('index.php');
} catch(Exception $e) {
die($e->getMessage());
}
} else {
foreach($validate->errors() as $error) {
echo $error, '<br>';
}
}
}
}
?>
<section id="aside">
<aside class="register">
</aside>
</section>
<section id="main_content">
<h1>Sign Up</h1>
<p class="bigger">Join 1000 of <b>docimes</b> and meet new companions - it easy!</p>
<?php
if(!empty($error_array)){
echo '<ul>';
foreach($error_array as $error){
echo '<li>'. $error .'</li>';
}
echo '</ul>';
}
?>
<form action="" method="post">
<div id="field">
<label for="name">Name</label>
<input type="text" name="name" value="<?php echo escape(Input::get('name')); ?>" placeholder="name" />
</div>
<div id="field">
<label for="surname">Surname</label>
<input type="text" name="surname" value="<?php echo escape(Input::get('surname')); ?>" placeholder="Surname" />
</div>
<div id="field">
<label for="email">Email</label>
<input type="text" name="email" value="<?php echo escape(Input::get('email')); ?>" placeholder="Email" />
</div>
<div id="field">
<label for="username">Username</label>
<input type="text" name="username" value="<?php echo escape(Input::get('username')); ?>" placeholder="Username" />
</div>
<div id="field">
<label for="password">Password</label>
<input type="password" name="password" value="" placeholder="Password" />
</div>
<div id="field">
<label for="password_again">Password again</label>
<input type="password" name="password_again" value="" placeholder="Password again" />
</div>
<input type="hidden" name="token" value="<?php echo Token::generate(); ?>"/>
<input type="submit" value="Signup" />
<div id="field">
<input type="checkbox" value="" name="terms_and_conditions" id="terms_and_conditions"/> <label for="terms_and_conditions">By clicking this you agree to this site <a href="terms_and_conditions.php">Terms and Conditions</a></label>
</div>
</form>
</section>
<?php
include_once 'includes/files/overall/footer_main.php';
?>
и класс validate.php:
<?php
class Validate {
private $_passed = false,
$_errors = array(),
$_db = null;
public function __construct() {
$this->_db = DB::getInstance();
}
public function check($source, $items = array()) {
foreach($items as $item => $rules) {
foreach($rules as $rule => $rule_value) {
$value = trim($source[$item]);
if($rule === 'required' && $rule_value === true && empty($value)) {
$this->addError("{$item} is required.");
} else if (!empty($value)) {
switch($rule) {
case 'min':
if(strlen($value) < $rule_value) {
$this->addError("{$item} must be a minimum of {$rule_value} characters.");
}
break;
case 'max':
if(strlen($value) > $rule_value) {
$this->addError("{$item} must be a maximum of {$rule_value} characters.");
}
break;
case 'matches':
if($value != $source[$rule_value]) {
$this->addError("{$rule_value} must match {$item}.");
}
break;
case 'unique':
$check = $this->_db->get('users', array($item, '=', $value));
if($check->count()) {
$this->addError("{$item} is already taken.");
}
break;
case 'accepted':
if($rule === 'accepted' && $rule_value === true){
$this->addError("You must agree to our terms and conditions");
}
break;
}
}
}
}
if(empty($this->_errors)) {
$this->_passed = true;
}
return $this;
}
protected function addError($error) {
$this->_errors[] = $error;
}
public function passed() {
return $this->_passed;
}
public function errors() {
return $this->_errors;
}
}
Значение флажка устанавливается равным false
когда пользователь проверяет его. Потому что в вашем HTML есть <input type="checkbox" value="false"
. Вам нужно value="true"
если вы хотите, чтобы значение было true
когда пользователь его проверяет.
Однако с вашим текущим кодом вторая и последняя ошибка должны выполняться, когда пользователь не проверяет флажок, но вы говорите, что они этого не делают. Вам придется дважды проверить это.
isset
до сих пор не работает
Никогда не устанавливайте значение флажка как ИСТИНА или ЛОЖЬ.
<input type="checkbox" value="something" name="terms_and_conditions" >
-----------^
Не проверяйте value == true (на самом деле значение по умолчанию, если отмечено, будет "включено". Если флажок установлен, он будет отображаться с помощью isset.
if(!isset($_POST['terms_and_conditions'])){
$this->addError("You must agree to our terms and conditions");
}
Что показывает print_r ($ _ POST) после проверки с ним? Если по умолчанию флажок выключен, просто оставьте значение пустым.
UPDATE : VALUE не влияет на проверенное состояние флажков. Если вы хотите установить флажок по умолчанию, используйте CHECKED. Вместо этого VALUE устанавливает значение, которое отправляется на сервер, если пользователь проверяет этот флажок. Если флажок не установлен, на сервер не отправляется никакое значение (isset() == false
). По умолчанию флажки отправляются.
Если вы не получаете это значение, следующее - это полностью упрощенная версия вашего кода, чтобы вы могли видеть, что должно произойти. Когда пользователь нажмет на этот флажок, сообщение вернется с $_POST['terms_and_conditions']=='on'
Затем вы можете продолжить добавление фрагментов своего кода, чтобы увидеть, что не работает.
<h1>Sign Up</h1>
<p class="bigger">Join 1000 of <b>docimes</b> and meet new companions - it easy!</p>
<?php
var_dump($_POST);
?>
<form action="" method="post">
<div id="field">
<label for="name">Name</label>
<input type="text" name="name" value="<?php echo 'name'; ?>" placeholder="name" />
</div>
<div id="field">
<label for="surname">Surname</label>
<input type="text" name="surname" value="<?php echo 'surname'; ?>" placeholder="Surname" />
</div>
<div id="field">
<label for="email">Email</label>
<input type="text" name="email" value="<?php echo 'email'; ?>" placeholder="Email" />
</div>
<div id="field">
<label for="username">Username</label>
<input type="text" name="username" value="<?php echo 'username'; ?>" placeholder="Username" />
</div>
<div id="field">
<label for="password">Password</label>
<input type="password" name="password" value="" placeholder="Password" />
</div>
<div id="field">
<label for="password_again">Password again</label>
<input type="password" name="password_again" value="" placeholder="Password again" />
</div>
<input type="hidden" name="token" value="<?php echo 'abc'; ?>"/>
<input type="submit" value="Signup" />
<div id="field">
<input type="checkbox" name="terms_and_conditions" id="terms_and_conditions"/> <label for="terms_and_conditions">By clicking this you agree to this site <a href="terms_and_conditions.php">Terms and Conditions</a></label>
</div>
</form>
<form method='post' ...>
Убедитесь, что ваш метод post. Если ваш $_POST
пуст, это звучит так, как будто вы установили 'get'
value="false"
наvalue="true"
!isSet($_POST[..]))
)? Работает нормально в моей системе. Вы также можете изменить значение флажка в соответствии с предложением