2012-08-30 94 views
1

如何使用提交按鈕上沒有名稱屬性的curl提交表單?使用CURL提交表格

例如,目標站點有如下提交按鈕:

<input id='some' value='value' type='submit' > 

這是我有:

$post_data['name'] = 'xyz'; 
$post_data['some'] = 'value'; 

foreach ($post_data as $key => $value) { 
      $post_items[] = $key . '=' . $value; 
     } 
     //create the final string to be posted using implode() 
     $post_string = implode ('&', $post_items); 

    $ch = curl_init($web3); 
     //set options 
     //curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
     curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
     curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
     curl_setopt($ch, CURLOPT_USERAGENT, 
      "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
     //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
     //set data to be posted 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 
     //perform our request 
     $result = curl_exec($ch); 
+3

提交按鈕本身不必具有任何名稱屬性 - 只有字段本身。 – Lix

+0

但是如何提交呢?我編輯了代碼..你可以舉一個例子 – zista

+0

你必須發送帖子請求到那個你得到頁面的響應URL。 – pce

回答

2

根本不提供輸入表單字段的名稱 - 一個瀏覽器實際上會爲你做什麼。

+0

所以你說如果我這樣做$ post_data [''] ='value';它會提交表格? – zista

+0

你不需要這樣設置,實際上你根本不需要設置這個「值」。只要將其餘的表單域填入請求併發送即可。 – jdevelop

+0

但是如何提交呢?我編輯了代碼..你能舉一個例子 – zista

3

您(通常)不需要編碼$post_data,並且以下的代碼將提交表格。

該按鈕不是必需的。當curl_exec運行時,服務器將收到填充表單的對等項(前提條件是post_data正確)。

如果操作沒有進行,某個字段丟失,或者可能是會話中的某個字段。嘗試用cURL打開與顯示表單相同的頁面,然後提交表單。

$post_data['name'] = 'xyz'; 
$post_data['some'] = 'value'; 

$ch = curl_init(); 
//set options 
//curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_USERAGENT, 
     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

//set data to be posted 
curl_setopt($ch,CURLOPT_POST, true); 

// Note -- this will encode using www-form-data 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 

curl_setopt($ch, CURLOPT_URL, $web3); 

$result = curl_exec($ch); 

UPDATE

那麼,讓我們看看會發生,通常會發生什麼用捲曲:

Browser       cURL 
1. Goes to www.xyz.com/form   curl_exec's a GET on www.xyz.com/form 
2. Server sends HTML    Server sends HTML 
3. User types in fields    We populate $post_data 
4. User clicks "SUBMIT"    We run curl_exec and POST $post_data 
5. Browser contacts server   cURL contacts server 
6. Browser sends fields    cURL sends fields 
7. Server acts upon request   Server acts upon request 
8. Profit       Profit 

上面的代碼只實現階段3-6。階段2也可能發送會話cookie並設置階段7所需的一些數據。因此,在成功執行之前,您還需要使用另一個curl_exec(GET方法,可能是這次)來實現階段1執行以下階段。

+0

他已經用'curl_init($ web3);' – Lusitanian

+0

Oopsie設置_a_ url。那麼,我不明白爲什麼它不應該工作,除非$ web3錯誤或某個字段丟失。 「表單被填充」的事實似乎表明服務器識別數據,但它不會繼續。有些字段仍然丟失,或者某些會話信息是。 – LSerni

+0

是的,我不太明白這個問題。 – Lusitanian