CodeIgniter下拉列表未填充在正确的位置

时间:2014-03-10 19:52:05

标签: php codeigniter

我是CI和PHP的新手。我有一个由数据库中的表填充的国家/地区下拉列表。我已经设法让CI通过mysql抓取并呈现数据,但是它在我的表单上方以纯文本填充,而不是在下拉列表的值中填充。以下是简化代码。如何在下拉列表中获取值?

我的观点......

<body>

<?php echo validation_errors(); ?>

<?php echo form_open('form'); ?>

<h5>Country</h5>
<select name="countryselect">
<?php echo form_dropdown(countryselect);?>
</select>

<br><br>

<div><input type="submit" value="Submit" /></div>

<?php echo form_close() ?>

</body>

我的控制器......

<?php

class Form extends CI_Controller {

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

        $this->form_validation->set_rules('firstname', 'First Name', 'trim|required|max_length[12]|xss_clean');
        $this->form_validation->set_rules('lastname', 'Last Name', 'trim|required|max_length[12]|xss_clean');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
        $this->form_validation->set_rules('pledge', 'Pledge', 'trim|required|max_length[12]|decimal|xss_clean');

        $this->load->model('country');
        $data['country'] = $this->country->get_country();

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

            $sql = "INSERT INTO donations (firstname, lastname, email, pledge) VALUES (
            ".$this->db->escape($this->input->post('firstname')).",
            ".$this->db->escape($this->input->post('lastname')).",
            ".$this->db->escape($this->input->post('email')).",
            ".$this->db->escape($this->input->post('pledge')).")";

            $this->db->query($sql);

            echo $this->db->affected_rows(); 

            $this->load->view('formsuccess');
        }
    }
}
?>

我的模特......

<?php

class Country extends CI_Model
{

function get_country() {
    $this->load->database();
    $return[''] = 'please select';
    $this->db->order_by('name'); 
    $query = $this->db->get('countries'); 
    foreach($query->result_array() as $row){
        echo '<option value="'.$return[$row['id']] = $row['name'].'">',$return[$row['id']] = $row['name'],'</option>'. "\n";
    }
    return $return;
}
}
?>

2 个答案:

答案 0 :(得分:0)

您的代码有点混乱,就像您在

中命名country而不是countryselect一样
$data['country'] = $this->country->get_country();

因此在视图中使用$country作为变量。 最重要的是,form_dropdown需要array作为参数,而不是option

看看here;

如果您想以这种方式创建选择,则不需要form_dropdown,只需要定期html

<select name="select_country"><?php echo $country; ?></select>

您需要将其传递给您的观点:

$this->load->view('myform', $data);

编辑:

请记住Controller != Model != View并且您必须将它们用于单一目的。

您使用控制器在数据库中保存数据,这是完全错误的,您应该将数据传递给模型并让它执行查询......您真的应该使用ActiveRecord来代替sqlinjection

在您的模块中,您管理数据,即使您可以创建选择,更好的方法是将查询结果传递给控制器​​并让它管理它。

答案 1 :(得分:0)

你需要的不仅仅是解决下拉问题。

1 Codeigniter DOCUMENTATION

转到这个链接: http://ellislab.com/codeigniter/user-guide/helpers/form_helper.html

然后向下滚动到drop_down函数();

你将了解这个函数做什么以及如何使用。

然后转到

http://ellislab.com/codeigniter/user-guide/database/active_record.html#insert

您将了解如何将数据插入数据库。

对于大多数不喜欢在控制器和模型中回应的基础知识,你会逐渐了解它。

-------旧评论

至于你下拉:

//CI Accept parameters 
echo $this->form_dropdown('NAME OF INPUT',array('optionValue'=>'label of option',...);

这会产生一个

<select namr='name of input'>
    <option value='optionValue'>label of option </option>
</select>

现在更重要的是你建模问题:

CI查询构建器可以为你做数据敏感,你不需要为简单的get数据调用运行原始查询。

替换示例

$sql = "INSERT INTO donations (firstname, lastname, email, pledge) VALUES (
        ".$this->db->escape($this->input->post('firstname')).",
        ".$this->db->escape($this->input->post('lastname')).",
        ".$this->db->escape($this->input->post('email')).",
        ".$this->db->escape($this->input->post('pledge')).")";

        $this->db->query($sql);

更好的

$data= array ('firstname'=>$this->input->post('firstname'),
          'lastname'=>$this->input->post('lastname')
//              ... etc
          );
$ins = $this->db->insert('donations',$data);
echo $this->db->affected_rows(); //or what ever

2:class Country扩展CI_Model

永远不应该回应!!将$ query返回给控制器并让控制器执行类似

的操作
foreach($query->result() as $r) {
    $dropdown[] = array( $r->id => $r->name);
}

然后返回$ dropdown以查看您只能echo form('countrySELECT',$dropdown);

的位置

尝试更多地了解oop并实现它。永远不要在控制器或模型中回响;

并提供您的信息,

echo "1";
$this->load->view('aViewThatEcho2');
echo "3";

将导致132而不是123,因为在完成所有内容后,CI在关闭时都会将视图推送到输出,而不是在加载它们之后!