首页 > 解决方案 > 如何在 JsonObject 中获取值

问题描述

我正在尝试这种新方法离子。使用 PDO,我被困在想要在 JsonObject 中获得价值的地方。我以前将 Volly 与 msqli 一起使用,但我找到了 Ion。更有条理,PDO 更安全。

每当我尝试向 java 添加任何代码时,它都会中断并且无法正常工作,就好像与 PHP 没有相同的连接一样,所以我被卡住了

我被困在的部分是 LOG_IN_SUCCESS,因为我需要获取会话管理器的用户 ID,因为 $row 仅在 java 中不显示 "LOG_IN_SUCCESS" 的情况,我还添加了 case"LOG_IN_SUCCESS":case"0":{code break ;} 但我没有工作

我尝试为 case"0" 添加新字符串,其中包含用户 ID,但代码只是中断

爪哇

      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" 
  }

标签: phpandroidjson

解决方案


$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 (欢迎使用 OOP):

$returnAPP->LOGIN="Log_In_Success";
$returnAPP->susers_sids=$row['susers_sids'];
echo json_encode($returnApp);

你甚至可以定义这样的类,但 PHP 就是它,它会为你创建 stdObject ;)


推荐阅读