CodeIgniter:AJAX和JSON的问题

时间:2012-03-10 22:37:46

标签: php jquery ajax json codeigniter

我正在尝试在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();

        }

    }

}

因此...

  1. 我如何用JSON获取这个新的爱情数量并让我的计数器显示新的总数?
  2. 我的代码中还有其他内容需要更改/改进吗?
  3. 最后,我无法使用POST方法,因为我启用了CSRF保护。我怎么能改变我的代码以允许使用POST方法而不是GET?或者GET方法可以吗?
  4. 谢谢,我在PHP,CodeIgniter,AJAX和jQuery方面仍然非常环保。尽管享受挑战!

1 个答案:

答案 0 :(得分:3)

1。我如何用JSON获取这个新的爱情数量并让我的计数器显示新的总数?

你(几乎)已经这样做了。您的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...
    }
});

2。我的代码中还有其他什么需要更改/改进吗?

使用Input类来判断它是否是一个AJAX请求,而不是传入“ajax”参数...

<?php
$is_ajax = $this->input->is_ajax_request();

3。最后,我无法使用POST方法,因为我启用了CSRF保护。我怎么能改变我的代码以允许使用POST方法而不是GET?或者GET方法可以吗?

我强烈建议使用POST而不是GET,因为假设GET请求来更改任何数据。 (谷歌“幂等”以更好地理解这个概念......)

至于CSRF保护,我在第一个问题的答案中包含了一个解决方案(见上文)。