用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2375|回复: 8
收起左侧

[已解决] Form表单提交时候报错

[复制链接]
发表于 2016-10-19 09:08:59 | 显示全部楼层 |阅读模式
新手:刚学CI一个星期,还望各位大牛帮忙解答下疑惑,感激感激~~
问题1:
控制器中的create()方法在执行规则判断时候,视图创建表单的页面都还没有被加载,怎么就直接先使用表单中就是下面的这段代码,
表单的tille和text都没有被提交怎么就先进行判断是否为空,然后判断完了才加载视图的这个表单
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('text', 'Text', 'required');
   if ($this->form_validation->run() === FALSE)
    {
        $this->load->view('templates/header', $data);
        $this->load->view('news/create');
        $this->load->view('templates/footer');
    }
问题2:我感觉CI这些表单验证函数,是不是直接使用PHP的原生功能更方面点,
比如view下面使用PHP原生的语法创建form表单,model下面进行form数据接收,就是还是使用MVC模型,但是里面的语法基本还是PHP原生的
新手可能刚学,感觉不到CI的方便之处

问题3:我成功提交了表单后数据没有提交,所以success也米有加载。页面显示http 404无法访问

-----------------------------------------------------------------------------------------
控制器:
<?php
class News extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->model('news_model');
        $this->load->helper('url_helper');
    }
public function create()
{
    $this->load->helper('form_helper');
    $this->load->library('form_validation');
    $data['title'] = 'Create a news item';
    $this->form_validation->set_rules('title', 'Title', 'required');
    $this->form_validation->set_rules('text', 'Text', 'required');
    if ($this->form_validation->run() === FALSE)
    {
        $this->load->view('templates/header', $data);
        $this->load->view('news/create');
        $this->load->view('templates/footer');
    }
    else
    {
        $this->news_model->set_news();
        $this->load->view('news/success');
    }
}

-------------------------------------------------------------
视图
<h2><?php echo $title; ?></h2>
<?php echo validation_errors(); ?>
<?php echo form_open('news/create'); ?>
    <label for="title">Title</label>
    <input type="input" name="title" /><br />
    <label for="text">Text</label>
    <textarea name="text"></textarea><br />
    <input type="submit" name="submit" value="Create news item" />
</form>
--------------------------------------------------------------
模型
<?php
class News_model extends CI_Model{
public function __construct(){
  $this->load->database();
}

public function set_news()
{
    $this->load->helper('url');
    $slug = url_title($this->input->post('title'), 'dash', TRUE);
    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'text' => $this->input->post('text')
    );
    return $this->db->insert('news', $data);
}
}
?>

 楼主| 发表于 2016-10-19 14:35:33 | 显示全部楼层
本帖最后由 Closer 于 2016-10-19 14:54 编辑

新手碰到的问题自己研究测试总结了下:
CI中表单提交的action的设置方法:传统中的html中是提交到页面,CI中是提交到控制器中的某一个方法,以下自己的总结,如有错误请指出哈

1:<form action="http://localhost:8080/ci/index.php/news/create" method="post">

2:<form action="<?php echo site_url('news/create') ;?>"         method="post">
    但是这个方法要加载
    $this->load->helper('url'); 因为使用了helper_url.php中的site_url方法
    并设置 appalication config.php下面$config['base_url'] = 'http://localhost:8080/ci/';

3:<?php echo form_open(site_url('news/create')); ?>
        但是这个方法要加载:
        $this->load->helper('url'),因为使用了helper_url.php中的site_url方法
        $this->load->helper('form'),因为使用了helper_form.php中的form_open方法
        并设置 appalication config.php下面$config['base_url'] = 'http://localhost:8080/ci/';

4:<?php echo form_open('http://localhost:8080/ci/index.php/news/create'); ?>
        但是这个方法要加载:
        $this->load->helper('form'),因为使用了helper_form.php中的form_open方法

评分

参与人数 1威望 +2 收起 理由
Closer + 2 支持此風氣

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-19 10:07:05 | 显示全部楼层
1.
你是 post 進 create() 吧 ?
記得只要 post 時 form_validation 就會檢查
用 get 進入應該就沒這問題

2.
form_open 的好處除了把參數直接扔進 () ,也對 csrf 功能的開關有幫助
開啟 csrf 功能時使用 form_open 則會自動加 token
若無使用,得自己加 <input type="hidden" ... > 隱藏欄位來傳遞 token

3.
去看看 "檢視網頁原始碼" form_open('news/create') 的路徑為何
$this->news_model->set_news(); 前呼叫 $fp = $this->input->post(null);
看看 $fp 有沒有拿到數據

 
 楼主| 发表于 2016-10-19 10:45:28 | 显示全部楼层
感谢“Closer ”的答复~
问题1:form_open 默认是用post,所以如您解释的应该是提交到contrller里面的create 时候系统会检查。问题1我已经解决
            那如果Ci里面是否有默认使用get方式的?我会待会百度下学习看看
问题2:可能是我初学用的不多。form_open(参数1,参数2,参数3),参数1action地址,参数2和参数3确实方便多了。学习中。问题2已经解决
问题3:我刚把URL改成绝对地址<?php echo form_open('http://localhost:8080/ci/index.php/news/create'); ?>就可以了,是不是这个action地址必须是绝对地址哇?


发表于 2016-10-19 10:55:22 | 显示全部楼层
贪吃的小猪 发表于 2016-10-19 10:45
感谢“Closer ”的答复~
问题1:form_open 默认是用post,所以如您解释的应该是提交到contrller里面的creat ...

1 我不是指 form_open,而是你到 create() 這個 function 時,是 Post 進入的吧 ?
3 請使用 site_url(),參閱:CI 手冊 - URL 輔助函數


 
发表于 2016-10-19 11:05:15 | 显示全部楼层
问题还挺多,哈哈~

我简单说一点吧,就是 form 我建议你直接用 HTML 去写,不用 form helper。表单验证类还是很好用的,如果你自己写这几行代码可是做不了完善的表单验证的。
 楼主| 发表于 2016-10-19 11:30:35 | 显示全部楼层
表單提交的地址問題
1:配置文件中 設置   $config['base_url'] = 'http://localhost:8080/ci/';
2:表單中使用<?php echo form_open(site_url('news/create')); ?>
這些東西還是有點不習慣雖然找到點原因了
发表于 2016-10-19 14:50:25 | 显示全部楼层
贪吃的小猪 发表于 2016-10-19 14:35
新手碰到的问题自己研究测试总结了下:
CI中表单提交的action的设置方法:传统中的html中是提交到页面,CI ...

楼主总结的这些在手册里都有明确说明,仔细看手册就可以避免。

另外,关于提交表单的问题,实际上 CI 也是提交到页面,只是 CI 的一个页面是由一个方法来提供的。楼主要从更高的角度来考虑什么是“页面”。
 楼主| 发表于 2016-10-19 14:51:53 | 显示全部楼层
嗯嗯新手继续学习中

本版积分规则