2017-07-08 25 views
1

因此,我一直在我的移动应用程序中忙碌,应该让我注册帐户并登录,同时从我创建的数据库获取一些数据。一切都很好,直到我已经改变我的register.php文件,以检查登录是否已被采取并据此采取行动。我想我有我的JSONObject和响应的问题,所以我尝试使用字符串,而不是布尔值,但仍然程序只进入尝试部分JSONObject jsonResponse =新的JSONObject(响应);然后立即进入代码的catch部分。我没有太多变化,老实说我会说我现在编写的代码比以前更干净,但是它不能正常工作。在Java中更改PHP代码后立即跳到“赶上”Android应用程序

当我点击“Zarejestruj”按钮(波兰语为注册)时,数据应发送到数据库(发生这种情况,但由于某种原因,我可以添加无限量的相同登录名),并且活动应该返回到LoginActivity。 java但它没有,它只是将凭据发送到数据库,并保持在那里为无穷大,同时让我垃圾垃圾从bRegister的地狱。

这里的java代码:

public class RegisterActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    Log.d("RA", "Zmienne"); 
    final EditText etName = (EditText) findViewById(R.id.etName); 
    final EditText etSurame = (EditText) findViewById(R.id.etSurname); 
    final EditText etLogin = (EditText) findViewById(R.id.etLogin); 
    final EditText etPassword = (EditText) findViewById(R.id.etPassword); 
    final EditText etGroupNumber = (EditText) findViewById(R.id.etGroupNumber); 
    final EditText etIndexNumber = (EditText) findViewById(R.id.etIndexNumber); 

    final Button bRegister = (Button) findViewById(R.id.bRegister); 
    Log.d("RA", "Po zmienncyh"); 

    bRegister.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      final String name = etName.getText().toString().trim(); 
      final String surname = etSurame.getText().toString().trim(); 
      final String login = etLogin.getText().toString().trim(); 
      final String password = etPassword.getText().toString().trim(); 
      final String groupNumber = etGroupNumber.getText().toString().trim(); 
      final String indexNumber = etIndexNumber.getText().toString().trim(); 



      Log.d("RA", "Przed wywołąniem responseListener"); 
      Response.Listener<String> responseListener = new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Log.d("RA", "Response"); 
        Log.d("RA", response); 
        Log.d("RA", "onResponse"); 
        try { 
         Log.d("RA", "Try"); 
         JSONObject jsonResponse = new JSONObject(response); 
         Log.d("RA", "ObiektResponse"); 
         String success = jsonResponse.getString(response); 
         if (success == "success") { 
          Log.d("RA", "Success"); 
          Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); 
          RegisterActivity.this.startActivity(intent); 

         } else { 
          Log.d("RA", "Error"); 
          AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this); 
          builder.setMessage("Register Failed") 
            .setNegativeButton("Retry", null) 
            .create() 
            .show(); 
         } 
        } catch (JSONException e) { 
         Log.d("RA", "catch"); 
         e.printStackTrace(); 
        } 
       } 
      }; 
      Log.d("RA", "Wykonało się"); 
      RegisterRequest registerRequest = new RegisterRequest(name, surname, login, password, groupNumber, indexNumber, responseListener); 
      Log.d("RA", "queue"); 
      RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this); 
      Log.d("RA", "registerRequest"); 
      queue.add(registerRequest); 
      Log.d("RA", "Koniec"); 
     } 
    }); 
}} 

这里是我的Register.php文件:

require("Password.php"); 

ini_set('display_errors', 'On'); 
$mysqli = new mysqli("localhost", "id2147309_javaprojekt123", "javaprojekt321", "id2147309_javaprojekt"); 

if($mysqli->connect_errno){ 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if(isset($_POST["name"]) && isset($_POST["surname"]) && isset($_POST["login"]) && isset($_POST["password"]) && isset($_POST["groupNumber"]) && isset($_POST["indexNumber"])) 
{ 
$name = $_POST["name"]; 
$surname= $_POST["surname"]; 
$login = $_POST["login"]; 
$password = $_POST["password"]; 
$groupNumber = $_POST["groupNumber"]; 
$indexNumber = $_POST["indexNumber"]; 
} 

function registerUser(){ 
    global $mysqli, $name, $surname, $login, $password, $groupNumber, $indexNumber; 
    $passwordHash = password_hash($password, PASSWORD_DEFAULT); 
    $stmt = $mysqli->prepare("INSERT INTO user (name, surname, login, password, groupNumber, indexNumber) VALUES (?, ?, ?, ?, ?, ?)"); 
    $stmt->bind_param("ssssss", $name, $surname, $login, $passwordHash, $groupNumber, $indexNumber); 
    $stmt->execute(); 
    $stmt->close(); 
} 



function usernameAvailable(){ 
    global $mysqli, $login, $count; 
    $sql = "SELECT * FROM users WHERE login = ?"; 
    if($stmt = $mysqli->prepare($sql)){ 
    $stmt->bind_param("s", $login); 
    $stmt->execute(); 
    $stmt->store_result(); 
    $count = $stmt->num_rows; 
    $stmt->close(); 
    } 
    if($count < 1){ 
     return true; 
    } 
    else 
     return false; 
} 
    $response = "false"; 

if(usernameAvailable()){ 
    registerUser(); 
    $response = "true"; 
}echo json_encode($response); 
$mysqli->close(); 
+0

如果在解析JSON响应时捕获错误,则响应中可能有非JSON。这条线告诉你什么? 'Log.d(“RA”,response);'日志是否显示有效的JSON字符串? – rickdenhaan

+0

有了这个: $ response = array(); $ response [“success”] = false; \t \t \t如果(usernameAvailable()){ \t \t registerUser(); \t \t $ response [“success”] = true; \t} 林正从我的PHP文件回: {“成功”:真正} Loooks像一个有效的JSON响应我艰难 –

+0

是的,但你的Android应用也什么*实际上*从接收你的服务器?你从Android代码中记录的* literal *'response'字符串是什么? – rickdenhaan

回答

0

你可能想尝试从分配到mysqli->prepare()变量回归和测试正在恢复在继续执行实际的数据库操作之前为true。使用try/catch方法可能有助于确定php中是否存在问题。

ini_set('display_errors', 'On'); 
require("Password.php"); 

try{ 

    $mysqli = new mysqli("localhost", "id2147309_javaprojekt123", "javaprojekt321", "id2147309_javaprojekt"); 

    if($mysqli->connect_errno){ 
     echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
    } 

    if(isset($_POST["name"], $_POST["surname"], $_POST["login"], $_POST["password"], $_POST["groupNumber"], $_POST["indexNumber"])){ 
     $name = $_POST["name"]; 
     $surname= $_POST["surname"]; 
     $login = $_POST["login"]; 
     $password = $_POST["password"]; 
     $groupNumber = $_POST["groupNumber"]; 
     $indexNumber = $_POST["indexNumber"]; 
    } 


    function registerUser(){ 
     global $mysqli, $name, $surname, $login, $password, $groupNumber, $indexNumber; 
     $passwordHash = password_hash($password, PASSWORD_DEFAULT); 

     $stmt = $mysqli->prepare("INSERT INTO `user` (`name`, `surname`, `login`, `password`, `groupNumber`, `indexNumber`) VALUES (?, ?, ?, ?, ?, ?)"); 

     if($stmt){ 
      $stmt->bind_param("ssssss", $name, $surname, $login, $passwordHash, $groupNumber, $indexNumber); 
      $stmt->execute(); 
      $stmt->close(); 
      return true; 
     } else { 
      throw new Exception('Failed to prepare sql query in: ' . __FUNCTION__); 
     } 
     return false; 
    } 
    function usernameAvailable(){ 
     global $mysqli, $login, $count; 
     $sql = 'SELECT * FROM `users` WHERE `login` = ?'; 
     $stmt=$mysqli->prepare($sql); 

     if($stmt){ 
      $stmt->bind_param("s", $login); 
      $stmt->execute(); 
      $stmt->store_result(); 
      $count = $stmt->num_rows; 
      $stmt->close(); 
     } else { 
      throw new Exception('Failed to prepare sql query in: ' . __FUNCTION__); 
     } 
     return $count==0 ? true : false; 
    } 


    $available = call_user_func('usernameAvailable'); 
    $response = $available ? call_user_func('registerUser') : false; 
    $mysqli->close(); 

    echo json_encode($response); 

}catch(Exception $e){ 
    echo json_encode(array(
     'success' => false, 
     'Exception' => $e->getMessage() 
    )); 
} 
2

的问题是在这条线:

String success = jsonResponse.getString(response); 

你的JSON字符串是这样的:

{"success":true} 

解析这将创建一个JSONObject一个键/值对: “成功” =布尔值true

你在这里要做的是获取密钥的字符串值response(它是完整的{"success":true}字符串,它不作为JSONObject中的键存在)。 。相反,你应该使用jsonResponse.getString("success"),因为“成功”其实是你感兴趣的关键

然而,因为它实际上是一个布尔值,而不是一个字符串,你不应该使用getString()但使用getBoolean()代替:

boolean success = jsonResponse.getBoolean("success"); 

这会对您的以下if语句来产生了影响:

if (success == "success") { 

应该变成:

if (success) { 

(因为success现在是布尔值truefalse)。

+0

你是完全正确的,那就是问题所在。再次感谢:) –

+0

不客气:-) – rickdenhaan

+0

@PiotrOlech - 说谢谢你接受答案,并在这种情况下upvoting。这将有助于其他人提出类似的问题。 – YvesLeBorg

相关问题