1

计划

我的计划是使用 JQUERY 从视图内的三个字段中检索输入。然后使用 AJAX 将该输入发送到控制器,然后控制器将该数据发送到模型。要用于检索数据,请将结果发送回 .js 文件,然后修改表格以在视图中显示数据。

问题

查看我的代码,看起来数据没有从 .js 文件发送到控制器。我认为这是因为数据库中的数据没有显示在修改后的表中。此外,当我在控制器中放置回显以发送回 .js 以触发警报时,以查看 AJAX 是否成功。什么都没发生。

我的 Javascript 代码

 $('#bttnSubmit').click(function() {
        // Gather the input from the view and place them into variables
        var company = $('#client :selected').val();
        var dateFrom = $('#dateFrom').val();
        var dateTo = $('#dateTo').val();

        if (company != "") {
            var post_url = "http://localhost/ProjectSage/index.php/site/members_area";

            $.ajax ({
                type: "POST",
                url: post_url,
                cache: false,
                data: "company=" + company + "&dateFrom=" + dateFrom + "&dateTo=" + dateTo,
                success: function(invoices) {
                    $.each(invoices, function(InvoiceID, CompanyName, InvRef, InvDate, InvTotal, SageReference){
                        $('.invoice_tbody').append('<tr>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + InvoiceID + '</td>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + CompanyName + '</td>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + InvRef + '</td>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + InvDate + '</td>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + InvTotal + '</td>');
                            $('.invoice_tbody').append('<td class="invoice_td">' + SageReference + '</td>');
                        $('.invoice_tbody').append('</tr>');
                    });
                } // End of success
            }) // End of AJAX method
        } else {
            alert("You need to select an input first!!!");
        } // End of if statement
    }); // End of click function

我的控制器功能代码

  function get_invoices() {
  // Retrieve the data sent from the .js file using _POST method
  $company = $_POST['company'];
  $dateFrom = $_POST['dateFrom'];
  $dateTo = $_POST['dateTo'];

  // Load invoice_model
  // Initialise the JSON header
  // Encode the response using the parameters sent from the .js file and send it back to the .js file
  $this->load->model('invoice_model');
  header('Content-Type: application/x-json; charset=utf-8');
  echo(json_encode($this->invoice_model->get_invoices($company, $dateFrom, $dateTo)));
 }

我的模型功能代码

function get_invoices($company, $dateFrom, $dateTo) {

// Query to retrieve data from database
// Sent it back to the controller to be populated into a table

$ONEDB = $this->load->database('ONEDB', TRUE);
$ONEDB->select('InvoiceID, CompanyName, InvRef, InvDate, InvTotal, SageReference'); 
$ONEDB->where('ClientID', $company);
$ONEDB->where('InvDate >=', $dateFrom);
$ONEDB->where('InvDate <=', $dateTo);
$ONEDB->join('Supplier', 'Supplier.SupplierName = InvDetail.InvSupplier');

$query = $ONEDB->get('InvDetail');

$result = $query->result();

return $result;

}

问题

有谁知道我哪里出错了,我的问题的解决方法是什么???

谢谢

4

5 回答 5

1

好的,让我们从头开始。1)在您的JS上,在以下位置发出警报:

var company = $('#client :selected').val();
    var dateFrom = $('#dateFrom').val();
    var dateTo = $('#dateTo').val();
ALERT(company, dateFrom, dateTo );

看看变量是否有数据。如果是这样,请继续。2)检查网址。将您的网址粘贴到浏览器上,然后查看控制器是否实际被调用。如果不是,请修复该网址。

3)将您的ajax调用更改为jquery,它更简单。还在您的成功代码中添加一个警报。

var url = "http://...";
var dataToSend= {company: company, dateFrom: dateFrom.....};
    $.post(url, dataToSend, function(data) {

       ALERT(data);

    });

4) 在 PHP 控制器上,测试是否正在接收数据,如下所示:

function get_invoices() {
  $company = $this->input->post('company');
  $dateFrom= $this->input->post('dateFrom');
  $dateTo= $this->input->post('dateTo');

  echo $company; 
  echo $dateFrom; 
  echo $dateTo;

}

5)你得到了什么?

于 2013-09-05T16:56:14.640 回答
0

嗯..尝试将您的ajax调用更改为:

var url = "http://...";
var dataToSend= {company: company, dateFrom: dateFrom.....};
    $.post(url, dataToSend, function(data) {

       ...sucess code

    });
于 2013-09-05T16:45:42.107 回答
0

您应该在调用中定义一个error函数。$.ajax因此,您会看到是否出现内部服务器错误,这也是可能的。

此外,您可能在 CodeIgniter 中启用了 CSRF 保护,因此您还必须将 CSRF 哈希传递给服务器。

于 2013-09-05T16:30:05.553 回答
0

我的疑问是..控制器功能的设置路径不正确

您发布数据的网址是

var post_url = "http://localhost/ProjectSage/index.php/site/members_area";

你的控制器功能在哪里

function get_invoices() {
 ....

ajax url 选项,路径应该指向你的控制器函数,我怀疑它在你的代码中指向它。

不确定,但我认为应该是

var post_url = "http://localhost/ProjectSage/index.php/site/members_area/get_invoices";

如果 members_area 是您的控制器。

最好将数据作为对象发送。

 data: {"company":company,"dateFrom":dateFrom,"dateTo":dateTo},

使用 echo json_encode 时不需要使用内容类型。

$this->load->model('invoice_model');
echo json_encode($this->invoice_model->get_invoices($company, $dateFrom, $dateTo));
于 2013-09-05T16:30:39.163 回答
0

我认为问题在于您如何将数据发送到控制器。在您的 AJAX 调用中,您有以下内容:

$.ajax({
   type: "POST",
   url: post_url,
   cache: false,
   data: "company=" + company + "&dateFrom=" + dateFrom + "&dateTo=" + dateTo,
 });

您正在以 GET 格式发送数据。为了让 PHP 接收帖子,您应该执行以下操作:

$.ajax({
   type: "POST",
   url: post_url,
   cache: false,
   data: {company: company, dateFrom:dateFrom , dateTo:dateTo}
 });

另外,在您的控制器中,尝试使用 Codeigniter 的帮助器,如下所示:

$company = $this->input->post('company');
$dateFrom= $this->input->post('dateFrom');
$dateTo= $this->input->post('dateTo');
于 2013-09-05T16:34:15.193 回答