Java php文件返回一个空数组,can';不显示用户信息
我正在使用php将我的android应用程序连接到在线托管的数据库。这里是指向保存php文件的页面的链接,这样您就可以看到它输出的内容,一个空数组 给我带来问题的是fetchUserData,它应该使用用户提供的用户名和密码来搜索该用户,然后显示用户表中与用户名匹配的所有其他行 这是连接到数据库的php文件(我知道连接很好,因为我的注册活动成功地在列中创建了一个新行)Java php文件返回一个空数组,can';不显示用户信息,java,php,android,Java,Php,Android,我正在使用php将我的android应用程序连接到在线托管的数据库。这里是指向保存php文件的页面的链接,这样您就可以看到它输出的内容,一个空数组 给我带来问题的是fetchUserData,它应该使用用户提供的用户名和密码来搜索该用户,然后显示用户表中与用户名匹配的所有其他行 这是连接到数据库的php文件(我知道连接很好,因为我的注册活动成功地在列中创建了一个新行) 请不要存储明文密码。这完全是为了一个课堂项目,我的教授告诉我们只有在完成后才需要担心安全问题。 <?php /*serve
请不要存储明文密码。这完全是为了一个课堂项目,我的教授告诉我们只有在完成后才需要担心安全问题。
<?php
/*server, user, password, databse */
$conn=mysqli_connect("xxx", "xxx", "xxx","xxx");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$password = $_POST["password"];
$username = $_POST["username"];
$statement = mysqli_prepare($conn, "SELECT * FROM User WHERE username = ? AND password = ?");
if($statement === FALSE){ die(mysqli_error($conn)); }
mysqli_stmt_bind_param($statement, "ss", $username, $password);
mysqli_stmt_execute($statement);
//printf("Error: %s.\n", mysqli_stmt_error($statement));
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $id, $username, $name, $sex, $age, $password);
$user = array ();
while(mysqli_stmt_fetch($statement)){
$user[username] = $username;
$user[name] = $name;
$user[sex] = $sex;
$user[age] = $age;
$user[password] = $password;
}
echo json_encode($user);
mysqli_close($conn);
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
Button bLogin;
EditText etUsername, etFirst, etLast, etSex, etAge, etPassword;
TextView tvRegisterLink;
UserLocalStore userLocalStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
bLogin = (Button) findViewById(R.id.bLogin);
tvRegisterLink = (TextView) findViewById(R.id.tvRegisterLink);
bLogin.setOnClickListener(this);
tvRegisterLink.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bLogin:
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
User user = new User(username, password);
authenticate(user);
break;
case R.id.tvRegisterLink:
startActivity(new Intent(this, RegisterActivity.class));
break;
}
}
private void authenticate(User user){
ServerRequests serverRequests = new ServerRequests(this);
serverRequests.fetchUserDataInBackground(user, new GetUserCallback() {
@Override
public void done(User returnedUser) {
if (returnedUser == null) {
showErrorMessage();
} else {
logUserIn(returnedUser);
}
}
});
}
private void showErrorMessage(){
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(LoginActivity.this);
dialogBuilder.setMessage("Incorrect user info");
dialogBuilder.setPositiveButton("Ok", null);
dialogBuilder.show();
}
private void logUserIn(User returnedUser){
userLocalStore.storeUserData(returnedUser);
userLocalStore.setUserLoggedIn(true);
startActivity(new Intent(this, ProfileActivity.class));
}
/*public void openHome(View view) {
//build the intent
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_games) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void openHome(View view) {
// build the intent
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
}
public class User {
String username, name, sex, password;
int age;
public User (String username, String name, String sex, int age,
String password){
this.username = username;
this.name = name;
this.sex = sex;
this.age = age;
this.password = password;
}
public User(String username, String password) {
this.username = username;
this.password = password;
this.name = "";
this.sex = "N/A";
this.age = -1;
}
}
public class UserLocalStore {
public static final String SP_NAME = "userDetails";
SharedPreferences userLocalDatabase;
public UserLocalStore(Context context) {
userLocalDatabase = context.getSharedPreferences(SP_NAME, 0);
}
public void storeUserData(User user){
SharedPreferences.Editor spEditor = userLocalDatabase.edit();
spEditor.putString("username", user.username);
spEditor.putString("name", user.name);
spEditor.putString("sex", user.sex);
spEditor.putInt("age", user.age);
spEditor.putString("password", user.password);
}
public User getLoggedInUser(){
String username = userLocalDatabase.getString("username", "");
String name = userLocalDatabase.getString("name", "");
String sex = userLocalDatabase.getString("sex", "");
int age = userLocalDatabase.getInt("age", -1);
String password = userLocalDatabase.getString("password", "");
User storedUser = new User(username, name, sex, age, password);
return storedUser;
}
public void setUserLoggedIn(boolean loggedIn){
SharedPreferences.Editor spEditor = userLocalDatabase.edit();
spEditor.putBoolean("loggedIn", loggedIn);
spEditor.commit();
}
public boolean getUserLoggedIn(){
if (userLocalDatabase.getBoolean("LoggedIn", false)) {
return true;
}else{
return false;
}
}
public void clearUserData(){
SharedPreferences.Editor spEditor = userLocalDatabase.edit();
spEditor.clear();
spEditor.commit();
}
}
public class ProfileActivity extends AppCompatActivity implements View.OnClickListener {
Button openHome;
Button bLogout;
TextView etUsername, etName, etSex, etAge;
UserLocalStore userLocalStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
etUsername = (TextView) findViewById(R.id.etUsername);
etName = (TextView) findViewById(R.id.etName);
etSex = (TextView) findViewById(R.id.etSex);
etAge = (TextView) findViewById(R.id.etAge);
bLogout = (Button) findViewById(R.id.bLogout);
bLogout.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
}
@Override
protected void onStart() {
super.onStart();
if (authenticate() == true) {
displayUserDetails();
}else{
startActivity(new Intent(ProfileActivity.this, LoginActivity.class));
}
}
private boolean authenticate(){
return userLocalStore.getUserLoggedIn();
}
private void displayUserDetails(){
User user = userLocalStore.getLoggedInUser();
etUsername.setText(user.username);
etName.setText(user.name);
etSex.setText(user.sex);
etAge.setText(user.age + "");
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bLogout:
userLocalStore.clearUserData();
userLocalStore.setUserLoggedIn(false);
startActivity(new Intent(this, LoginActivity.class));
break;
}
}
}
public class ServerRequests {
User user;
GetUserCallback userCallback;
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 1000 * 15;
public static final String SERVER_ADDRESS = "http://6mansquad.esy.es/";
public ServerRequests(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing");
progressDialog.setMessage("Please wait...");
}
public void storedUserDataInBackground(User user, GetUserCallback userCallback) {
progressDialog.show();
new StoreUserDataAsyncTask(user, userCallback).execute();
}
public void fetchUserDataInBackground(User user, GetUserCallback callBack) {
progressDialog.show();
new fetchUserDataAsyncTask(user, callBack).execute();
}
public class StoreUserDataAsyncTask extends AsyncTask<Void, Void, Void> {
User user;
GetUserCallback userCallback;
public StoreUserDataAsyncTask(User user, GetUserCallback userCallback) {
this.user = user;
this.userCallback = userCallback;
}
@Override
protected Void doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("name", user.name));
dataToSend.add(new BasicNameValuePair("sex", user.sex));
dataToSend.add(new BasicNameValuePair("age", user.age + ""));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS + "Register.php");
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
client.execute(post);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
progressDialog.dismiss();
userCallback.done(null);
super.onPostExecute(aVoid);
}
}
public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {
User user;
GetUserCallback userCallback;
public fetchUserDataAsyncTask(User user, GetUserCallback userCallback) {
this.user = user;
this.userCallback = userCallback;
}
@Override
protected User doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS + "FetchUserData.php");
User returnedUser = null;
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
String result = EntityUtils.toString(entity);
JSONObject jObject = new JSONObject(result);
if (jObject.length() == 0) {
returnedUser = null;
} else {
String name = jObject.getString("name");
String sex = jObject.getString("sex");
int age = jObject.getInt("age");
returnedUser = new User(user.username, name, sex, age, user.password);
}
} catch (Exception e) {
e.printStackTrace();
}
return returnedUser;
}
@Override
protected void onPostExecute(User returnedUser) {
progressDialog.dismiss();
userCallback.done(user);
super.onPostExecute(returnedUser);
}
}
}
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
Button bLogin;
EditText etUsername, etFirst, etLast, etSex, etAge, etPassword;
TextView tvRegisterLink;
UserLocalStore userLocalStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
bLogin = (Button) findViewById(R.id.bLogin);
tvRegisterLink = (TextView) findViewById(R.id.tvRegisterLink);
bLogin.setOnClickListener(this);
tvRegisterLink.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bLogin:
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
User user = new User(username, password);
authenticate(user);
break;
case R.id.tvRegisterLink:
startActivity(new Intent(this, RegisterActivity.class));
break;
}
}
private void authenticate(User user){
ServerRequests serverRequests = new ServerRequests(this);
serverRequests.fetchUserDataInBackground(user, new GetUserCallback() {
@Override
public void done(User returnedUser) {
if (returnedUser == null) {
showErrorMessage();
} else {
logUserIn(returnedUser);
}
}
});
}
private void showErrorMessage(){
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(LoginActivity.this);
dialogBuilder.setMessage("Incorrect user info");
dialogBuilder.setPositiveButton("Ok", null);
dialogBuilder.show();
}
private void logUserIn(User returnedUser){
userLocalStore.storeUserData(returnedUser);
userLocalStore.setUserLoggedIn(true);
startActivity(new Intent(this, ProfileActivity.class));
}
/*public void openHome(View view) {
//build the intent
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_games) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void openHome(View view) {
// build the intent
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
}