私は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スクリプトは正常に動作しています。その場合、私は正しい応答を得ます。
のために行くん文字列であるように見えます[リトルボビー] (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)でも安全ではありません! –
**プレーンテキストのパスワードを保存しないでください!** *** 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)***または他のクレンジングメカニズムを使用する必要はありません。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –
受け取ったレスポンスがプレーンな文字列であるように見えます。このAPIを見てください - https://developer.android.com/reference/org/json/JSONArray.html#JSONArray(java.lang.String) –