我是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;
}
}
?>
答案 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)
你需要的不仅仅是解决下拉问题。
转到这个链接: 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
永远不应该回应!!将$ 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在关闭时都会将视图推送到输出,而不是在加载它们之后!