计划
我的计划是使用 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;
}
问题
有谁知道我哪里出了问题以及我的问题的解决方案是什么???
谢谢
好的,让我们从头开始。1)在您的JS上,在以下之后发出警报:
var company = $('#client :selected').val();
var dateFrom = $('#dateFrom').val();
var dateTo = $('#dateTo').val();
ALERT(company, dateFrom, dateTo );
查看变量是否有数据。如果是这样,请继续。2)检查网址。将您的 URL 粘贴到浏览器上,然后查看控制器是否实际被调用。如果不是,请修复该网址。
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)你会得到什么?
你应该在调用中定义一个error
函数$.ajax
。因此,您将看到是否出现内部服务器错误,这也是可能的。
此外,您可能在 CodeIgniter 中启用了 CSRF 保护,因此您还必须将 CSRF 哈希传递给服务器。
我认为问题在于如何将数据发送到控制器。在 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');
我的怀疑是..控制器功能的设置路径不正确
您发布数据的网址是
var post_url = "http://localhost/ProjectSage/index.php/site/members_area";
其中,您的控制器功能是
function get_invoices() {
....
Ajax URL 选项 ,路径应该指向您的 contoroller 函数,我怀疑它在您的代码中指向该函数。
不确定,但我认为应该是
var post_url = "http://localhost/ProjectSage/index.php/site/members_area/get_invoices";
如果members_area你是这里的控制器。
最好将数据作为对象发送。
data: {"company":company,"dateFrom":dateFrom,"dateTo":dateTo},
使用回显json_encode时不需要使用内容类型。
$this->load->model('invoice_model');
echo json_encode($this->invoice_model->get_invoices($company, $dateFrom, $dateTo));
嗯,尝试将ajax调用更改为:
var url = "http://...";
var dataToSend= {company: company, dateFrom: dateFrom.....};
$.post(url, dataToSend, function(data) {
...sucess code
});