【发布时间】: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..但是什么?
对于密码的问题 = 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 *不是最佳做法。