【发布时间】:2018-01-13 18:14:35
【问题描述】:
我目前正在努力解决如何正确显示链接到 PHP 中另一个表的表中的详细信息。现在我的 Android 代码有多个显示不同细节的片段,我可以将这些信息从 php 显示到 android 代码中,但是当我登录用户名时,这些细节的显示方式不同。
假设我有个人资料片段、余额片段和记录片段。现在,当我登录给定的用户名时,这些片段会显示其他用户详细信息。
另外,在我的 PHP 服务器中,我创建了 3 个表,每个表都相互链接。在我的 PHP 代码中,我为每个表创建单独的文件,因为我遵循互联网上的一些可以从 php 获取数据的指南。
表 1:
表 2
这是 balance.php 代码:
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','ips');
$con = mysqli_connect(HOST,USER,PASS,DB);
$sql = "select * from account_details";
$res = mysqli_query($con,$sql);
$result = array();
$row = mysqli_fetch_assoc($res);
array_push($result,
array(
"Balance"=>$row['Balance'],
));
echo json_encode(array("result"=>$result));
mysqli_close($con);
?>
这是parking_record.php代码
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','ips');
$con = mysqli_connect(HOST,USER,PASS,DB);
$sql = "select * from parking_record";
$res = mysqli_query($con,$sql);
$result = array();
$row = mysqli_fetch_assoc($res);
array_push($result,
array(
"Parking_Amount"=>$row['Parking_Amount'],
"Date_Time"=>$row['Date_Time'],
));
echo json_encode(array("result"=>$result));
mysqli_close($con);
?>
最后这是 profile_details.php 代码
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','ips');
$con = mysqli_connect(HOST,USER,PASS,DB);
$sql = "select * from profile_details";
$res = mysqli_query($con,$sql);
$result = array();
$row = mysqli_fetch_assoc($res);
array_push($result,
array(
"FullName"=>$row['FullName'],
"DateOfBirth"=>$row['DateOfBirth'],
));
echo json_encode(array("result"=>$result));
mysqli_close($con);
?>
安卓代码
Balance.java
public class dri_balance extends ArrayAdapter<String> {
private String[] Acc_Balance;
private Activity context;
public dri_balance(Activity context, String[] Acc_Balance) {
super(context, R.layout.fragment_balance, Acc_Balance);
this.context = context;
this.Acc_Balance = Acc_Balance;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.fragment_balance, null,
true);
TextView tvBlnf = (TextView) listViewItem.findViewById(R.id.tvBlnf);
tvBlnf.setText(Acc_Balance[position]);
return listViewItem;
}
}
BalanceFragment.java
public class BalanceFragment extends Fragment implements
View.OnClickListener {
public BalanceFragment() {
// Required empty public constructor
}
public static final String JSON_URL =
"http://192.168.1.2/json_balance_records.php";
private Button buttonGet;
private ListView listView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.activity_listview, container,
false);
buttonGet = (Button) rootView.findViewById(R.id.buttonGet);
buttonGet.setOnClickListener(this);
listView = (ListView) rootView.findViewById(R.id.listView);
return rootView;
//return inflater.inflate(R.layout.fragment_profile, container, false);
}
private void sendRequest(){
StringRequest stringRequest = new StringRequest(JSON_URL, new
Response.Listener<String>() {
@Override
public void onResponse(String response) {
showJSON(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity().getApplicationContext(),error.getMessage(),
Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue =
Volley.newRequestQueue(getActivity().getApplicationContext());
requestQueue.add(stringRequest);
}
private void showJSON(String json){
Dri_Balance pj = new Dri_Balance(json);
pj.parseJSON();
dri_balance cl = new dri_balance(getActivity(),
Dri_Balance.Acc_Balance);
listView.setAdapter(cl);
}
@Override
public void onClick(View v) {
sendRequest();
}
}
parseJson Balance.java
public class Dri_Balance {
public static String[] Acc_Balance;
public static final String JSON_ARRAY = "result";
public static final String KEY_DriBalance = "Acc_Balance";
private JSONArray users = null;
private String json;
public Dri_Balance(String json){
this.json = json;
}
public void parseJSON(){
JSONObject jsonObject=null;
try {
jsonObject = new JSONObject(json);
users = jsonObject.getJSONArray(JSON_ARRAY);
Acc_Balance = new String[users.length()];
for(int i=0;i<users.length();i++){
JSONObject jo = users.getJSONObject(i);
Acc_Balance[i] = jo.getString(KEY_DriBalance);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
如何在Android中显示正确的数据?
对不起,我问的太多了,我确实在互联网上搜索过,但它没有给我想要的东西。我知道我要求有人为我做作业,但我对 Android 和 PHP 很陌生。
新的 PHP 代码
我已经编辑了 balance.php 代码(第 2 版):
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','ips');
$con = mysqli_connect(HOST,USER,PASS,DB);
$sql = "select Balance from account_details WHERE Username='$Username'";
$res = mysqli_query($con,$sql);
$result = array();
$row = mysqli_fetch_assoc($res);
array_push($result,
array(
"Balance"=>$row['Balance'],
));
echo json_encode(array("result"=>$result));
mysqli_close($con);
?>
我尝试运行它给我空值的 php 文件
{
"result": [{
"Balance": null
}]
}
编辑 balance.php 代码(版本 3)
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','ips');
$Username = $_GET["Username"];
$mysqli = mysqli_connect(HOST,USER,PASS,DB);
$stmt = $mysqli->prepare ("SELECT Balance from account_details WHERE
Username=?");
$stmt->bind_param('s', $Username);
$stmt->execute();
$stmt->bind_result($Balance);
$rows = array();
while($stmt->fetch()) {
array_push($rows, array('Balance'=>$Balance));
}
$stmt->close();
$mysqli->close();
echo json_encode($rows);
?>
结果
[{"Balance":"50.512"}]
好的,我已经成功在PHP中加入了表格,可以得到我想要的结果。现在我尝试运行我的Android代码,当我点击显示数据时它崩溃了,我该如何更正代码?
【问题讨论】:
-
当您的应用程序连接到您的 PHP 服务器时,看起来您正在一次检索每个表中的所有记录。通常您必须发送标识符(如用户名、哈希和/或密码),以便返回正确的记录。我想知道解决这个问题是否是一个不错的起点。
-
专业提示:(a) 您不需要在数据库中存储“确认密码”——这只是确保用户输入正确的一种方式。创建记录时,要求两次,确保它们相同,然后存储一次。 (b) 不要以明文形式存储密码,这会使您的用户容易受到二次重用攻击。我很感激这是家庭作业,因此您不会将其用于任何有价值的事情,但了解这是一个漏洞是很有价值的。
-
要获取相关记录,您需要一个在其
SELECT代码中使用JOIN的JSON 端点。在搜索引擎中搜索“SQL JOIN 相关记录”。 -
@halfer 我知道纯文本密码,此时不是问题,但现在我已经添加/编辑了余额 php 文件,但它给了我空值
-
好的,您在该文件中存在 SQL 注入漏洞,因此需要修复。如果你得到一个空值,那么这意味着你有一个数据库错误,或者你的搜索没有返回任何记录。由于这是一个
GET操作,您可以在浏览器中调试它,所以我建议先这样做。查找http://localhost/balance.php?Username=myname。但是我看不到$Username的来源——您需要使用$_GET['Username']从查询字符串中读取它。
标签: java php android mysql android-fragments