我正在尝试使用codeigniter向数据库插入一行。
基于模型的 post.php中
class Post extends CI_Model{
function get_posts($num=20, $start=0){
$this->db->select()->from('posts')->where('active',1)->order_by('date_added','desc')->limit($num,$start);
$query=$this->db->get();
return $query->result_array();
}
function get_post($postid){
$this->db->select()->from('posts')->where(array('active' => 1, 'postID'=>$postid))->order_by('date_added','desc');
$query=$this->db->get();
return $query->first_row('array');
}
function insert_post($data){
$this->db->insert('posts',$data);
return $this->db->return_id();
}
控制器 - 的 posts.php
class Posts extends CI_Controller{
function __construct(){
parent::__construct();
$this->load->model('post');
}
function index(){
$data['posts'] = $this->post->get_posts();
$this->load->view('post_index', $data);
}
function post($postid){
$data['post']=$this->post->get_post($postid);
$this->load->view('post',$data);
}
function new_post(){
if($_POST){
$data =array(
'title'=>$_POST['title'],
'post'=>$_POST['post'],
'active'=>1
);
$this->post->insert_post($data);
redirect(base_url());
}
else{
$this->load->view('new_post');
}
}
查看 - 的 new_post.php
<form action="<?php base_url(); ?>posts/new_post" method="action">
<p>Title: <input type="text" name="title"></p>
<p>Description: <input type="textarea" name="post"></p>
<input type="submit" value="Add post">
</form>
索引视图 - post_index.php
foreach ($posts as $post) { ?>
<div id-="container">
<div><h3><a href="<?php base_url(); ?>post/<?php echo $post['postID']; ?>"><?php echo $post['title']; ?> </a></h3>
<?php echo $post['post']; ?>
</div>
</div>
<?php
}
索引页面显示db的所有帖子。单击标题后,post.php视图显示相应的数据。这部分很好。
在尝试在new_post.php中添加新帖子时,它没有反映在db中,也没有显示任何错误。
我也在插入后使用redirect_url重定向到索引页面。所以它显示了相同的可用帖子。点击标题后,它会反复将帖子/帖子添加到网址。
重定向网址后点击标题一次显示
再次单击标题时会添加
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:0)
在您的模型中
function insert_post($newpost){
$this->db->insert('posts',$newpost);
// check if the record was added
if ( $this->db->affected_rows() == '1' ) {
// return new id
return $this->db->insert_id();}
else {return FALSE;}
}
必须验证任何用户输入。如果您使用Codeigniter,则使用其表单验证并使用其输入库,如:
$this->input->post('title')
博客帖子的示例位于教程https://ellislab.com/codeIgniter/user-guide/tutorial/create_news_items.html
中否则在您的控制器中 - 检查新帖子ID是否未从模型返回 - 如果它没有返回,那么只需在同一个控制器中转到错误方法,这样您就不会丢失php错误消息。
if ( ! $postid = $this->post->insert_post($newpost); ){
// passing the insert array so it can be examined for errors
$this->showInsertError($newpost) ; }
else {
// success now do something else ;
}
答案 1 :(得分:0)
整个应用程序中存在许多问题。这些是我发现的:
<强>视图强>
new_post
视图中的两个问题。
你没有回应你的base_url
。您需要替换表单的操作属性。
method
属性应该包含post
或get
。在这种情况下,它应该是post
像这样改变:
由此:
<form action="<?php base_url(); ?>posts/new_post" method="action">
对此:
<form action="<?= base_url(); ?>posts/new_post" method="post">
或者你可以这样做:
<form action="<?php echo base_url(); ?>posts/new_post" method="post">
<强>控制器强>
在posts
控制器中,您的new_post()
功能应如下所示:
function new_post() {
if ($this->input->post()) {
$data = array(
'title' => $this->input->post('title'),
'post' => $this->input->post('post'),
'active' => 1
);
$id = $this->post->insert_post($data);// this is the id return by your model.. dont know what you wann do with it
// maybe some conditionals checking if the $id is valid
redirect(base_url());
} else {
$this->load->view('new_post');
}
}
<强>模型强>
函数insert_post()
不应该有$this->db->return_id();
,而应该是$this->db->insert_id();