3

由于可能发生的所有问题以及我认为它可能带来的安全风险,我担心我的 Java 客户端直接连接到 MySQL 服务器。例如有人能够反编译文件并获取数据库的登录详细信息。尽管它很漂亮,但我不敢冒险。我编写了一个 PHP 脚本来回显客户端可以解释的数据。PHP 脚本是连接到 MySQL 的。

很简单:Java->PHP->MySQL

我将提供 MySQL 结构的屏幕截图,以便您在尝试将其可视化时更好地理解。 在此处输入图像描述 http://i.imgur.com/5EViC.png 在此处输入图像描述 在此处输入图像描述

id:可能是 tid/sid

tid:教师ID,用于链接教师

sid:学生id,用于链接学生

gid:年级编号

援助:作业编号

gp:获得积分

pp:可能的点

评分行是针对每个学生的每个作业。因此,例如,如果一位教师将 30 名学生分配给一项作业,那么评分选项卡中将有 30 行,而作业中将有 1 行。不允许重复的分配名称。

当客户端请求数据时,我只使用缓冲的阅读器和 URL 来下载字符串。这是客户端收到分配名称时的示例输出。

Test Assignment;Secondary Test Assignment;

这是下载列名后客户端的样子: 在此处输入图像描述

如您所见,前两列默认情况下存在,最后两列是分配名称。

我希望表中的每一行都是学生。但是,这就是我的麻烦所在。我正在尝试从分级中接收正确的数据。我不知道我要怎么做。我有大约 3 个月的 Java 经验,所以你绝对可以称我为新手。

这是我的想法,但我认为这不是一个好主意: 搜索所有列名并将值插入到分配名称匹配的那一行中的正确列中。

我不知道那会有多难。我猜开发swing的好人为此做了一些事情,但我找不到任何资源。

有人对在这种情况下该怎么做有任何建议吗?我感到失落。

4

2 回答 2

1

至于保护您的数据库,我建议创建一个只能执行存储过程的锁定用户 - 这样您就不必担心有人反编译您的代码。他们只能通过您的代码访问他们可以访问的内容。 这是有关如何执行此操作的教程。

就您的主要问题而言,我建议您在 SQL 查询中完成所有数据收集/排序。如果您在 中这样做JTable,您最终会混合您的模型和视图(有关更多详细信息,请参阅MVC)。

所以本质上你希望你的数据以这种形式从查询中返回:

Student; Student Name; Test Assignment; Secondary Test Assignment

意思是,

  1. 您需要在成绩表和作业表之间添加关系(很可能添加aidgrading表中)
  2. 你需要想出一个稍微复杂一点的 SQL 查询——像这样:

    Select g.sid, g.name, a.name from ASSIGNMENTS a join GRADING g on a.aid = g.aid where g.tid = 123123 order by g.name

  3. 根据数据创建一个二维数组并将其放入表中(如果您仍在使用 PHP 界面,则需要拆分分隔符上的字符串以创建一个二维数组。)

    ((DefaultTableModel)table.getModel).setDataVector(data, columnNames);

编辑 如果您确信您只想在行中搜索一个值,然后更新您找到的行中的一列 - 这应该会让您朝着正确的方向前进:

Integer searchStudentID = 123123;
int searchColumn = 0;
String updateValue = "Value";
int updateColumn = 3;

//Look through the table for the right row
Vector<Vector<Object>> data = ((DefaultTableModel)table.getModel()).getDataVector();
for(Vector<Object> row : data){
    // If on the right row, update it
    if(row.elementAt(searchColumn).equals(searchStudentID)){
        row.setElementAt(updateValue, updateColumn);
    }
}
于 2012-08-19T16:52:13.860 回答
1

让我们从 Java 客户端开始。这是一些从 php 页面读取并从中创建的代码JTable。(实际上它是从 a 中读取的String,但您可以轻松更改代码以匹配您的实际情况,请参阅代码中的注释)。

public static void main(String[] args) throws Exception {
    String receivedFromPHP = "Student ID;Student Name;Test Assignment;Secondary Test Assignment;\n"
            + "1;Luc;Test assignment 1;Secondary Test assignment 1;\n"
            + "2;Vador;Test assignment 2;Secondary Test assignment 2;";

    BufferedReader br = new BufferedReader(new StringReader(receivedFromPHP));
    // For real: br = new BufferedReader(new InputStreamReader(new URL("http://localhost/yourPhpPage.php").openStream()));

    DefaultTableModel dtm = new DefaultTableModel();

    String line;
    boolean headersReceived = false;
    while ((line = br.readLine()) != null) {
        String[] columns = line.split(";");
        if (!headersReceived) {

            dtm.setColumnIdentifiers(columns);
            headersReceived = true;
        } else {
            dtm.addRow(columns);
        }
    }

    JTable table = new JTable(dtm);
    JFrame f = new JFrame();
    f.add(new JScrollPane(table));
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

直到现在都没有什么困难的。真正的事情是使用正确的查询编写 php 页面。显然,你更清楚你希望你的页面输出什么,但我想你会这样做:

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "pinkfluf_dvonx");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}


/* Select queries return a resultset */
if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) {
    printf("Select returned %d rows.\n", $result->num_rows);

    /* free result set */
    $result->close();
}

/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = $mysqli->query('SELECT u.id AS "Student ID", u.username AS "Student Name", ... FROM members u, grading g, assignments a WHERE ...')) {

    while($row = $result->fetch_array(MYSQLI_NUM)) {
        for ($i=0; $i<sizeof($row); $i++) {
            echo $row[$i] . ";";
        }
        echo "\n";
    }

    $result->close();
}

$mysqli->close();
?>

当然,我在这里给出的代码是非常近似的(鉴于我可以从您的问题中提取的信息),所以可以肯定的是,您需要调整代码以使其按您的意愿工作,但我希望它可以帮助你开始了(继续前进:))。

于 2012-08-20T19:45:23.740 回答