0

我目前正在探索 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 规则中。(PS 我仍然更喜欢具有 onblur 功能的 javascript)

问题:

验证工作如我上面所说,但我的插入没有。如果没有违反规则,我调用了 insertbook 函数,但它什么也没插入,正如我第一次将验证函数作为表单的接收者时假设的那样,我是对的,insertbook 可能没有收到表单中的数据。我应该怎么办?PS我有一个想法,我应该将这两个函数合并在一起,但这会造成混乱(或者这有关系吗?)。生病只是咨询你的意见。

4

3 回答 3

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]');

对于您的“唯一数字问题”->

$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

于 2013-08-18T15:29:26.687 回答
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 ; }
于 2013-08-18T20:27:39.497 回答
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');
}
于 2013-08-18T15:34:15.080 回答