这是个this question的事,我发现了更多信息,例如问题本身需要更改。
我正在尝试将数据从javascript SPA传递到一个php文件(dbPatch.php
)到另一个php文件(mongoPatch_backend.php
)。 dbPatch.php
有效地充当了将数据获取到适当服务器的中间人。
我的javascript提取如下:
const API = PHP_FILE_LOCATION + 'dbPatch.php/';
const query =
"needleKey=" + encodeURIComponent(needleKey) + "&" +
"needle=" + encodeURIComponent(needle) + "&" +
"newData=" + encodeURIComponent(JSON.stringify(newData));
let URI = API;
fetch(URI, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: query
}).then.... blah...blah....
这将调用我的php文件dbPatch ...
<?php
$API = "https://SERVER/php/mongoPatch_backend.php?";
$needleKey = $_REQUEST['needleKey'];
$needle = $_REQUEST['needle'];
$newData = $_REQUEST['newData'];
$postData = "needleKey=".urlencode($needleKey);
$postData .= "&needle=".urlencode($needle);
$postData .= "&newData=".urlencode($newData); //THIS IS THE LINE I TALK ABOUT BELOW
$data = file_get_contents($API.$postData);
echo $data;
?>
依次调用我的mongoPatch_backend.php
文件...
<?php
$user = "xxx";
$pwd = 'xxx';
$needleKey = $_REQUEST['needleKey'];
$needle = $_REQUEST['needle'];
$filter = [$needleKey => $needle];
$newData = $_REQUEST['newData'];
$filter = ['x' => ['$gt' => 1]];
$options = [
'projection' => ['_id' => 0],
'sort' => ['x' => -1],
];
$bson = MongoDB\BSON\fromJSON($newData);
$value = MongoDB\BSON\toPHP($bson);
$manager = new MongoDB\Driver\Manager("mongodb://${user}:${pwd}@DBSERVER:27017");
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
[$needleKey => $needle],
['$set' => $value],
['multi' => false, 'upsert' => true]
);
$results = $manager->executeBulkWrite('dbname.users', $bulk);
var_dump($results);
?>
这不起作用。
如果我直接从javascript调用mongoPatch_backend.php,它确实起作用。 这使我相信问题出在dbPatch.php文件中的数据传递。
此外,如果我使用不同的“ newData”(简称)调用dbPatch,则可以正常工作。这使我相信正在传递数据(但要记住,如果我直接调用它就可以了……所以它是从javascript出来的)。
通过var_dump($_REQUEST['newData']);
从dbPatch.php中吐出$ newData,可以得到已经过字符串化但没有转义字符的JSON数据。大约有5,000个字符。
这是有趣的部分。
如果将mongoPatch_backend.php更改为<?php echo "Hello World"; ?>
,我仍然不会通过dbPatch.php将任何内容传递回我的SPA。这确实使我认为dbPatch.php文件中有问题。
所以...我从dbPatch.php中注释了$postData .= "&newData=".urlencode($newData);
行...我确实得到了“ Hello World”。
如果我只是删除.urlencode而只拥有$postData .= "&newData=".$newData;
,我仍然什么也没回来。
所以问题似乎出在我的帖子中。 mongoPatch_backend.php甚至对$ newData都没有做任何事情... dbPatch.php(似乎)只是在发送该数据时遇到了麻烦。
不幸的是...我不确定从这里到哪里...鉴于,我确实确实需要将$ newData发送到后端。
编辑:响应于我使用“ POST”而不是“ GET”的建议,我进行了搜索,发现了这个堆叠问题:POST data to a URL in PHP
从那里,我现在有了这个:
dbPatch.php:
$url = 'https://SERVERNAME/php/mongoPatch_backend.php';
$myvars = 'myvar1=' . "TEST" . '&myvar2=' . "ALSOTEST";
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
echo $response;
然后我将mongoPatch_backend.php
更改为:
<?php
echo "HELLO WORLD";
?>
...,我没有得到任何回应。 (也就是说,后端没有提供“ HELLO WORLD”)。
我的PHP日志没有显示错误。
我从phpinfo()
开始的curl配置是:
cURL support enabled
cURL Information 7.59.0
Age 4
Features
AsynchDNS Yes
CharConv No
Debug No
GSS-Negotiate No
IDN Yes
IPv6 Yes
krb4 No
Largefile Yes
libz Yes
NTLM Yes
NTLMWB No
SPNEGO Yes
SSL Yes
SSPI Yes
TLS-SRP No
HTTP2 Yes
GSSAPI No
KERBEROS5 Yes
UNIX_SOCKETS No
PSL No
Protocols dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
Host x86_64-pc-win32
SSL Version OpenSSL/1.1.0h
ZLib Version 1.2.11
libSSH Version libssh2/1.8.0
答案 0 :(得分:1)
我不确定为什么,但是这个问题:PHP - CURL is enabled but not working使我举了一个使用cURL的示例。
我的dbPatch.php现在看起来像这样,似乎可以正常工作...
<?php
$url = 'https://SERVERNAME/php/mongoPatch_backend.php';
$params = 'needleKey=' . $_REQUEST['needleKey'] . '&needle=' . $_REQUEST['needle'] . '&newData='. $_REQUEST['newData'];
if (! function_exists ( 'curl_version' )) {
exit ( "Enable cURL in PHP" );
}
$ch = curl_init ();
$timeout = 0; // 100; // set to zero for no timeout
$myHITurl = "http://152.61.248.218/php/mongoPatch_backend.php";
curl_setopt ( $ch, CURLOPT_URL, $myHITurl );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $params);
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
$file_contents = curl_exec ( $ch );
if (curl_errno ( $ch )) {
echo curl_error ( $ch );
curl_close ( $ch );
exit ();
}
curl_close ( $ch );
echo "$file_contents";
?>
答案 1 :(得分:0)
file_get_contents
仅用于将文件读取为字符串。可以将其视为在记事本或Textedit中打开文本文档。
对于动态渲染PHP文件的API请求,您将需要使用PHP库“ curl”