ajax-> Javascript [POST] - > php:传递的文本参数在PHP

时间:2017-08-05 01:32:20

标签: javascript php ajax

新手,第一篇文章(绝望)。我试图获得一个基本的html-> javascript-> ajax(POST) - > php事务(带有传递的args)才能工作。 [我也试过(GET)但应该使用POST来修改服务器状态。右]。

我的问题:而通过POST(js-> ajax-> php)传递的参数会出现在Firefox的开发者工具中的Params列表中 - >网络选项卡,PHP代码看不到它(和isset()= 0)。

我的PHP代码执行正常......我通过将内容记录到磁盘文件来调试。我的SWAG是我用来组装通过.send()发送的参数的语法有问题; [在下面示例中的jsMyFunc()]。我已经尝试过在很多网站上发现的每一个可能的建议,而且我没有想法。

在W7 / 64上使用Firefox 54.0.1与Rasperry Pi 3B对话。 Apache正在混合中。我有很多其他的代码工作(HTML + JS + PHP(服务器端)等等,但这个让我很难过。我对大部分内容都比较新,所以我的代码改编自<sarcasm>过多的缺陷在www</sarcasm>上可以找到免费的例子,但我已经花了12个多小时阅读,测试,阅读等等。因此这篇文章。我将代码简化为最小,所以也许其中一个可以帮助吗?

另外,(有贪婪的风险),发送2个文本参数的语法是什么?我试图这样做很长一段时间,直到我意识到通过一个单一的参数也没有工作。我想向服务器发送2个参数:gpio_bitstate(见下文)。

请不要告诉我这是一个重复的错误...在那里,全部阅读。而且我真的不想学习jquery,KISS是一个非常简单的要求。非常感谢任何帮助。

主要(整个文件)

<!DOCTYPE html>
<html>
<head>
  <script src='jsMyJS.js'></script>
</head>
<body>
  <b><button  type='button' onclick='jsMyFunc()'>Test</button></b>
</body>
</html>

Javascript:jsMyJS.js(整个文件)

function jsMyFunc() {
  console.log('Executing: jsMyFunc()');
  var gpio_bit = 4;
  var state = 0;
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if( this.readyState == 4 ) {
      if( this.status == 200 ) {
         alert( 'DONE' );
      } else {
         alert( 'ERROR: status = ' + status );
      }
    }
  }
  xhttp.open( 'POST', 'pMyPHP.php', true ); 
  xhttp.setRequestHeader( 'Content-Type', 'text/plain', 'Content-length', state.length ); // Or 'text'

  var myArgs = 'state=' + state; // <<<<<<<<<< HERE ???

  xhttp.send( myArgs );
}

PHP:pMyPHP.php(整个文件)

<?php
  // Using file writes to debug server code... sigh...
  $f = fopen("debug.txt", "w");
  fwrite( $f, "\nExecuting: pMyPHP.php()\n" );
  $str = "xxxx";
  fwrite( $f, "str 1 = " . $str . "\n" ); // OK
  if (isset($_POST['state'])) {
    $str = $_POST['state'];
    fwrite( $f, "str 2 = " . $str . "\n" ); // NEVER
  } else {
    fwrite( $f, "str 3 = NULL\n" ); // ALWAYS
  }
  fclose( $f );
?>

2 个答案:

答案 0 :(得分:1)

我测试您的代码并在Content-Type中进行更改

xhttp.setRequestHeader( 'Content-Type', 'text/plain', 'Content-length', state.length ); // Or 'text'

替换为:

xhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded', 'Content-length', state.length ); // Or 'text'

它在debug.txt中写入

Executing: pMyPHP.php()  
str 1 = xxxx  
str 2 = 1

要在状态参数中发送0,请尝试:state =&#39; 0&#39;,(引号之间为零)。

Source

发送2个参数的示例

xhr.send("foo=bar&lorem=ipsum");

答案 1 :(得分:0)

非常感谢user2505515。你得到了所有。我永远不会 找到了内容类型修复,&#39;文字&#39;或&#39; text / plain&#39;似乎是正确的 记录在案。我发送int(0)而不是&#39; 0&#39;是 我应该抓住的东西......额外的眼睛确实有帮助。事实上,如果 我发送了任何其他可能有效的非零int(通过 事故)在Content-Type修复之后。 因此,发送2个a​​rgs的固定(已测试)代码段为:

xhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
var myArgs = 'state=' +  state.toString() + '&' + 'gpio_bit=' +  gpio_bit.toString();
米歇尔,我确实看过那篇帖子......我只是错过了森林的树木。 我想,太多人阅读了太多[对我而言]新的代码片段。 感谢您的投入。 这是一个很棒的网站。我学到了很多东西。