Codeigniter验证,将表单数据从控制器函数接收者传递到另一个

时间:2013-08-18 15:21:20

标签: codeigniter validation insert

我目前正在探索ci提供的验证库..我目前遇到了一些麻烦。香港专业教育学院试图做一些变通办法,但令我失望的是它进一步搞砸了我的代码。生病了,请问专业人员应该做些什么。

我的观点:

<?php echo validation_errors(); ?>
                            <?php echo form_open('bookstore/validateinsert');?>
                                <table cellpadding='4' align='center'>
                                <th>Title</th>
                                    <tr>
                                        <td><input type="text" name="bkname" value="<?php echo set_value('bkname');?>"/></td>
                                    </tr>
                                    <th>Author</th>
                                    <tr>
                                        <td><input type="text" name="bkauthor" value="<?php echo set_value('bkauthor'); ?>"/></td>
                                    </tr>
                                    <th>Released Year</th>
                                    <tr>
                                        <td><input type="text" name="bkyear" value="<?php echo set_value('bkyear'); ?>"/></td>
                                    </tr>
                                    <th>ISBN</th>
                                    <tr>
                                        <td><input type="text" name="bkisbn" value="<?php echo set_value('bkisbn'); ?>"/></td>
                                    </tr>

                                    <tr>
                                        <td><input type='submit' value='insert'/></td>
                                    </tr>
                                    <?php echo form_close();?>
                                </table>

我的控制器:

public function validateinsert()
    {
    $this->load->library('form_validation');

    $this->form_validation->set_rules('bkname', 'Book Name', 'required|is_unique[books.book_name]');
    $this->form_validation->set_rules('bkauthor', 'Book Author', 'required');
    $this->form_validation->set_rules('bkyear', 'Year Published', 'required|max_length[4]');
    $this->form_validation->set_rules('bkisbn', 'Book ISBN', 'required');

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

    }


    public function insertbook()
    {
        if($_POST)
        {
            $data = array(
                'book_id' => null,
                'book_name' => $_POST['bkname'],
                'book_author' => $_POST['bkauthor'],
                'book_year' => $_POST['bkyear'],
                'book_isbn' => $_POST['bkisbn']
            );


            $duplicate = $this->_searchbook('book_name',$data['book_name']);

            if(!$duplicate)
            {
                $insertid = $this->books_model->insert_books($data);

                if($insertid)
                {
                    $data['success'] = TRUE;
                    $data['message'] = "The book title was successfully added.";
                }

                else
                {
                    $data['success'] = FALSE;
                    $data['message'] = "An error was encountered.";
                }
            }

            else
            {
                $data['success'] = FALSE;
                $data['message'] = "The book title is already in the system";
            }
        }

        $this->load->view('book_entry');
    }

我认为这是有必要了解的。

验证工作完美,虽然我有一个问题,所有数字的语法是什么,只有我希望它包含在我的isbn和bkyear规则中。(P.S。我仍然喜欢javascript及其onblur功能)

问题:

验证工作如上所述,但我的插入没有。如果没有规则被破坏,我调整了插入本函数,但它没有插入任何内容,正如我假设当我第一次将验证功能作为表单的接收者并且我是对的时,插入本可能没有收到表单中的数据。我该怎么办?附:我有一个想法,我应该将这两个功能合并在一起,但这会弄得一团糟(或者它是否重要?)。我会就此问你的意见。

3 个答案:

答案 0 :(得分:3)

你的php逻辑错了:

  if ($this->form_validation->run() == FALSE)
    {
        // If validation fails load view
        // $this->insertbook();
        $this->load->view('showbooks');
    }
    else
    {
        //If validation pass insert book
        // $this->load->view('showbooks');
        $this->insertbook();
    }

$duplicate = $this->_searchbook('book_name',$data['book_name']);您可以使用验证规则替换:

$this->form_validation->set_rules('book_name', 'Name of book', 'is_unique[table.column]');

对于您的“唯一号码问题” - &gt;

$this->form_validation->set_rules('bkyear', 'Year', 'numeric');

此外,您可以在此处找到许多内置规则: http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference 如果您需要一些自定义规则,您可以编写自己的功能。见这里的手册: http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#callbacks

答案 1 :(得分:0)

    try this 



        public function validateinsert()
        {
            $this->load->library('form_validation');


        if($this->input->post()) {

            $this->form_validation->set_rules('bkname', 'Book Name', 'required|is_unique[books.book_name]');
            $this->form_validation->set_rules('bkauthor', 'Book Author', 'required');
            $this->form_validation->set_rules('bkyear', 'Year Published', 'required|max_length[4]');
            $this->form_validation->set_rules('bkisbn', 'Book ISBN', 'required');

            if ($this->form_validation->run() != FALSE)
            {
                    $data = array(
                        'book_id' => null,
                        'book_name' => $this->input->post('bkname'),
                        'book_author' => $this->input->post('bkauthor'),
                        'book_year' => $this->input->post('bkyear'),
                        'book_isbn' => $this->input->post('bkisbn')
                    );

                    $this->insertbook($data);
             }
        }
        else
        {
            $this->load->view('showbooks');
        }

    }




public function insertbook($data)
{

        $duplicate = $this->_searchbook('book_name',$data['book_name']);

        if(!$duplicate)
        {
            $insertid = $this->books_model->insert_books($data);

            if($insertid)
            {
                $data['success'] = TRUE;
                $data['message'] = "The book title was successfully added.";
            }

            else
            {
                $data['success'] = FALSE;
                $data['message'] = "An error was encountered.";
            }
        }

        else
        {
            $data['success'] = FALSE;
            $data['message'] = "The book title is already in the system";
        }


    $this->load->view('book_entry');
}

答案 2 :(得分:0)

你应该看看其他答案,因为他们指出了一些错误。如果您正在进行数据库操作 - 您总是需要进行错误检查。数据库是不稳定的它也很容易出错,所以你想要隔离数据库方法。

只需将IF包裹起来。 首先检查负面情况。

if ( $this->insertbook() == false ) 
{ echo 'omg there is an error something is wrong with my insert code' ;
 $this->showError() ;
}
else
{ // no problem
 $this->showSuccess() ;  }

另一种方法是返回新创建的记录的id。

 if ( ! $id = $this->insertbook() ) { echo 'insert failure' ; } 
 else { echo 'my new id is:' . $id ; }