【问题标题】:Inserting Data into MySQL from Android从 Android 向 MySQL 中插入数据
【发布时间】:2015-02-15 11:53:43
【问题描述】:

我无法将数据插入我的 MySQL 数据库。而且我还向 Android 模块发送了回复,以显示数据是否已保存。

PHP 代码:

   $id = $_POST['Id'];
        $name = $_POST['Name'];
        $email = $_POST['Email'];

        $con = new PDO("mysql:host=localhost;dbname=test", "root", "");

        $query = "Insert into record values ('$id','$name','$email')";
        //$query = "Select * from record";
        $result = $con->query($query);

Android 代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_new);

    final EditText Id = (EditText) findViewById(R.id.editText);
    final String id = Id.getText().toString();
    final EditText Name = (EditText) findViewById(R.id.editText2);
    final String name = Name.getText().toString();
    final EditText Email = (EditText) findViewById(R.id.editText3);
    final String email = Id.getText().toString();

    Button SavePush = (Button) findViewById(R.id.button3);
    SavePush.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://10.0.3.2:8080/insert.php");

            try{

                ArrayList NameValuePairs = new ArrayList<NameValuePair>(3);
                NameValuePairs.add(new BasicNameValuePair("Id",id));
                NameValuePairs.add(new BasicNameValuePair("Name", name));
                NameValuePairs.add(new BasicNameValuePair("Email", email));

                httpPost.setEntity(new UrlEncodedFormEntity(NameValuePairs));
                HttpResponse response = httpclient.execute(httpPost);
            }catch (Exception e){e.printStackTrace();}
        }
    });
}

【问题讨论】:

  • 您无法在 UI 线程中与 Internet 通信,您必须使用 ThreadAsyncTask,阅读您的 logcat 以获得有用的数据,您必须获得 android.os.NetworkOnMainThreadException 以获取有关该阅读的更多信息stackoverflow.com/questions/6343166/…
  • 问题出在insert into语句中,缺少表名
  • 您似乎没有测试 PDO 查询是否成功 - 请参阅手册了解返回值。另外,这里有一个 SQL 注入漏洞,所以如果你不想被黑客入侵,请切换到准备好的语句。
  • 您可以使用 XML、JSON 或仅使用 HTTP 响应代码来响应应用程序。那是你可以研究和尝试的东西吗?肯定有例子。
  • @shayanpourvatan 你能告诉我怎么做吗?我需要插入数据并检索

标签: php android mysql


【解决方案1】:

将您的 api 调用移至 asynctask 或线程。您不能在主 ui 线程中使用它们。

【讨论】:

【解决方案2】:

首先修改你的php代码:

$id = htmlentities($_POST['Id']);
$name = htmlentities($_POST['Name']);
$email = htmlentities($_POST['Email']);
try{
    $con = new PDO("mysql:host=localhost;dbname=test", "root", "");
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(Exception $e){
    echo $e->getMessage();
    die();
}
$query = "INSERT INTO record VALUES('?','?','?')";
$result = $con->prepare($query);
$result =  bindParam(?, $id);
$result =  bindParam(?, $name);
$result =  bindParam(?, $email);
$finalresult = $con->execute($result);

【讨论】:

  • 您能否修复 SQL 注入漏洞,或者至少在您的回答中记下它?就目前而言,这鼓励 OP 对此不做任何事情。此外,我不确定在实时服务上显示错误是否是个好主意 - 这可能有助于攻击者了解基础表的结构并帮助他们进行攻击。
  • 这段代码在 bindpram 上给了我错误,说调用未定义的 pram buildPram()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2014-02-01
  • 2017-01-07
  • 2018-02-27
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多