Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery ajax无法使用数据参数发布_Javascript_Php_Jquery_Ajax_Json - Fatal编程技术网

Javascript JQuery ajax无法使用数据参数发布

Javascript JQuery ajax无法使用数据参数发布,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我正在尝试使用JQuery Ajax发布一个简单的联系人表单,使用PHP作为处理程序: alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data)); Index.html <form name="signup-form" method="post" accept-charset="utf-8" class="signup-form"> <input class="sign

我正在尝试使用JQuery Ajax发布一个简单的联系人表单,使用PHP作为处理程序:

alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
Index.html

<form  name="signup-form" method="post" accept-charset="utf-8" class="signup-form">
   <input class="signup-input" type="email" name="email_address" value="" placeholder="enter your email..." title="Please enter a valid email address." required>
   <input type="submit" class="submit-btn" value="GO"/>
</form>
alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
编辑的PHP-server.PHP

<?php
header('Access-Control-Allow-Origin: *');


if (is_ajax()) {
  if (isset($_POST["action"]) && !empty($_POST["action"])) { //Checks if action value exists
    $action = $_POST["action"];
    switch($action) { //Switch case for value of action
      case "test": test_function(); break;
    }
  }
}

//Function to check if the request is an AJAX request
function is_ajax() {
  return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}

function test_function(){

  header("Content-Type: application/json");
  echo json_encode($_POST);
}
alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));

我不确定您到底想做什么,但有一点很明显,您的PHP代码返回了一个嵌套对象

{email_address: "{"email_address":"asdf@asdf.org","action":"test"}", action: "test"}
alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
这就是您的JSON在返回时的样子。如果只想将$\u POST数据吐回浏览器,只需执行以下操作:

function test_function(){
  echo json_encode($_POST);
}
alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
然后在JS端的成功方法中修改您的警报:

alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
还有一件事,在php代码中设置内容类型头是一个非常好的主意,可能是在您检查X-Requested-With之后,但在您向浏览器吐出任何数据之前:

alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
header('Content-type: application/json');

我找到了它不起作用的原因

alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
您的
是\u ajax()
检查此
$\u服务器['HTTP\u X\u REQUESTED\u WITH']
,如果您使用的是CORS,则不会设置此服务器。因此,一个简单的解决方法就是禁用此检查

alert("Form submitted successfully.\nReturned json:\n" + JSON.stringify(data));
<?php
header('Access-Control-Allow-Origin: *');
header("Content-Type: application/json");

//print_r($_SERVER);

if (isset($_POST["action"]) && !empty($_POST["action"])) { //Checks if action value exists
  $action = $_POST["action"];
  switch($action) { //Switch case for value of action
    case "test": test_function(); break;
  }
}

function is_ajax() {
  return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}

function test_function(){
  $return = $_POST;

  //$return["email_address"] = json_encode($return);
  echo json_encode($return);
  exit;
}

看起来您根本没有输出JSON(在Inspector中检查您的响应)。我知道,即使我对发布的输出进行了
JSON\u编码,
dataType
也会注意到它的返回类型“XHR”。
dataType
是您期望从服务器返回的数据类型。我认为您还应该放置JSON头:
header('Content-Type:application/JSON')关注PHP,您的javascript很好。问题不在于jQuery,而很可能是PHP代码发送的响应。此外,检查
$\u服务器['HTTP\u X\u REQUESTED\u with']
也不是100%可靠的。既然您已经检查了
$\u POST[“action”]
,您可以添加AJAX标志(如GET或POST)。在我这里的用例中,我可以设置
标题('Content-type:application/json')$\u POST
数据之前,代码>就在我的
test\u函数中,因为我仍然收到相同的错误?只要你在调用test\u函数之前没有向屏幕回显任何内容,那么它就不会给你错误。也就是说,我猜最终您将添加其他方法来完成实际有用的工作,并且所有这些方法都希望设置content-type标头,以便在确定您已收到XHR请求后进行设置更有意义。正如其他人指出的,这并不总是存在的,但是jQueryAjax应该总是设置它。我已经删除了它。您可以发布您正在运行的完整php代码段吗?这是完整的代码段。确保server.php是可访问的,并且位于您期望的位置。您可以首先编辑server.php以回显“hello world”或其他内容,然后访问远程URL以查看它是否确实是正确的文件。为了重现我的运行方式,我基本上使用xampp在htdocs位置创建了该文件
server.php
,并在javascript文件中直接指向它。文件被找到了,否则我会收到404错误,它仍然不工作吗?您的主机服务器是否可能阻止CORS?尝试添加一个
.htaccess
文件,包括
标题集访问控制允许原点“*”
。哦,你是在自己的电脑上测试这个吗?您是否转发了端口以便可以使用外部IP进行测试?在我尝试使其正常工作时,一切都是本地的。server.php文件引用自运行localhost的htdocs