2014-07-27 123 views
0

我開始學習Android編程,我完全新手到PHP。Android的形式爲PHP,PHP文件不發送字段在Android形式輸入

在發佈這個問題之前,我已經嘗試了所有與它相關的答案,而且沒有人爲我工作,所以我決定發佈一個新問題。

我有一個應用程序,其中用戶輸入一個表單並將其內容通過電子郵件發送給我。

我成功收到郵件,但只在php中定義了字符串。我也希望來自用戶的輸入也被傳送到我的電子郵件。

請檢查下面的php代碼和java代碼,並提出一個合適的建議。

電子郵件收到:

「姓:姓名:電郵地址:您的電話:」

沒有Android的形式向用戶輸入。 :(

email2.php

<?php 

$ed1=$_POST['fname']; 
$ed2=$_POST['lname']; 
$ed3=$_POST['email']; 
$ed4=$_POST['phone']; 
$to="[email protected]"; 
$subject="android_email"; 
$from="$ed3"; 
$body="First Name:" .$ed1."\n Last Name:" .$ed2. "\n Your Email:".$ed3."\n Your Phone:"  .$ed4."\n"; 
$header="From :".$from."\n"; 

if(mail($to,$subject,$body,$header)) 
{ 
    echo "Thank you"; 
} 
else 
{ 
    echo"Try Again"; 
} 

?> 

FormActivity.java

package com.example.getpost; 
import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.util.ByteArrayBuffer; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class FormActivity extends Activity { 
    TextView txtvw; 
    String text; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_form); 

     txtvw = (TextView)findViewById(R.id.textView1); 
     text = ""; 

     postData(); 
    } 

    public void postData(){ 
     // Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://www.amit.comeze.com/email2.php"); 
     EditText ed1 = (EditText)findViewById(R.id.editText1); 
     EditText ed2 = (EditText)findViewById(R.id.editText2); 
     EditText ed3 = (EditText)findViewById(R.id.editText3); 
     EditText ed4 = (EditText)findViewById(R.id.editText4); 

     try { 
      // Add your data 
      List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("fname", ed1.getText().toString())); 
      nameValuePairs.add(new BasicNameValuePair("lname", ed2.getText().toString())); 
      nameValuePairs.add(new BasicNameValuePair("email", ed3.getText().toString())); 
      nameValuePairs.add(new BasicNameValuePair("phone", ed4.getText().toString())); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 
      InputStream is = response.getEntity().getContent(); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      ByteArrayBuffer baf = new ByteArrayBuffer(20); 

      int current = 0; 

      while((current = bis.read()) != -1){ 
       baf.append((byte)current); 
      } 

      /* Convert the Bytes read to a String. */ 
      text = new String(baf.toByteArray()); 
      txtvw.setText(text); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     } 
    } 
} 

而且,當形式機器人被打開了 「THANKYOU」 信息時在啓動時即使形式是空的並且我猜郵件也沒有發送

我需要謝謝你的消息出現在用戶按下窗體上的提交按鈕,並且所有的驗證錯誤(不是cod編輯在PHP代碼給出)出現在用戶按下提交按鈕後。

期待您的寶貴意見,這將幫助我很大,將不勝感激。
此致敬禮。

回答

0

有代碼中的很多問題:

首先,你不能在主線程上做網絡的東西。在這裏有數千次的說法,爲此,您需要使用例如AsyncTask。 正如我所看到的,您跟着this tutorial發出您的發佈請求。複製AsyncTask的doInBackground中的完全相同的代碼。第二,你將你的發佈數據功能放在onCreate上,這是一個在活動開始時調用的函數,在用戶可以與你的應用進行交互之前,這就是爲什麼它發送一個空的表單到你的php代碼。要解決這個問題,你應該只在onCreate上初始化你的視圖。

public void postData(){ 
EditText ed1 = (EditText)findViewById(R.id.editText1); 
EditText ed2 = (EditText)findViewById(R.id.editText2); 
EditText ed3 = (EditText)findViewById(R.id.editText3); 
EditText ed4 = (EditText)findViewById(R.id.editText4); 
} 

也許把一個按鈕,將所有這些信息調用的AsyncTask的執行方法(見上面的鏈接瞭解如何的AsyncTask工作)。

我想在此之後,你將能夠使你的「應用程序」的工作!

希望它有幫助。

+0

AsyncTask確實是一個定時器...而DoInBackground()是必須在代碼中實現的。謝謝你把它帶給我注意。 – amit

+0

我遵循這裏的Asynctask教程 - mobiledevtuts.com/android/android-http-with-asynctask-example。我得到的代碼正確工作,吐司也顯示爲編碼。我修改了下面的php文件,以接收我的電子郵件中的內容,如下所示,但我沒有收到電子郵件。你可以把光放在這個..'<?php //從應用程序的http請求接收數據$ data = $ _ POST [「myHttpData」]; $主題= 「的AsyncTask」; $到= 「[email protected]」; $ body =「名字:。$ data。」; if(mail($ to,$ subject,$ body)){echo「SENT」; } else {echo「TRY AGAIN」; }?>' – amit

+0

嘿,阿米,很高興我能幫上忙。我建議你在SO標題下發佈一個新的問題,以便在這個問題上更有經驗的人可以幫助你! – Leonardo