【问题标题】:android - cannot send data to database of web serverandroid - 无法将数据发送到 Web 服务器的数据库
【发布时间】:2016-12-02 17:59:57
【问题描述】:

当我通过浏览器直接访问PHP的链接时,它会在数据库中创建一个空记录。但是,当我使用应用程序发送数据时,它会失败。

Java:

protected String doInBackground(String... params) {
    String reg_url = "http://www.minigameserver.square7.ch/register.php";
    String user_name = params[0];
    String user_ac = params[1];
    String user_pw = params[2];
    try {
        URL url = new URL(reg_url);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("POST");

        httpURLConnection.setDoOutput(true);
        OutputStream OS = httpURLConnection.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8"));
        String data = URLEncoder.encode("user_name","UTF-8")+"="+URLEncoder.encode(user_name,"UTF-8")+"&"+
                URLEncoder.encode("user_ac","UTF-8")+"="+URLEncoder.encode(user_ac,"UTF-8")+"&"+
                URLEncoder.encode("user_pw","UTF-8")+"="+URLEncoder.encode(user_pw,"UTF-8");
        bufferedWriter.write(data);
        bufferedWriter.flush();
        bufferedWriter.close();
        OS.close();

        httpURLConnection.disconnect();

        return "done!";
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "fail!";
}

当我运行应用程序时,按摩“完成!”显示出来了。

所以,没有异常发生。但是,为什么没有新记录呢?


我看到有人用 teset 的用户名注册很累。他介意告诉谁做的,这样我就可以追踪这个帖子。


当我尝试 Arshak 提供的代码时。出现以下错误。 E/Surface:getSlotFromBufferLocked:未知缓冲区:0x7f7d9eaad530

注册.php:

<?php
require "db_connect.php";

$user_name = $_POST["user_name"];
$user_ac = $_POST["user_ac"];
$user_pw = $_POST["user_pw"];
$user_pw_enc = md5($user_pw);

$sql = "INSERT INTO user(user_name, user_ac, user_pw) VALUES ('$user_name', '$user_ac', '$user_pw_enc')";

$sql2 = "SELECT * FROM user WHERE user_name = '$user_name'";
$result2 = $conn->query($sql2);

$sql3 = "SELECT * FROM user WHERE user_ac = '$user_ac'";
$result3 = $conn->query($sql3);

if($result2->num_rows == 0 && $result3->num_rows == 0){
if ($conn->query($sql) === TRUE)
        echo "Your account is created successfully!\nYou can login now!";
else
    echo "Error: " . $sql . "<br>" . $conn->error;
}
else {
if($result2->num_rows > 0)  
    echo "The user name is used!<br>";
if($result3->num_rows > 0)
    echo "The user account is used!<br>";
}

?>

【问题讨论】:

  • 您可能在客户端犯了一些错误尝试检查服务器端的error_log
  • 您是否记录了参数值,或者它为空!
  • 你得到的响应字符串是什么?请始终提供完整的信息。
  • @U.Swap,你的意思是 backgroundTask.execute(user_name_s,user_ac_s,user_pw_s);?
  • @KeroroChan 如果您想通知用户有关评论,请在用户名前使用@

标签: android server


【解决方案1】:
@Override
protected String doInBackground(String... params) {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.minigameserver.square7.ch/register.php");

    try {
       //add data
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
       nameValuePairs.add(new BasicNameValuePair("user_name", params[0]));
       nameValuePairs.add(new BasicNameValuePair("user_ac", params[1]));
       nameValuePairs.add(new BasicNameValuePair("user_pw", params[2]));
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
       //execute http post
       HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {

    } catch (IOException e) {

    }
}

您可以使用 Volley Android 网络库发布您的数据。官方文档是https://developer.android.com/training/volley/simple.html

【讨论】:

    【解决方案2】:

    我已经更新了你的代码,看看有没有数据被插入:

    protected String doInBackground(String... params) {
    String reg_url = "http://www.minigameserver.square7.ch/register.php";
    String user_name = params[0];
    String user_ac = params[1];
    String user_pw = params[2];
    try {
            URL url = new URL(reg_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.connect();
            DataOutputStream OS = new DataOutputStream(httpURLConnection.getOutputStream());
            String data = URLEncoder.encode("user_name","UTF-8")+"="+URLEncoder.encode(user_name,"UTF-8")+"&"+
                    URLEncoder.encode("user_ac","UTF-8")+"="+URLEncoder.encode(user_ac,"UTF-8")+"&"+
                    URLEncoder.encode("user_pw","UTF-8")+"="+ URLEncoder.encode(user_pw,"UTF-8");
            OS .writeBytes(data);
            OS .flush();
            OS.close();
    
            int responseCode=httpURLConnection.getResponseCode();
            String messageFromServer;
            if (responseCode==200) {
                messageFromServer=fromInputStream(httpURLConnection.getInputStream());
                Log.v("RegistrationMessage ",messageFromServer);
                httpURLConnection.disconnect();
                return messageFromServer;
            }
    
            httpURLConnection.disconnect();
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "fail!";
    }
    
    //Add this method inside your AsyncTask
    public String fromInputStream(InputStream stream) throws IOException {
            InputStreamReader streamReader = new
                    InputStreamReader(stream);
            BufferedReader bufferedReader = new BufferedReader(streamReader);
            StringBuilder builder = new StringBuilder();
            String tempString = "";
            while ((tempString = bufferedReader.readLine()) != null) {
                builder.append(tempString);
            }
            return builder.toString();
        }
    

    【讨论】:

    • 你输入了testet的名字来测试它?
    • @KeroroChan 我认为这应该是正确的答案,因为您不会在任何地方打电话给httpURLConnection.connect()。这意味着服务器甚至没有被调用!!!
    • @KeroroChan 请看这个问题 - stackoverflow.com/questions/33719149/… 我认为你应该切换到非 Marshmallow 设备并再次测试。但是打电话httpURLConnection.connect()是必须的,否则你只是在欺骗自己。
    • @KeroroChan 我忘了在上面的代码中添加fromInputStream() 方法。我已经更新了,再看看。现在它还将显示您的 php 文件中显示的消息,例如 Your account is created successfully!\nYou can login now! 等。我猜数据已发送,因为这可能是您之前遇到的一些构建问题。很高兴我的代码对您有所帮助,现在您可以投票并将我的答案标记为正确答案。
    • @KeroroChan 正确 & 现在您收到的数据量较少,因此现在可以使用字符串。但是当您收到大量数据时,我建议您使用 StringBuilder 而不是 String。
    【解决方案3】:

    我尝试测试该 URL,是的,它工作正常。由于已经有帖子显示对您的代码进行了一些修复,所以我只是给您一个提示。

    首先,因为您不确定您可能会遇到什么异常。试着让它通用。删除一条catch() 语句,改为使用:

    catch(Exception e){
        e.printStackTrace();
    }
    

    这样,所有异常都将被捕获,您可以轻松找到导致代码出现问题的原因。

    接下来是,因为您正在与服务器通信,所以这将是一个请求-响应过程。实际上,您做的事情是正确的,因为在发送了一些请求后,我能够收到回复。但为了提高效率,您的服务器还应该响应布尔指示器之类的东西。假设它已成功注册将响应 1,否则将响应 0。然后您的移动应用程序将处理结果。

    此外,您很可能无法收到该失败消息,因为它不在 try-catch 范围内。

    【讨论】:

    • 我有注册成功和失败的消息。而且,当我使用输入流时,会出现错误。
    • 报错 E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f55ab21fff0 出来了。
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多