【问题标题】:Codeigniter, Vanilla JS: Sending Ajax post request but not recieving any data in phpCodeigniter,Vanilla JS:发送 Ajax 发布请求但未在 php 中接收任何数据
【发布时间】:2017-02-25 00:58:05
【问题描述】:

大家好 我在使用 ajax 发送和接收帖子数据时遇到了一点问题。我对这件事并不陌生。我最近才开始使用 codeigniter 框架,现在,我一直用于 ajax 的模式不再适用了。 (以前从未使用过“外国”框架,但我自己的) 我希望你能帮助我。

主要问题是,php 控制器没有收到 post 数据。

ajax.js(ajax 处理,AJAX_URL 在调用时是 'http://localhost/ajax/process',我已经检查过了):

function AjaxRequest(callback, data) {
   this.data     = (data!== undefined) ? data : [];
   this.callback = callback;
   this.request  = new XMLHttpRequest();

   this.addData = function(key, value) {
      this.data[key] = value;
   };

   this.send = function() {
      var callback = this.callback;
      this.request.open('POST', <b>AJAX_URL</b>, true);
      this.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      this.request.onreadystatechange = function() {
         if (this.readyState === 4 && this.status === 200) {
            callback(this.responseXML);
         }
      };

      var data = this.createPostData();
      this.request.send(data); 
   };

   this.createPostData = function() {
      var data = '';
      for (var key in this.data) {
         data += key + '=' + this.data[key] + '&';
      }
      data = data.slice(0, -1);
      console.log(data);
   };
}

actions.js(包含来自网站的操作处理):

function requestLogin() {
   var username = $("input#txtUsername").val();
   var password = $("input#txtPassword").val();

   var request = new AjaxRequest(callbackLogin);
   request.addData('action'  , 'login_user');
   request.addData('username', username);
   request.addData('password', password);
   request.send();
}

function callbackLogin(xml) {
   console.log(xml);
}

Ajax.php(用于处理 ajax 请求的 CI_Controller):

class Ajax extends CI_Controller {
   public function __construct() {
      parent::__construct();  

      $this->load->library('session');
      $this->load->model('user_model');
   }

   public function process() {
      $data = $this->input->post();
      $action = $data['action'];
      if (method_exists($this, $action)) {
         $this->$action($data);
      }
   }

   public function login_user($data) {
      $passwd_enc = md5($data['password']);
      $xml_resp   = new Xml_response();

      $user = $this->user_model->login_user($data['username'], $passwd_enc);
      $xml_resp->start();
      if (!$user) {
         $xml_resp->error();
         $xml_resp->send_message(Xml_message::ERROR, 'Benutzername oder Kennwort ist inkorrekt.');
      } else {
         $xml_resp->success();
         $xml_resp->send_message(Xml_message::SUCCESS, 'Sie wurden erfolgreich angemeldet.');
         $xml_resp->send_data('user', $user);
      }
      $xml_resp->end();
   }
}

现在,当我尝试发送请求时,方法 process 被调用(通过日志记录检查)但 post 数组为空(在每种可能性中:$_POST 或 codeigniter 自己的 post 数组),我收到一个 null 的 responseXML。

我在这部分有什么做错了吗,还是在使用 codeigniter 时我必须考虑其他事情?

提前非常感谢你,请不要对我糟糕的英语感到震惊(我来自瑞士;)

最好的问候,托拜厄斯·威德纳

【问题讨论】:

  • 看起来您实际上并没有从 login_user() 函数返回任何数据。您可以尝试在函数底部添加行return $xml_resp; 吗?
  • 哦,对不起,我忘了提。调用 $xml_resp->end(); 对整个 xml 内容(通常)执行 echo。但是调用甚至没有发生,因为我没有收到任何发布数据(所以变量 $_POST['action'] 不包含我从 javascript 发送的操作,所以函数 login_user 也不会被调用。

标签: javascript php ajax codeigniter request


【解决方案1】:

尝试在请求 URL 的末尾添加一个斜杠。我不知道您的 codeigniter 配置是否与我的相同,但如果我不在 URL 末尾添加斜杠,我的 .htaccess 会重定向到带有斜杠的 URL。此重定向会删除所有帖子数据。

【讨论】:

  • 也不起作用。是否有可能,我必须在路由中配置 Ajax 控制器?
  • 好的我试过你的代码,我可以在网络检查器中看到 JS 没有发送任何数据。看起来好像 send 方法可能有错误。由于您将 jQuery 用于其他事情,我建议您只使用 $.ajax 来发送请求。 api.jquery.com/jquery.ajax
  • 好的,非常感谢。我总是有点不愿意用jquery(别问我为什么,我也不知道)。但它确实有效! :) 我不知道为什么,但是知道为什么它不适用于 vanilla js 会很有趣。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多