2016-02-02 71 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

相關問題