0

奇妙なバグがあります。

フォームの検証では、TRUE と FALSE の両方のアクションが実行されます。

TRUE の場合、データベース モデル (scrape_url_model) が実行されてデータベースが更新されますが、ビューはフォーム検証が FALSE であるかのように実行されます。成功した検証に関連付けられたビュー (scrape_url/form_success) の代わりに、FALSE ビュー (scrape_url/index) が表示されます。

The URL is already in the databaseコールバック関数から検証エラー メッセージが表示されます。

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

    $data['pageTitle'] = 'URL Scraping Tool';

    $this->form_validation->set_rules('event_url', 'URL', 'trim|required|callback_url_check');

    if ($this->form_validation->run() == FALSE){
            $this->load->view('templates/header', $data);  
            $this->load->view('scrape_url/index', $data);
            $this->load->view('templates/footer');
    }
    else {
        $this->load->library('Db_queries');
        $this->load->library('session');
        $this->load->helper('url');

        list($session_data['alert'],
        $session_data['alert_type'],
        $session_data['countUncategorizedDecks'],
        $session_data['event_id'],
        $session_data['eventDate']) = $this->scrape_url_model->insert_decks_and_cards();

        if ($this->input->post('last_url') == 'yes'){
            $this->scrape_url_model->insert_md_percentage($session_data['eventDate']);
        }
        $this->session->set_userdata($session_data);
        $this->load->view('templates/header', $data);  
        $this->load->view('scrape_url/form_success', $data);
        $this->load->view('templates/footer_ajax');    
    }
}                      

public function url_check($event_url) {
    $url_regex = "/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";

    if (preg_match($url_regex, $event_url) == FALSE) {
        // check to see if input is a URL
        $this->form_validation->set_message('url_check', 'Please enter a URL including "http://".');
        return FALSE;
    }
    $this->load->database();
    $sql = 'SELECT url FROM event';
    $s = $this->db->conn_id->query($sql);
    $used_urls = $s->fetchAll(PDO::FETCH_COLUMN, 0);               

    if (in_array($event_url, $used_urls)){
        $this->form_validation->set_message('url_check', 'The URL is already in the database.');
        return FALSE;
    }
    return TRUE;
}
4

1 に答える 1

0

ステートメントを使用してみてください:

$this->form_validation->run() == true

それに応じて条件をコーディングします。それは機能し、理解しやすいでしょう。

于 2013-03-23T04:10:29.883 に答える