【问题标题】:Get a single row from the database using AJAX in CodeIgniter?在 CodeIgniter 中使用 AJAX 从数据库中获取单行?
【发布时间】:2014-07-17 15:59:02
【问题描述】:

我想知道如何在 CodeIgniter 中使用 AJAX 从数据库中获取数据。您能否检查下面的代码以找出问题的原因?当我从我的视图中单击链接时,没有任何反应。

这是我的看法:

<a href="#" class="faq_title"><?php echo $faq_title; ?></a>

这是我的控制器:

public function get_faq_data() {
    $this->load->model("model_faq");
    $title = $_POST['title'];
    $data["results"] = $this->model_faq->did_get_faq_data($title);
    echo json_encode($data["results"]);
}

这是我的模型:

public function did_get_faq_data($title) {
    $this->db->select('*');
    $this->db->from('faq');   
    $this->db->where('faq_title', $title); 

    $query = $this->db->get('faq');

    if ($query->num_rows() > 0) {
        return $query->result();
    } else {
        return false;
    }
}    

这是我的 JavaScript 文件:

$(".faq_title").click(function() {
    var title = $(this).text();

    $.ajax({
        url: 'faq/get_faq_data',
        data: ({ title: title }),
        dataType: 'json', 
        type: 'post',
        success: function(data) {
            response = jQuery.parseJSON(data);
            console.log(response);
        }             
    });
});

【问题讨论】:

  • 如果您希望 AJAX 调用轻松解析和使用数据,请查看 json_encode()。查看 this 了解更多想法
  • 我还建议在控制器中使用 json 视图并返回而不是“回显”。我认为 CI 传递了一些可能导致 json 出现问题的标头。
  • @David JSON 视图绝对是执行此操作的正确方法,特别是如果您在配置中设置compression = true,否则您的应用程序将被炸毁。我个人在简单地回显它时从未见过标题问题,特别是如果您告诉 AJAX 调用期望 JSON 返回字符串,但再一次,永远不要说永远 =)
  • 您现在可以检查一下吗?

标签: php jquery ajax json codeigniter


【解决方案1】:

试试这个:

$(function(){ // start of doc ready.
   $(".faq_title").click(function(e){
      e.preventDefault();  // stops the jump when an anchor clicked.
      var title = $(this).text(); // anchors do have text not values.

      $.ajax({
        url: 'faq/get_faq_data',
        data: {'title': title}, // change this to send js object
        type: "post",
        success: function(data){
           //document.write(data); just do not use document.write
           console.log(data);
        }
      });
   });
}); // end of doc ready

我看到的问题是var title = $(this).val();,因为您的选择器$(".faq_title") 是一个锚点,而锚点的文本不是值。所以我建议你使用.text() 而不是.val()

【讨论】:

  • 感谢您的回答。我刚刚编辑了我的代码,但单击链接时仍然没有任何反应。你能再检查一下我的代码吗?
  • 好的,谢谢,现在我应该学习如何传递js对象而不是变量
  • 您现在可以检查一下吗?
【解决方案2】:

在我看来,您并没有将锚标记用于其预期目的,所以也许只使用&lt;p&gt; 标记或其他东西。理想情况下,您应该使用id 整数而不是title 来标识数据库中的一行。

查看:

<p class="faq_title"><?php echo $faq_title; ?></p>

如果您有一个id 整数,则可以使用$_GET 请求并接收id 作为get_faq_data() 方法的唯一参数。

控制器:

public function faqByTitle(): void
{
    if (!$this->input->is_ajax_request()) {
        show_404();
    }
    $title = $this->input->post('title');
    if ($title === null) {
        show_404();
    }
    $this->load->model('model_faq', 'FAQModel');
    echo json_encode($this->FAQModel->getOne($title));
}

常见问题模型:

public function getOne(string $title): ?object
{
    return $this->db->get_where('faq', ['faq_title' => $title])->row(); 
}    

JavaScript:

$(".faq_title").click(function() {
    let title = $(this).text();

    $.ajax({
        url: 'faq/faqByTitle',
        data: {title:title},
        dataType: 'json', 
        type: 'post',
        success: function(response) {
           console.log(response);
        }             
    });
});

这些 sn-ps 均未经过测试。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多