MSXML2.XMLHTTP将数据发送到PHP脚本

时间:2014-10-15 06:13:23

标签: php mysql vba outlook

我一直在寻找一个选项,将从Outlook消息中附加文件读取的数据直接发送到PHP脚本,然后将该日期插入到一个漂亮的MySQL数据库中。 文件的提取和数据的分割都可以,但这是诀窍......

来自互联网(here)我找到了一个很好的帖子,杰里米斯莱德已经设法将一些数据发送到cgi scipt,一切都很好。

所以,我以为我是聪明的,我以为我可以重写它来处理PHP脚本。 但随后工程停止了。

我已将代码缩短到以下代码段;

Sub TestURL()

    Set xhr = CreateObject("MSXML2.XMLHTTP")
    URL = "http://somedomain.com/php/test.php"

    data = "someVariable=Test"

    With xhr

        .Open "POST", URL, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .Send data

    End With


End Sub

理论上,这应该在给定的URL处打开一个MSXML2.XMLHTTP请求,并将其中的任何数据发送到脚本。

有趣的是,脚本被调用,但没有传递数据?

我已经尝试将PHP脚本设置为[someVariable]元素的$ _GET和$ _POST,但是它们都没有响应吗? 当我将PHP设置为$ _GET时,我将VBA MSXML2.XMLHTTP对象与“GET”匹配,反之亦然......

我已经尝试将'data'变量作为参数传递给'function'.send,方法是将它包含在括号中 即。

   .send (data)

但这也不起作用......

我有点不知所措,因为脚本被调用,数据库被添加到表中但是没有实际传输'发送'数据?

我尝试将数据字符串连接到传递给HTTP对象的URL,实际上是将“GET”URL传递给HTTP对象。 即。

    URL = URL & "?" & data

但无济于事......: - (

如果我直接从浏览器传递数据,那么php脚本本身就能正常工作 即。

   http://somedomain.com/php/test.php?someVariable=Test 

正确添加数据并读取变量...

一些更开明的灵可以引导我朝着正确的方向前进吗?

20141016 **********更新**********

好的,在深入挖掘内容时,我发现还有一个选项可以将XmlHttp对象称为“Microsoft.XmlHttp”?

有趣的是,在设置这样的对象时, 即。

    Set xhr = CreateObject("Microsoft.XMLHTTP")

代码有效,数据被添加到表中,.responsText是成功消息。

然而,如果我回到原始代码,我会收到一条PHP错误消息,告诉我PHP语法中有错误?这意味着发送的实际“数据”在使用“MSXML2.XMLHTTP”和使用“Microsoft.XMLHTTP”之间有所不同???

试图从互联网上挖掘出两者之间的差异,但却找不到能让我对这个主题有充分理解的帖子吗?

尽管我的代码现在有效,但我仍然有一个困难的问题就是不理解两者之间的区别,并且会感谢某人做出的回复:-)因为我现在有一个有效的代码,但不是了解它的工作原理... :-) 或者mroeover不理解为什么“MSXML2”选项不起作用......


非常感谢,

最诚挚的问候

马亭

1 个答案:

答案 0 :(得分:0)

这不是一个答案,但更像是评论,因为我缺乏足够的评论声誉。

可以使用Fiddler分析问题,{{3}}提供请求和响应的详细信息。我使用MSXML2.XMLHTTP和Mirosoft.XMLHTTP对象在我的系统中检查了与您相同的代码,发现请求没有区别。他们都将包含someVariable=Test的POST请求正文传递给了网址http://somedomain.com/php/test.php

以下是两种情况下的原始POST请求:

POST http://somedomain.com/php/test.php HTTP/1.1
Accept: */*
Accept-Language: en-us
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; MS-RTC LM 8)
Host: somedomain.com
Content-Length: 17
Proxy-Connection: Keep-Alive
Pragma: no-cache

someVariable=Test

提供示例网址的响应:

HTTP/1.1 405 Method Not Allowed
Server: nginx/1.7.6
Date: Thu, 08 Jan 2015 15:23:58 GMT
Content-Type: text/html
via: HTTP/1.1 proxy226
Connection: close

<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.7.6</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->

这里的一个问题是,所讨论的Web服务器是否期望通过标题(User-Agent,Referer,Cookies等)或作为请求正文的一部分传递更多数据(可能是进一步的输入元素,是网络形式的一部分)?