我是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;
}
}
?>
你的代码有点乱,顺便说一下,你在
中命名了country
而不是countryselect
$data['country'] = $this->country->get_country();
所以使用$country
作为视图中的变量。最重要的是,form_dropdown
需要一个array
作为参数,而不是option
。
看这里;
如果你想以这种方式创建选择,你不需要form_dropdown
,只需要常规的html
:
<select name="select_country"><?php echo $country; ?></select>
你需要把它传递给你的视图:
$this->load->view('myform', $data);
编辑:请记住,Controller != Model != View
和您必须为单一目的使用它们。
你使用你的控制器在数据库中保存数据,这在概念上是错误的,你应该把数据传递给你的模型,让它执行查询…你真的应该用ActiveRecord来代替它来防止sqlinjection
。
在你的模块你管理数据,创建选择,即使你可以,更好的事情是传递查询结果到控制器,让它管理
你需要的不仅仅是解决下拉菜单问题。
1 Codeigniter文档
转到这个链接:http://ellislab.com/codeigniter/user-guide/helpers/form_helper.html
然后向下滚动到drop_down function();
,你会明白这个函数是做什么的,以及如何使用。
然后转到
http://ellislab.com/codeigniter/user-guide/database/active_record.html插入
您将了解如何向数据库插入数据。
至于控制器和模型中最基本的不回显,你会慢慢学会的。
——老评论
As for you
//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查询生成器可以为u做数据敏感化,并且你不需要为简单的get data调用运行原始查询。
替换
$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);
With better
$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 extends CI_Model
永远不要回显!!;向控制器返回$query并让控制器执行类似
的操作foreach($query->result() as $r) {
$dropdown[] = array( $r->id => $r->name);
}
然后返回$下拉菜单查看,你可以简单地echo form('countrySELECT',$dropdown);
尝试更多地了解oop并实现它。决不在控制器或模型中返回;
和你的信息
echo "1";
$this->load->view('aViewThatEcho2');
echo "3";
将导致132
而不是123
,因为视图都是在CI完成所有操作后关闭时推送到输出的,而不是在加载它们之后!