2016-02-02 34 views
1

现在我有这个VBA脚本:什么是POST的最佳方式/ GET Excel数据

i = 11 

While (Range("B" & i) <> "") 
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
     URL = "https://example.com/submit/?no=" & Range("B" & i).Value & "&soal=" & Range("C" & i).Value & "&a=" & Range("E" & i).Value & "&b=" & Range("F" & i).Value & "&c=" & Range("G" & i).Value & "&d=" & Range("H" & i).Value & "&benar=" & Range("J" & i).Value & "" 
     objHTTP.Open "POST", URL, False 
     objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
     objHTTP.send ("") 
    i = i + 1 

Wend 

它工作正常和所有。并做我想要的。问题是,花了很长时间(大约60秒)来发布60个问题。 60秒不是一个真正的问题。我可以等待60秒。问题出在我的托管中。他们将我的IP标记为垃圾邮件或其他东西。因为在成功发布我的问题之后,我收到了ERR_CONNECTION_RESET。它只发生在我身上。如果通过代理打开,该网站没问题。

所以我的问题是,有没有办法通过excel vba发布60个问题到PHP,而不会让我的IP由主机提供商阻止。

submit.php的内容

<?php 
    include ('../db.php'); 
    $sql = 'INSERT INTO `soal` (`id`, `no`, `soal`, `options`, `a`, `b`, `c`, `d`, `e`, `benar`) VALUES (NULL, "'.$_GET['no'].'", "'.$_GET['soal'].'", "4", "'.$_GET['a'].'", "'.$_GET['b'].'", "'.$_GET['c'].'", "'.$_GET['d'].'", "e", "'.$_GET['benar'].'");'; 
    $conn->query($sql); 

示例Excel行 http://snag.gy/A4o9D.jpg

附:我知道关于mysql的卫生,安全,注入等方面,我们只关注手头的问题,而不是谈论安全问题。

谢谢。

回答

1

注意我的VBA是生锈(比如,10年以上),字符串连接可能是错误的,或者是用URL = URL & "...而不是URL &= "...

但其基本思想是建立一个长的查询字符串,然后做一个HTTP要求:

i = 11 
URL = "https://example.com/submit/?" 
While (Range("B" & i) <> "") 

    URL &= "no[" & i & "]=" & Range("B" & i).Value & "&soal[" & i & "]=" & Range("C" & i).Value & "&a[" & i & "]=" & Range("E" & i).Value & "&b[" & i & "]=" & Range("F" & i).Value & "&c[" & i & "]=" & Range("G" & i).Value & "&d[" & i & "]=" & Range("H" & i).Value & "&benar[" & i & "]=" & Range("J" & i).Value 

    i = i + 1 

Wend 

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send ("") 

在PHP端,你会得到阵列,所以在循环中构建查询并插入一个查询中的所有值,以及:

$sql = 'INSERT INTO `soal` (`id`, `no`, `soal`, `options`, `a`, `b`, `c`, `d`, `e`, `benar`) VALUES '; 
$values = []; 
foreach($_GET['no'] as $key => $ignore){ 
    $values[]= '(NULL, "'.$_GET['no'][$key].'", "'.$_GET['soal'][$key].'", "4", "'.$_GET['a'][$key].'", "'.$_GET['b'][$key].'", "'.$_GET['c'][$key].'", "'.$_GET['d'][$key].'", "e", "'.$_GET['benar'][$key].'")'; 
} 
$sql .= implode(',', $values) . ';'; 
$conn->query($sql); 
+0

我明白了。我会尝试你的理论。快速的问题,URL有多长时间有限制?因为我试图谷歌它,我没有找到任何明确的答案。 – Yokowasis

+0

是的,但它设置在Web服务器上。我注意到你正在创建一个POST请求,所以不是给url添加参数,而是在post主体中发送它们。对于帖子大小没有这样的限制。我相信你会在vba中做到这一点,通过传递后体字符串到'objHTTP.send(“数据字符串在这里”)' – Steve

相关问题