所以我一直在玩我的移动应用程序,它应该让我注册帐户并登录,同时从我创建的数据库中获取一些数据。一切都很好,花花公子,直到我更改了我的register.php文件,检查登录是否已经采取并相应地采取行动。我认为我的JSONObject和响应有问题,所以我尝试使用字符串而不是布尔值,但程序仍然只进入JSONObject的try部分jsonResponse = new JSONObject(response);然后立即进入代码的catch部分。我没有太大改变,说实话,我说我现在编写的代码比之前编写的代码更清晰,但它无法正常工作。
当我点击“Zarejestruj”按钮(抛光注册)时,应该将数据发送到数据库(这会发生,但我可以出于某种原因添加无限量的相同登录)并且活动应该返回到LoginActivity.java但它没有,它只是将凭证发送到数据库并保持在那里无限,同时允许我垃圾邮件bRegister。
这是java代码:
attrs = [:first, :second, :third, :fourth, :fifth]
attrs.each_with_index do |attr, ix|
i = ix + 1 # indexes are zero based, we need to adjust them
report.send "#{attr}=", Calculate(i.to_s)
if i.even?
make_correction(report, attr) if require_correction
end
end
这是我的Register.php文件:
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");
}
});
}}
答案 0 :(得分:2)
问题出在这一行:
{"success":true}
您的JSON字符串是:
response
解析这将创建一个带有一个键/值对的JSONObject:&#34;成功&#34; =布尔值为真
你在这里尝试做的是获取键{"success":true}
的字符串值(这是完整的jsonResponse.getString("success")
字符串,它不作为JSONObject中的键存在) 。相反,您应该使用getString()
,因为&#34;成功&#34;实际上是你感兴趣的关键。
但是,由于它实际上是布尔值而不是字符串,因此您不应使用getBoolean()
,而应使用boolean success = jsonResponse.getBoolean("success");
代替:
if
这也将对您的以下if (success == "success") {
语句产生影响:
if (success) {
应该成为:
success
(因为true
现在是布尔值false
或<table>
<tr *ngFor="let booking of jobHistory>
<td>{{booking}}</td>
</tr>
</table>
)。
答案 1 :(得分: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()
));
}