【问题标题】:PHP Error in my Server我的服务器中的 PHP 错误
【发布时间】:2017-08-26 23:42:45
【问题描述】:

大家好,我在 Android Studio 中有这段 Java 代码:

private void loginUser(){
pd = ProgressDialog.show(LoginActivity.this, "", "Loading...");
StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    boolean success = jsonResponse.getBoolean("success");
                    if (success) {
                        launchHomeScreen();
                        pd.dismiss();
                        Toast.makeText(LoginActivity.this,"Welcome back " + username,Toast.LENGTH_LONG).show();
                    }
                    else {
                        loginButton.setBackgroundColor(0x73000000);
                        Toast.makeText(LoginActivity.this,"Try again later!",Toast.LENGTH_LONG).show();
                        pd.dismiss();
                    }
                }
                catch (JSONException e) {
                    loginButton.setBackgroundColor(0x73000000);
                    e.printStackTrace();
                    Toast.makeText(LoginActivity.this,e.toString(),Toast.LENGTH_LONG).show();
                    pd.dismiss();
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                loginButton.setBackgroundColor(0x73000000);
                Toast.makeText(LoginActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                pd.dismiss();
            }
        }){
    @Override
    protected Map<String,String> getParams(){
        Map<String,String> params = new HashMap<>();
        params.put(KEY_USERNAME,username);
        params.put(KEY_PASSWORD,password);
        return params;
    }

};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

}

这在我的服务器上作为 php 代码:

<?php
$con = mysqli_connect("x", "x", "x", "x");

$username = $_POST["username"];
$password = $_POST["password"];

$statement = mysqli_prepare($con, "SELECT * FROM user WHERE username = ?");
mysqli_stmt_bind_param($statement, "s", $username);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $colUsername, $colPassword);

$response = array();
$response["success"] = false;  

while(mysqli_stmt_fetch($statement)){
    if (password_verify($password, $colPassword)) {
        $response["success"] = true;  
    }
}
header('Content-Type: application/json');
echo json_encode($response);

?>

这就是我从服务器得到的错误:

[29-Mar-2017 18:24:46 UTC] PHP Warning: mysqli_stmt_bind_result(): Number of bind variables doesn't match number of fields in prepared statement in /home/u371648055/public_html/login.php on line 11

所以我不明白我的代码有什么问题。我知道 Javacode 是正确的....所以....这是 phpcode..但是什么?

我的 MySQL 数据库:

对于密码的问题 = 0 这是我发送到服务器的内容:

private void registerUser(){
    pd = ProgressDialog.show(RegisterActivity.this, "", "Loading...");
    StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if (success) {
                            launchHomeScreen();
                            pd.dismiss();
                        }
                        else {
                            Toast.makeText(RegisterActivity.this,"Try again later!",Toast.LENGTH_LONG).show();
                            pd.dismiss();
                            Intent loginActivity = new Intent (RegisterActivity.this,LoginActivity.class);
                            RegisterActivity.this.startActivity(loginActivity);
                            finish();
                        }
                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                        pd.dismiss();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(RegisterActivity.this,error.toString(),Toast.LENGTH_LONG).show();
                    pd.dismiss();
                }
            }){
        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<>();
            params.put(KEY_USERNAME,username);
            params.put(KEY_PASSWORD,password);
            params.put(KEY_MOBILENUMBER,mobileNumber);
            params.put(KEY_EMAIL, email);
            return params;
        }

    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);

} 这就是注册 php 代码:

<?php
$connect = mysqli_connect("x", "x", "x", "x");

$username = $_POST["username"];
$password = $_POST["password"];
$mobilenumber = $_POST["mobilenumber"];
$email = $_POST["email"];

registerUser();

function registerUser() {
    global $connect, $username, $password, $mobilenumber, $email;
    $statement = mysqli_prepare($connect, "INSERT INTO user (username, password, mobilenumber, email) VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($statement, "siss", $username, $password, $mobilenumber, $email);
    mysqli_stmt_execute($statement);
    mysqli_stmt_close($statement);  

}

我如何获得 $password:

public class RegisterActivity extends AppCompatActivity {

   public static final String KEY_PASSWORD = "password";
   private String password;

  //When clicking the Regsiter-Button:
   pwd = (EditText) findViewById(R.id.editText2);
   password = pwd.getText().toString().trim();
   registerUser();
}

【问题讨论】:

  • 很可能您的 SQL 语句返回的不仅仅是您尝试绑定到变量的两列。一般来说,使用SELECT * 不是最佳做法。

标签: java php android server


【解决方案1】:

您的查询获得的列多于您传递给mysqli_stmt_bind_result() 函数的变量。更改您的选择查询以仅获取您需要的那些列(我猜是usernamepassword):

$statement = mysqli_prepare($con, "SELECT username,password FROM user WHERE username = ?");

【讨论】:

  • 是的,这行得通..但是 JSON 发回成功:false...但是我将正确的用户名和密码发送到服务器..当您需要 MySQL 数据库时,请查看我的 QQestion跨度>
  • 那么,发布passwordVerify()的内容
  • 怎么办?与$response["success"] =password_verify($password, $colPassword) ;??
  • 在while循环外试试这个:if (password_verify($password, $colPassword)) { $response["success"] = true; }
【解决方案2】:

您需要将? 占位符的数量与替换变量的数量相匹配;只有这样才能准备执行语句:

SELECT * FROM user WHERE ? = ?;

【讨论】:

  • 是的,这行得通..但是 JSON 发回成功:false...但是我将正确的用户名和密码发送到服务器..当您需要 MySQL 数据库时,请查看我的 QQestion跨度>
【解决方案3】:

嗯,这里的大部分答案都是正确的,我看到了你的评论。

如果您查看密码列,所有行都具有相同的值“零”。可能在调试的时候,你会发现你作为post数据发送的密码值与数据库中对应行的密码值不一致。

还要注意密码不应该是 int 类型,而 varchar 更适合用作密码。尝试在您的请求和数据库中的行中保持相同的密码。 此外,请在此处发布您从 Android 发送的值,如果您的问题仍然存在,请在此处发布 password_verify() 函数的值。

【讨论】:

  • 我在我的问题中发布了我发送到服务器的 Java 代码和服务器中的 php 代码。
  • 我看到你已经发布了java代码以及php代码。我要问的是添加您从 android 传递的密码变量的值以及您似乎在后端服务中捕获的 $password 值。
  • 我的问题是你的意思吗?
  • 是的,请将其添加到问题中。最好使用调试器...我要求您告诉我们从 android 发送并在服务器上接收的密码值。
  • 好的,我测试过了。 Android 发送正确的密码,Server 正确接收。
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 2015-02-27
  • 2017-06-15
  • 2017-07-17
  • 2017-11-01
  • 2016-06-18
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多