【问题标题】:ajax->Javascript[POST]->php: passed text param not seen in PHPajax->Javascript[POST]->php: 传递的文本参数在 PHP 中看不到
【发布时间】:2017-08-05 01:32:19
【问题描述】:

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

我的问题:虽然通过 POST (js->ajax->php) 传递的参数确实出现在 Firefox 的开发人员工具-> 网络选项卡中看到的参数列表中,但 PHP 代码没有看到它(并且 isset() = 0).

我的 php 代码确实执行得很好...我正在通过将内容记录到磁盘文件来进行调试。我的 SWAG 是我用来组装通过 .send() 发送的参数的语法有问题; [在下面的例子中jsMyFunc()]。我已经尝试了在许多 www.sites 上找到的所有可能的建议,但我没有想法。

我在 W7/64 上使用 Firefox 54.0.1 与 Rasperry Pi 3B 交谈。 Apache 也在其中。我有大量其他代码在工作(HTML+JS+PHP(服务器端)等,但这个让我很难过。我对其中的大部分内容都比较陌生,所以我的代码改编自 <sarcasm>plethora 的无缺陷示例可以在 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 );
?>

【问题讨论】:

标签: javascript php ajax


【解决方案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='0',(引号之间的零)。

Source

发送2个参数的例子

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

【讨论】:

    【解决方案2】:

    非常感谢 user2505515。你得到了他们所有。我永远不会 发现 Content-Type 修复,'text' 或 'text/plain' 似乎正确并且 记录在案。我发送 int(0) 而不是 '0' 的事实是 我应该抓住的东西......额外的眼睛真的很有帮助。事实上,如果 我已经发送了任何其他可能有效的非零 int(通过 意外)在 Content-Type 修复之后。 因此,发送 2 个参数的固定(测试)代码 sn-p 是:

    xhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
    var myArgs = 'state=' +  state.toString() + '&' + 'gpio_bit=' +  gpio_bit.toString();
    

    米歇尔,我确实读过那篇文章......我只是为了森林而错过了树木。 阅读太多 [对我来说是新的] 代码 sn-ps 的时间太多了,我猜。 也感谢您的意见。 这是一个很棒的网站。我学到了很多东西。

    【讨论】:

    • 很高兴看到您的问题得到解决,是的,有时我们都有眼睛疲倦:)。现在正确的做法是将@user2505515 答案标记为已接受。
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多