проверка состояния флажка с использованием PHP (для т и с)

0

Я 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"/>&nbsp;<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"/>&nbsp;<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;
}
}
  • 0
    изменить value="false" на value="true"
  • 0
    В чем проблема с вашим первым методом ( !isSet($_POST[..])) )? Работает нормально в моей системе. Вы также можете изменить значение флажка в соответствии с предложением
Показать ещё 3 комментария
Теги:
logic
checkbox

3 ответа

2

Значение флажка устанавливается равным false когда пользователь проверяет его. Потому что в вашем HTML есть <input type="checkbox" value="false". Вам нужно value="true" если вы хотите, чтобы значение было true когда пользователь его проверяет.

Однако с вашим текущим кодом вторая и последняя ошибка должны выполняться, когда пользователь не проверяет флажок, но вы говорите, что они этого не делают. Вам придется дважды проверить это.

  • 0
    Я попробовал это, но потом ничего не отображается. как мне сравнить его в логике, которая получается, если она НЕ проверена, вывести ошибку? и положить '!' инфронт isset до сих пор не работает
0

Никогда не устанавливайте значение флажка как ИСТИНА или ЛОЖЬ.

    <input type="checkbox" value="something" name="terms_and_conditions" >
                          -----------^
0

Не проверяйте 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"/>&nbsp;<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>
  • 0
    это ничего не отображает вообще
  • 0
    Опубликуйте оператор формы, например, <form method='post' ...> Убедитесь, что ваш метод post. Если ваш $_POST пуст, это звучит так, как будто вы установили 'get'
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню