2017-09-11 23 views
0

私はlocalhostに接続された簡単なAndroidアプリケーションを作成しています。 登録ページが正常に作成されました。アプリケーションは問題なく新規ユーザーを登録できます。私はVolleyライブラリを使って登録/ログインを作成しています。Androidアプリケーションにログインできません。エラー:org.json.JSONException:型java.lang.Stringの値<brはJSONArrayに変換できません

問題はログイン機能にあります。私は、ログインの詳細を記入して、ログインをクリックすると、私はエラーが

09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONArray 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at org.json.JSON.typeMismatch(JSON.java:111) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at org.json.JSONArray.<init>(JSONArray.java:96) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at org.json.JSONArray.<init>(JSONArray.java:108) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.example.virus.bloodpressurereader.Login$1$1.onResponse(Login.java:71) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.example.virus.bloodpressurereader.Login$1$1.onResponse(Login.java:65) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at android.os.Looper.loop(Looper.java:148) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
09-11 13:59:16.856 16107-16107/com.example.virus.bloodpressurereader W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

私login.phpファイルには、この

<?php 
require "conn.php"; 

$user_email = $_POST["userEmail"]; 
$user_password = $_POST["userPass"]; 

$sql = "select name, email from user_profile where email = '$user_email' and password = '$user_password'"; 

$result = mysqli_query($conn, $sql); 

$response = array(); 

if(mysqli_num_rows($result) > 0){ 

    $row = mysqli_fetch_row($result); 
    $name = $row[0]; 
    $email = $row[1]; 
    $code = "login success"; 

    array_push($response, array("code"=>$code, "name"=>$name, "email"=>$email)); 

    echo json_encode($response); 


}else { 

    $code = "login failed"; 
    $message = "user not found.. Try again"; 

    array_push($response, array("code"=>$code,"message"=>$message)); 

    echo json_encode($response); 
} 
mysqli_close($conn); 
?> 

で、私のlogin.javaファイルがこの

package com.example.virus.bloodpressurereader; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.support.annotation.MainThread; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.AuthFailureError; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.HashMap; 
import java.util.Map; 

public class Login extends AppCompatActivity { 

EditText email, password; 
Button loginUser; 

String userEmail, userPassword; 

String login_url = "http://192.168.0.144/login.php"; 

AlertDialog.Builder builder; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    builder = new AlertDialog.Builder(Login.this); 

    loginUser = (Button)findViewById(R.id.login_button); 
    email = (EditText) findViewById(R.id.login_email); 
    password = (EditText)findViewById(R.id.login_password); 

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

      //check conditions for user email and password 
      userEmail = email.getText().toString(); 
      userPassword = password.getText().toString(); 

      if(userEmail.equals("") || userPassword.equals("")){ 

       builder.setTitle("Something went wrong"); 
       displayAlert("Enter a valid email and password"); 
      }else { 
       //authenticate from server 
       StringRequest stringRequest = new StringRequest(Request.Method.POST, login_url, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         //handle response from server 

         try { 
          JSONArray jsonArray = new JSONArray(response); 
          JSONObject jsonObject = jsonArray.getJSONObject(0); 
          String code = jsonObject.getString("code"); 

          if (code.equals("login failed")){ 
           builder.setTitle("Login error"); 
           displayAlert(jsonObject.getString("message")); 
          }else { 
           Intent i = new Intent(Login.this, MainActivity.class); 
           startActivity(i); 
          } 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 


        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(Login.this, "Error", Toast.LENGTH_SHORT).show(); 
         error.printStackTrace(); 

        } 
       }){ 
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 

         Map<String, String> params = new HashMap<String, String>(); 
         params.put("email", userEmail); 
         params.put("password", userPassword); 
         return params; 
        } 
       }; 
       MySingleton.getInstance(Login.this).addToRequestque(stringRequest); 
      } 

     } 
    }); 

} 
//display alert 
public void displayAlert(String message){ 
    builder.setMessage(message); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      email.setText(""); 
      password.setText(""); 
     } 
    }); 
    AlertDialog alertDialog = builder.create(); 
    alertDialog.show(); 
} 


//registration link 
public void registerUser(View view){ 
    Intent i = new Intent(this, Register.class); 
    startActivity(i); 
} 

} 

あり得ますログインページで何も入力せずにログインをクリックしても、正しい警告が表示されますが、電子メールとパスワードを入力してログインをクリックすると上記のエラーが表示されます。

ダミーのlogin.htmlを作成してテストしたところ、私のPHPスクリプトは正常に動作しています。その場合、私は正しい応答を得ます。

+0

のために行くん文字列であるように見えます[リトルボビー] (http://bobby-tables.com/) *** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされています。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)*** [MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメント。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+0

**プレーンテキストのパスワードを保存しないでください!** *** PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)***を使用してパスワードセキュリティを処理してください。 5.5より小さいPHPバージョンを使用している場合、 'password_hash()' [互換パック](https://github.com/ircmaxell/password_compat)を使用することができます。 ***ハッシュする前に[パスワードをエスケープする](http://stackoverflow.com/q/36628418/1011527)***または他のクレンジングメカニズムを使用する必要はありません。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

+0

受け取ったレスポンスがプレーンな文字列であるように見えます。このAPIを見てください - https://developer.android.com/reference/org/json/JSONArray.html#JSONArray(java.lang.String) –

答えて

0

(OPに代わって掲載された解決策)

変更

$user_email = $_POST["userEmail"]; 
$user_password = $_POST["userPass"]; 

$user_email = $_POST["email"]; 
$user_password = $_POST["password"]; 
0

にあなたの応答は、この

$response['row'] = mysqli_fetch_row($result); 
$response['name'] = $row[0]; 
$response['email'] = $row[1]; 
$response['code'] = "login success"; 
echo json_encode($response); 

と同じように、他の条件

関連する問題