新手,第一篇文章(绝望)。我试图获得一个基本的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_bit
和state
(见下文)。
请不要告诉我这是一个重复的错误...在那里,全部阅读。而且我真的不想学习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 );
?>
答案 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;,(引号之间为零)。
发送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个args的固定(已测试)代码段为:
xhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
var myArgs = 'state=' + state.toString() + '&' + 'gpio_bit=' + gpio_bit.toString();
米歇尔,我确实看过那篇帖子......我只是错过了森林的树木。
我想,太多人阅读了太多[对我而言]新的代码片段。
感谢您的投入。
这是一个很棒的网站。我学到了很多东西。