我正在尝试在CodeIgniter中使用AJAX和JSON。我以前从未使用过这两种技术,但我已经开始掌握它了。
这就是我想要实现的目标......
在我的网站上,用户可以“喜欢”论坛上其他用户的帖子。我希望love链接旁边的计数器能够使用AJAX和JSON自动更新。
以下是相关代码:
查看: 一个简单的HTML链接,用于为计数添加爱。
<p><a href="#" class="love"><?php if ($post->love) { echo $post->love; } else { echo 0; } ?></a></p>
JQUERY: 单击上面的链接时调用。它调用/ ajax / love_forum_post函数(下面的代码)并传递一些数据用于post和活动用户ID(2和1,我暂时硬编码)。然后它将计数递增1并切换类。
$(document).ready(function(){
$('.love').click(function() {
$.ajax({
type: 'GET',
url: base_url + '/ajax/love_forum_post',
data: { post_id: 2, user_id: 1, ajax: 1 },
});
var num = parseInt($.trim($(this).html()));
$(this).html(++num).toggleClass('loved');
return false;
});
});
控制器: 单击链接时由Ajax调用的函数。
public function love_forum_post()
{
$post_id = $this->input->get('post_id');
$user_id = $this->input->get('user_id');
$is_ajax = $this->input->get('ajax');
if ($is_ajax)
{
$this->load->model('forums_model');
$total_loves = $this->forums_model->add_love($post_id, $user_id);
echo json_encode($total_loves);
}
// If someone tries to access the AJAX function directly.
else
{
redirect('', 'location');
}
MODEL: 最后,调用模型函数来添加对数据库的爱并返回新计数,这是使用JSON在控制器中抓取的(我认为)。
function add_love($post_id, $user_id)
{
// Check that the user has not already loved the post.
$this->db->select('id');
$this->db->from('post_rating');
$this->db->where('post_id', $post_id);
$this->db->where('user_id', $user_id);
$query = $this->db->get();
// If they have not already loved the post.
if ( ! $query->num_rows() > 0)
{
$data = array(
'post_id' => $post_id,
'user_id' => $user_id,
'rating' => 1
);
// If a new love is added, return the new count.
if ($this->db->insert('post_rating', $data))
{
$this->db->select('id');
$this->db->from('post_rating');
$this->db->where('post_id', $post_id);
$this->db->where('user_id', $user_id);
$query = $this->db->get();
return $query->num_rows();
}
}
}
因此...
谢谢,我在PHP,CodeIgniter,AJAX和jQuery方面仍然非常环保。尽管享受挑战!
答案 0 :(得分:3)
你(几乎)已经这样做了。您的json_encode()
'ed返回值是一个整数。试试这个:
<?php
//...
echo json_encode(array('total_loves' => $total_loves));
//...
然后,在你看来......
<?php
// Probably better to pass in these values from
// the controller, but this should work...
$CI =& get_instance();
$token = $CI->security->get_csrf_token_name();
$hash = $CI->security->get_csrf_hash();
?>
$.ajax({
type: 'POST',
url: base_url + '/ajax/love_forum_post',
data: {
post_id: 2,
user_id: 1,
'<?= $token; ?>': '<?= $hash; ?>' // this takes care of the CSRF issue
},
dataType: 'json',
success: function(response) {
alert(response.total_loves); // do something with the return value...
}
});
使用Input
类来判断它是否是一个AJAX请求,而不是传入“ajax”参数...
<?php
$is_ajax = $this->input->is_ajax_request();
我强烈建议使用POST而不是GET,因为假设GET请求不来更改任何数据。 (谷歌“幂等”以更好地理解这个概念......)
至于CSRF保护,我在第一个问题的答案中包含了一个解决方案(见上文)。