2016-03-20 4 views
1

Я использую PHP Code Igniter, и у меня возникают проблемы с проверкой формы. Я следил за учебником по проверке формы в Code Igniter, но он не работает. Пустые поля передаются в базу данных.PHP Code Igniter Form Validation не работает

Я добавил набор правил проверки формы в функцию индекса в контроллере.

Контроллер:

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 

class Phonebook extends CI_Controller { 

    var $TPL; 

    public function __construct() 
    { 
    parent::__construct(); 

    $this->TPL['newentry'] = false; 
    $this->load->library(array('form_validation')); // load form lidation libaray & session library 
    $this->load->helper(array('url','form')); // load url,html,form helpers optional 
    } 

    public function index() 
    {  
    $this->load->helper(array('form', 'url')); 
    $this->load->library('form_validation'); 

    $TPL->form_validation->set_rules('fname', 'First Name', 'required|min_length[5]|max_length[12]|is_unique[phonebook.fname]'); 
    $this->form_validation->set_rules('lname', 'Last Name', 'required|matches[passconf]'); 
    $this->form_validation->set_rules('phone', 'Password Confirmation', 'required'); 
    $this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[phonebook.email]'); 

    if ($this->form_validation->run() == FALSE) 
    { 
     $this->load->view('phonebook_view'); 
    } 
    else 
    { 
     $this->load->view('success_message'); 
    } 
    } 

    public function newentry() 
    { 
    $fname = $this->input->post("fname"); 
    $lname = $this->input->post("lname"); 
    $phone = $this->input->post("phone"); 
    $email = $this->input->post("email"); 
    $query = $this->db->query("INSERT INTO phonebook VALUES (NULL, '$fname', '$lname', '$phone', '$email', NULL, NULL, NULL, NULL);"); 

    $this->display(); 
    } 

    public function addnew() 
    { 
    $this->TPL['newentry'] = TRUE; 

    $this->display(); 
    } 

} 

И Посмотреть файл.

<html> 
<body> 
<h1><a href="<?= base_url()?>">Phonebook</a></h1> 

<? if ($newentry) { ?> 

<?= form_open('Phonebook/newentry') ?> 
<?= form_fieldset("Add Entry") ?> 
<?= form_label('First Name:', 'fname'); ?> <br> 
<?= form_input(array('name' => 'fname', 
'id' => 'fname')); ?> <br> 
<?= form_label('Last Name:', 'lname'); ?> <br> 
<?= form_input(array('name' => 'lname', 
'id' => 'lname')); ?> <br> 
<?= form_label('Phone Number:', 'phone'); ?> <br> 
<?= form_input(array('name' => 'phone', 
'id' => 'phone')); ?> <br> 
<?= form_label('E-mail:', 'email'); ?> <br> 
<?= form_input(array('name' => 'email', 
'id' => 'email')); ?> <br> 
<?= form_submit('phonebooksubmit', 'Submit'); ?> 
<?= form_fieldset_close(); ?> 
<?= form_close() ?> 

<? } else { ?> 

<p><a href="<?= base_url() ?>index.php?/Phonebook/addnew">Add new entry</a></p> 

<? } ?> 

</body> 
</html> 

ответ

3

Если сравнить ваш код здесь и базовый пример CI UserGuide, вы можете увидеть те две не похожие примеры. Вы пропустили загрузку библиотеки сеансов в массив, переданный в конструкторе. Не стесняйтесь удалять загружаемые библиотеки и помощники из других методов (т. Е. index), потому что они уже загружаются в конструктор, и соответствующие объекты/функции доступны во всех методах класса после. Сделать массив переменной public, var - это устаревшее ключевое слово.

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 

class Phonebook extends CI_Controller 
{ 

    public $TPL = array(); 

    public function __construct() 
    { 
     parent::__construct(); 

     $this->TPL['newentry'] = false; 
     $this->load->library(array('form_validation, session')); // load form lidation libaray & session library 
     $this->load->helper(array('url', 'html', 'form')); // load url,html,form helpers optional 
    } 

    public function index() 
    { 
     $this->form_validation->set_rules('fname', 'First Name', 'required|min_length[5]|max_length[12]|is_unique[phonebook.fname]'); 
     $this->form_validation->set_rules('lname', 'Last Name', 'required|matches[passconf]'); 
     $this->form_validation->set_rules('phone', 'Password Confirmation', 'required'); 
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[phonebook.email]'); 

    if ($this->form_validation->run() == FALSE) 
    { 
     $this->load->view('phonebook_view'); 
    } 
    else 
    { 
     $fname = $this->input->post("fname"); 
     $lname = $this->input->post("lname"); 
     $phone = $this->input->post("phone"); 
     $email = $this->input->post("email"); 
     $query = $this->db->query("INSERT INTO phonebook VALUES (NULL, '$fname', '$lname', '$phone', '$email', NULL, NULL, NULL, NULL);"); 

     if ((int)$this->db->affected_rows() < 1) 
     { 
      print_r($this->db->error()); 
      exit; 
     } 
     else 
     { 
      redirect('success_page', 'refresh'); 
      //maybe? $this->display(); 
     } 
    } 

    public function addnew() 
    { 
     $this->TPL['newentry'] = TRUE; 

     $this->display(); 
    } 
} 

Put <?= form_open('phonebook') ?> в виде. Также исправить set_rules(). Я просто копировал/вставлял ваши, но не выглядел правильным. Прочитайте имя fierlds и правильные правила в этом коде - не соответствует.