php - 无法使用 PHP 连接 MySQL - Android Studio

标签 php android mysql

我在尝试使用 php 建立与数据库的连接时遇到了一些困难...我尝试了很多方法,仔细检查了我的 SQL 查询,只是不明白为什么它不起作用...我还是个新手,所以我想我错过了一些超出我范围的东西。我正在尝试创建一个需要用户注册的应用程序。

这是我在 Android Studio 中遇到的错误:

org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

我的 php 代码是:

<?php
$servername = "my server here";
$username = "my username here";
$password = "my password here";
$dbname = "my db here";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO User (username, email, passcode) VALUES (?, ?, ?)";

if (mysqli_query($conn, $sql)) {
$last_id = mysqli_insert_id($conn);
echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>

另一个重要的点,检查 Postman 插件并验证我得到的 url:

Error: INSERT INTO User (username, email, passcode) VALUES (?, ?, ?)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, ?, ?)' at line 1

我真的不明白为什么这是一个错误?因为我期待用户以表单形式输入...

作为更多信息,这是我的 RegisterActivity 中的代码:

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

    final EditText etUsername = (EditText)findViewById(R.id.etUsername);
    final EditText etEmail = (EditText)findViewById(R.id.etEmail);
    final EditText etPassword = (EditText)findViewById(R.id.etPassword);
    final Button btnRegister = (Button)findViewById(R.id.btnRegister);

    if (btnRegister != null) {
        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String username = etUsername.getText().toString();
                final String email = etEmail.getText().toString();
                final String passcode = etPassword.getText().toString();

                Response.Listener<String> responseListener = new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");
                            if (success) {
                                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                RegisterActivity.this.startActivity(intent);
                            } else {
                                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                                builder.setMessage("Register Failed")
                                        .setNegativeButton("Retry", null)
                                        .create()
                                        .show();
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                };

                RegisterRequest registerRequest = new RegisterRequest(username, email, passcode, responseListener);
                RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
                queue.add(registerRequest);

那么,有谁知道这是从哪里来的以及我还应该研究哪里?

干杯!

最佳答案

您忘记将您的值绑定(bind)到sql语句。

这是一个“应该”工作的代码(我现在没有用 android 测试它......如果它不起作用,我很高兴改进答案......):
另请注意,我切换到面向对象的风格。了解更多请read the manual !

<?php
$servername = "my server here";
$username = "my username here";
$password = "my password here";
$dbname = "my db here";

// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);
// Check connection
if (!$mysqli) {
    // display error
}

$sql = "INSERT INTO User (username, email, passcode) VALUES (?, ?, ?)";


if ($stmt=$mysqli->prepare($sql)) {
   // HERE's what you're missing:
   $stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['passcode']);
   $stmt->execute();
   // you defenitely want some more (error-)checks here
   $last_id = $mysqli->insert_id($conn);
   // and here

   // now return a json back to android. add any data you want (the whole new record f.e.)
   $return = "{'success':true, 'id': $last_id}";
   echo $return;
} else {
   // return any errors:
   $return = "{'success':false, 'errors': [{'DB-Error': '".$sql." ".$mysqli->error."'}]}";
   echo $return;
}

$mysqli->close($conn);
?>

注意您不应该像我现在那样直接从 $_POST 传递值、转义它们、验证它们等等...

关于php - 无法使用 PHP 连接 MySQL - Android Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580628/

相关文章:

php - Symfony 表单 - 如何在验证时添加一些逻辑

php - 在 PHP 中连接 Mysql 查询

android - 添加分析后错误 : Program type already present: com. google.android.gms.internal.measurement.zzdz

android - 可见性 GONE 的 LinearLayout 是否消耗零资源?

Android ListView选择问题

mysql - 三个表 INNER JOIN 和 WHERE 子句

PHP wamp 服务器错误

javascript - 如何在 javascript 上使用 PHP var? (PHP 代码)

javascript - 如何在没有表单的情况下传递 POST 变量?

mysql - sql中如何统计两个表中相同的值