Java 将注册数据从用户发送到服务器

Java 将注册数据从用户发送到服务器,java,android,database,http,Java,Android,Database,Http,编辑: 我终于找到了问题所在。我在这条线上一直收到一个例外 response=httpClient.execute(httpPost) 然而,导致这个错误的正常问题(我在网上搜索的那些问题,比如url错误等等)并不是这里的问题。url是正确的。任何人都可以帮助我或列出所有可能的原因,我会得到这个错误。多谢各位 我知道这个问题已经被问过好几次了,实际上我看了这些问题的答案,以便最初找出如何做到这一点,但由于某种原因,它不起作用,我不知道为什么 我有一个需要用户注册的应用程序。他们注册后,我将他们

编辑: 我终于找到了问题所在。我在这条线上一直收到一个例外 response=httpClient.execute(httpPost)

然而,导致这个错误的正常问题(我在网上搜索的那些问题,比如url错误等等)并不是这里的问题。url是正确的。任何人都可以帮助我或列出所有可能的原因,我会得到这个错误。多谢各位


我知道这个问题已经被问过好几次了,实际上我看了这些问题的答案,以便最初找出如何做到这一点,但由于某种原因,它不起作用,我不知道为什么

我有一个需要用户注册的应用程序。他们注册后,我将他们输入的信息发送到服务器

Android代码:

//This is the method called when user presses submit button. The variables not declared
//are global
public void registerUser(View v){
    context = getApplicationContext();

    username = ((EditText) this.findViewById(R.id.username)).getText().toString();
    email = ((EditText) this.findViewById(R.id.email)).getText().toString();
    password=((EditText)this.findViewById(R.id.password)).getText().toString();

    String[] params = {username,email,password};
    (new SendRegisterInfo(this.getApplicationContext())).execute(params);

    Toast t = Toast.makeText(context, "Thank you for Signing up "+username, Toast.LENGTH_SHORT);
    t.show();
    //Start Main Page Activity. Page they'll see everytime they login
    Intent i = new Intent(this,HomeActivity.class);
    startActivity(i);

}


public class SendRegisterInfo extends AsyncTask<String,Void,Void>{

private String tag = "SendRegisterInfo";
private InputStream is;
private Context c;

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
}

public SendRegisterInfo(Context c){
    this.c = c;
}

@Override
protected Void doInBackground(String... params) {
    String URI="http://www.mysite.com/registerUser.php";

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(URI);
    HttpResponse response;

    String username,email,password;
    username = params[0];
    email = params[1];
    password = params[2];


    try {

        ArrayList<NameValuePair> submit = new ArrayList<NameValuePair>(2);
        submit.add(new BasicNameValuePair("username",username));
        submit.add(new BasicNameValuePair("email",email));
        submit.add(new BasicNameValuePair("password",password));
        httpPost.setEntity(new UrlEncodedFormEntity(submit));

        response = httpClient.execute(httpPost);
        Log.i(tag,response.getStatusLine().toString());

    } catch (ClientProtocolException e) {
        Log.e(tag, "Error in http connection "+e.toString());

        e.printStackTrace();
    } catch (IOException e) {
        Log.e(tag, "Error in http connection "+e.toString());

        e.printStackTrace();
    }catch (Exception e){
        Log.e(tag, "Error in http connection "+e.toString());

        e.printStackTrace();
    }

    return null;
}


}
//这是用户按下提交按钮时调用的方法。未声明的变量
//是全球性的
公共作废登记器(视图五){
context=getApplicationContext();
username=((EditText)this.findViewById(R.id.username)).getText().toString();
email=((EditText)this.findviewbyd(R.id.email)).getText().toString();
password=((EditText)this.findviewbyd(R.id.password)).getText().toString();
字符串[]参数={用户名、电子邮件、密码};
(新的SendRegisterInfo(this.getApplicationContext()).execute(params);
Toast t=Toast.makeText(上下文,“感谢您注册”+用户名,Toast.LENGTH\u SHORT);
t、 show();
//启动主页活动。他们每次登录都会看到主页
意向i=新意向(此,HomeActivity.class);
星触觉(i);
}
公共类SendRegisterInfo扩展异步任务{
私有字符串tag=“SendRegisterInfo”;
私有输入流是;
私有上下文c;
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
}
公共SendRegisterInfo(上下文c){
这个.c=c;
}
@凌驾
受保护的Void doInBackground(字符串…参数){
字符串URI=”http://www.mysite.com/registerUser.php";
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(URI);
HttpResponse响应;
字符串用户名、电子邮件、密码;
用户名=参数[0];
email=params[1];
密码=参数[2];
试一试{
ArrayList submit=新的ArrayList(2);
提交.添加(新的BasicNameValuePair(“用户名”,用户名));
提交。添加(新的BasicNameValuePair(“电子邮件”),电子邮件);
提交.添加(新的BasicNameValuePair(“密码”,password));
setEntity(新的UrlEncodedFormEntity(提交));
response=httpClient.execute(httpPost);
Log.i(标记,response.getStatusLine().toString());
}捕获(客户端协议例外e){
Log.e(标记“http连接中的错误”+e.toString());
e、 printStackTrace();
}捕获(IOE异常){
Log.e(标记“http连接中的错误”+e.toString());
e、 printStackTrace();
}捕获(例外e){
Log.e(标记“http连接中的错误”+e.toString());
e、 printStackTrace();
}
返回null;
}
}
清单文件:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

PHP代码:

<?php
$username =  $_POST["username"];
$email =  $_POST["email"];
$pswrd = $_POST["password"];
$score = 0;

$user = "root";
$password="pword";
$database = "databasename";

mysql_connect(localhost,$user,$password);

mysql_select_db($database) or die("Unable to Select Database");

$query="INSERT INTO Players VALUES ('','$username','$email','$pswrd','','$score')";

mysql_query($query);

mysql_close();

?>

读取doInBackground()方法的(String…params)参数时出错

启动异步任务时:

 String[] params = {username,email,password};
当你读论据的时候

String username,email,weight,password;
username = params[0];
email = params[1];
password = params[3];  // should be: password = params[2];
如果这不起作用,则添加一个mySql查询,询问php程序上的最后一个插入id,并打印结果以在客户端获得响应:

response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();    
Log.i(tag,EntityUtils.toString(entity).toString());
因此,您可以查看是否正在插入数据库。

这是您的问题:

RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

您正在尝试显示一个类中的祝酒词,该类不是为显示祝酒词而设计的。或者,也许,他不准备展示托斯特。包含方法注册器的类是什么请检查下面的代码

  • 将函数名和键与数据一起添加到请求中

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); 
    
    nameValuePairs.add((NameValuePair) new BasicNameValuePair("f", "yourFunctionName."+methodName));
    
    nameValuePairs.add((NameValuePair) new BasicNameValuePair("u", "a0ff8a6a0a831ec25cf4de6c730be54c"));
    
    //u is the key used by server to identify valid request.
    
    List name-valuepairs=new-ArrayList(3);
    添加((NameValuePair)新的BasicNameValuePair(“f”,“yourFunctionName.”+methodName));
    名称值对。添加((名称值对)新的基本名称值对(“u”、“a0ff8a6a0a831ec25cf4de6c730be54c”);
    //u是服务器用来标识有效请求的密钥。
    

你说它起作用了,但你不知道为什么?什么不起作用?试着调试你的代码。如果你创建一个简单的表单并发布数据,php脚本是否有效?安卓真的发送了内容吗?你有任何错误吗?通过快速查看代码,我看到的唯一问题是你在UI线程上进行网络活动(除非你没有发布整个代码)。@YuviDroid我把这个放在评论中,而不是问题b/c中,我不想让它变得混乱。我按照你的建议做了,在另一个线程上进行网络活动,但它不仅没有提交信息,而且还使应用程序崩溃。我在问题的末尾加入了我修改的代码。您的代码可以进行SQL注入!删除数据库非常简单。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO,。感谢您的回复,这实际上是错误之一。我修复了它,应用程序停止崩溃,但数据仍然没有发送到服务器。显然,主要的问题在于这行response=httpClient.execute(httpPost),这给了我一个IOException。我已经更新了问题。谢谢你的回答。你第一次列出的错误实际上是我的错别字。我还找到了错误的实际位置,并再次编辑了问题。