Я пробую этот новый метод, Ион. с PDO, и я застрял там, где хочу получить значение внутри JsonObject. Раньше я использовал Volly с msqli, но нашел Ion. более организованным и более безопасным PDO.
Всякий раз, когда я пытаюсь добавить какой-либо код в java, он просто ломается и не работает, как будто нет связи с PHP, поэтому я застрял
Часть, в которой я застрял, это LOG_IN_SUCCESS, так как мне нужно получить идентификатор пользователя для диспетчера сеансов, поскольку $row не отображается в java только в случае "LOG_IN_SUCCESS" я также добавил случай "LOG_IN_SUCCESS": случай "0": {разрыв кода;}, но я не работал
Я попытался добавить новую строку для случая "0", которая содержит идентификатор пользователя, но код просто сломался
Джава
private void loginbtn(final String email, final String password) {
Ion.with(getApplicationContext())
.load(HOST)
.setBodyParameter("susers_semails", email)
.setBodyParameter("susers_spasswords", password)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
try {
String completed = result.get("LOGIN").getAsString();
switch (completed){
case "Email_Doesnt_Exist":
edtemail.setError("Email Doesnt Exist");
loginbtn.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
break;
case "Log_In_Success":
Intent intent = new Intent(LoginActivity.this, HomeSearchActivity.class);
startActivity(intent);
finish();
loginbtn.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this, completed, Toast.LENGTH_LONG);
Log.d(TAG, "onCompleted: " + completed);
break;
case "Log_In_Failed":
edtpassword.setError("Incorrect Password");
loginbtn.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
break;
default:
Toast.makeText(getApplicationContext(), "Ops! Error Occurred m", Toast.LENGTH_LONG).show();
loginbtn.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
break;
}
}catch (Exception error){
Toast.makeText(getApplicationContext(), "Please Check Connection And Try Again", Toast.LENGTH_LONG).show();
loginbtn.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
}
});
}
Php
$susers_semails = $_POST['susers_semails'];
$susers_spasswords = $_POST['susers_spasswords'];
$stmt = $PDO->prepare("SELECT susers_sids,susers_semails,susers_spasswords FROM userstbl WHERE
susers_semails = :USER_EMAIL" );
$stmt->bindParam(':USER_EMAIL',$susers_semails);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!empty($row)) {
if (password_verify($susers_spasswords, $row['susers_spasswords'])) {
$returnApp = array( 'LOGIN' => 'Log_In_Success',$row);
echo json_encode($returnApp);
}
else {
$returnApp = array( 'LOGIN' => 'Log_In_Failed');
echo json_encode($returnApp);
}
} else {
$returnApp = array( 'LOGIN' => 'Email_Doesnt_Exist');
echo json_encode($returnApp);
}
JSON
{
0: {
susers_sids: "3"
},
LOGIN: "Log_In_Success"
}
@LouysPatriceBessette, но результат не является массивом ???
Вы можете получить доступ к свойству объекта с помощью квадратных скобок. Это не значит, что это массив.
@LouysPatriceBessette, ну, это просто выдает мне ошибку, так как он ожидает объект, а не массив, поскольку результат определяется как объект «результат JsonObject» в завершенном
$row становится атрибутом объекта $returnApp в виде массива. Я думаю, вы пытаетесь передать только suser_sids, поэтому должно быть что-то вроде array( 'LOGIN' => 'Log_In_Success', 'susers_sids' => $row['susers_sids']); для возврата { LOGIN: "Log_In_Success" , susers_sids: "3",}, в качестве альтернативы вы можете использовать array_merge_recursive.
@LouisLoudogTrottier, да, это идеально, большое спасибо, теперь я понимаю, если вы хотите ответить, поэтому я даю правильный ответ, все в порядке.
@michellenaaom рада, что это сработало. Смотрите мой ответ ниже и добро пожаловать на борт.
$row стать атрибутом объекта $returnApp в виде ассоциативного массива. Я думаю, вы пытаетесь передать только suser_sids, поэтому должно быть что-то вроде
$returnApp=array(
'LOGIN' => 'Log_In_Success',
'susers_sids' => $row['susers_sids']
);
Поэтому он вернется как:
{
LOGIN: "Log_In_Success" ,
susers_sids: "3"
}
В качестве альтернативы вы можете использовать array_merge_recursive, чтобы включить строку в наш объект (как один ассоциативный массив), но я не буду хранить/передавать пароль пользователя, если это действительно необходимо.
Обновлено: Другой способ, которым вы можете/должны это сделать, - создать фактический объект вместо использования ассоциативного массива. Что-то вроде этого создаст анонимный объект, который вы можете передать json_encode точно так же, как вы делаете это сейчас (добро пожаловать в ООП):
$returnAPP->LOGIN = "Log_In_Success";
$returnAPP->susers_sids=$row['susers_sids'];
echo json_encode($returnApp);
Вы даже можете определить такой класс, но PHP такой, какой он есть, он создаст для вас stdObject;)
String completed = result[0].LOGIN;
?