【问题标题】:Android display data from PHP that linked table from one anotherAndroid 显示来自 PHP 的数据,该数据相互链接表
【发布时间】: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


【解决方案1】:

为了完整起见,并总结 cmets 对话,这里是所需的修复。原始基于 PHP 的 JSON 端点中的 SQL 查询没有WHERE 子句,因此它们会将整个表传送到移动应用程序,而不是所需的记录。

此外,每个端点请求都不需要安全详细信息,因此互联网上的任何人都可以检索任何数据,只要他们拥有用户名。我们在此处添加了密码,并建议该应用包含一个凭据对话框和适当的本地存储,作为未来工作的一个项目,以便用户可以识别自己。

存在 SQL 注入漏洞,已通过 MySQLi 驱动程序中的参数绑定修复。

已经注意到,密码永远不应该以明文形式存储。这里需要一个可以在 Java 和 PHP 中工作的哈希系统。

建议的改进

您可能想考虑如何实现这些东西:

  • 连接应该始终通过 HTTPS,如果端点是 HTTP,应用程序应该拒绝连接(安全证书现在是免费的),
  • 应该有一个速率限制器,以便用户每分钟只能获得一定次数的尝试,以防止暴力攻击,
  • 应该有一些 IP 阻塞,因此来自某个 IP 的太多失败尝试会将其锁定一段时间,
  • 应该有一个系统来强制执行最小密码长度和复杂性。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多