【问题标题】:Inserting data with MYSQL but nothing happens使用 MYSQL 插入数据但没有任何反应
【发布时间】:2016-08-21 12:01:46
【问题描述】:

我正在尝试将数据从我的应用程序插入 MYSQL 数据库。我使用HttpURLConnection 打开连接并使用BufferedWriter 编写它。一切正常(没有任何异常),但不知何故没有数据被插入到表中。 (我正在关注this 教程)。

我正在使用AsyncTask 在后台进行网络连接。如下所示,我创建了一个从AsyncTask 扩展的新类。

public class BackgroundTask extends AsyncTask<String, Void, String>
{
    Context ctx;
    BackgroundTask(Context ctx)
    {
        this.ctx = ctx;
    }

这是 doInBackground 方法。

@Override
protected String doInBackground(String... strings)
{
    String registerUrl = "http://localhost/APPoint/register.php";
    String method = strings[0];
    if (method.equals("register"))
    {
        try
        {
            String gebruikersnaam = strings[1];
            String wachtwoord = strings[2];
            String voornaam = strings[3];
            String tussenvoegsel = strings[4];
            String achternaam = strings[5];
            String bedrijfsnaam = strings[6];
            String email = strings[7];
            String telefoonnummer = strings[8];
            URL url = new URL(registerUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            OutputStream OS = conn.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(OS));
            String data = URLEncoder.encode("Gebruikersnaam", "UTF-8")+ "=" + URLEncoder.encode(gebruikersnaam, "UTF-8")+"&"+
                    URLEncoder.encode("wachtwoord", "UTF-8")+ "=" + URLEncoder.encode(wachtwoord, "UTF-8")+"&"+
                    URLEncoder.encode("voornaam", "UTF-8")+ "=" + URLEncoder.encode(voornaam, "UTF-8")+"&"+
                    URLEncoder.encode("tussenvoegsel", "UTF-8")+ "=" + URLEncoder.encode(tussenvoegsel, "UTF-8")+"&"+
                    URLEncoder.encode("achternaam", "UTF-8")+ "=" + URLEncoder.encode(achternaam, "UTF-8")+"&"+
                    URLEncoder.encode("bedrijfsnaam", "UTF-8")+ "=" + URLEncoder.encode(bedrijfsnaam, "UTF-8")+"&"+
                    URLEncoder.encode("email", "UTF-8")+ "=" + URLEncoder.encode(email, "UTF-8")+"&"+
                    URLEncoder.encode("telefoonnummer", "UTF-8")+ "=" + URLEncoder.encode(telefoonnummer, "UTF-8");
            try {
                bw.write(data);
            }catch(Exception e)
            {
                e.printStackTrace();
            }
            bw.flush();
            InputStream inputS = conn.getInputStream();
            inputS.close();
            bw.close();
            OS.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "Registreren voltooid";
    }
    return null;
}

我的 php DB 连接初始化器。

<?php

define('HOST', 'localhost');
define('USER', 'root');
define('PASS', '');
define('DB', 'appoint');

$conn = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我的 register.php 文件

<?php
$username = filter_var(trim($_POST['gebruikersnaam']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$password = filter_var(trim($_POST['wachtwoord']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$voornaam = filter_var(trim($_POST['voornaam']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$tussenvoegsel = filter_var(trim($_POST['tussenvoegsel']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$achternaam = filter_var(trim($_POST['achternaam']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$bedrijfsnaam = filter_var(trim($_POST['bedrijfsnaam']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$email = filter_var(trim($_POST['email']), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$telefoonnummer = filter_var(trim($_POST['telefoonnummer']), FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_STRIP_HIGH);

if ($username == '' || $password == '' || $voornaam == '' || $tussenvoegsel == '' || $achternaam == '' || $bedrijfsnaam == '' || $email == '' || $telefoonnummer == '') {
    //echo 'Verplichte velden zijn niet ingevoerd!';
} else {
    require_once('DBConnect.php');

    $stmnt = $conn->prepare("INSERT INTO gebruikers (`gebruikersnaam`, `wachtwoord`, `voornaam`, `tussenvoegsel`, `achternaam`, `bedrijfsnaam`, `email`, `telefoonnummer`) "
            . "VALUES (?, ? , ? , ?, ?, ?, ?, ?)");
    try {
        $stmnt->execute(array($username, $password, $voornaam, $tussenvoegsel, $achternaam, $bedrijfsnaam, $email, $telefoonnummer));
    } catch (PDOException $ex) {
        if ($ex->errorInfo[1] == 1062) {
            echo 'duplicate entry';
        } else {
            var_dump($ex);
        }
    }
}

起初我以为我的网址是错误的。我试过使用:

"http://127.0.0.1/APPoint/register.php"
"http://localhost/APPoint/register.php"
"http://10.0.2.2/APPoint/register.php"
"http://192.168.0.1/APPoint/register.php"

似乎没有什么能胜任这项工作。如果有人能提供一些意见将不胜感激。

编辑我应该提到我没有使用 AVD 来测试代码。为此,我使用自己的三星设备。

编辑为后台任务添加执行

if(!errors)
        {
            String method = "register";
            BackgroundTask bgTask = new BackgroundTask(this);
            bgTask.execute(method, gebruikersnaam, wachtwoord, voornaam, tussenvoegsel, achternaam, bedrijfsnaam, email, telefoonnummer);
            finish();
        }

编辑 在 logcat 上,使用 AVD 运行时会出现此错误(可能是 android 错误): getSlotFromBufferLocked:未知缓冲区 0xb4095170 在谷歌搜索之后,它看起来像是关于权限的一些 android 错误。但我的清单中已经有互联网许可。

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

【问题讨论】:

  • $_POST['gebruikersnaam'] 中变量是小写但在URLEncoder.encode("Gebruikersnaam", "UTF-8") 中以大写开头
  • @MarkoMets 感谢您指出这一点,不幸的是没有成功的结果。
  • 你的 registerUrl 正确吗?
  • @MarkoMets php 文件位于 C:\wamp64\www\APPoint (使用 wamp)所以应该不错。
  • 如果您使用自己的设备,那么 localhost 将指向您的设备。您的服务器在您的 PC 上,因此请使用您的 PC ip 而不是 localhost。并检查端口是否正确。

标签: java php android mysql


【解决方案1】:

当您调用 conn.getInputStream() 或 conn.getResponseCode() 时,请求被发送到服务器。如果你不这样做,什么都不会发生。请将其中一种方法添加到您的 doInBackground() 中。

【讨论】:

  • 已编辑,但仍然没有。见原帖。
  • @Necati 也许您应该在关闭流之前放置 getInputStream() 。其实你只需要调试。是否实际发送了http请求?您的 php 脚本实际上是否收到了 http 请求?以此类推。
  • 改变了输入流的位置。把它放在 bw.flush() 之后,检查帖子。
【解决方案2】:

您是否为 AsyncTask 调用了 execute() 方法?

您如何将服务器托管到应用程序?您无法使用手机访问本地主机。

有一个名为 ngrok 的智能工具可以将您的本地主机打开到互联网。在 android 开发中使用 localhost 作为 android 应用程序的服务器非常容易。 访问https://ngrok.com

【讨论】:

  • 增加了执行部分代码的backgroundTask部分。请检查帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多