3

発生する可能性のあるすべての問題と、それがもたらす可能性があると思われるセキュリティ リスクのために、Java クライアントが MySQL サーバーに直接接続することを懸念しています。誰かがファイルを逆コンパイルして、データベースのログイン詳細を取得できるなど。どんなに美しくても、そのリスクを冒すには怖すぎる。クライアントが解釈できるデータをエコーする PHP スクリプトを作成しました。PHP スクリプトは、MySQL に接続するものです。

かなり単純です: Java->PHP->MySQL

MySQL 構造のスクリーンショットを提供するつもりなので、これを視覚化しようとすると理解が深まるかもしれません。 ここに画像の説明を入力 http://i.imgur.com/5EViC.png ここに画像の説明を入力 ここに画像の説明を入力

id: おそらく tid/sid

tid: 教師へのリンクに使用される教師 ID

sid: 学生へのリンクに使用される学生 ID

gid: 学年ID

援助: 割り当て ID

gp: 獲得ポイント

pp: 可能なポイント

採点行は、生徒ごとの課題ごとです。たとえば、教師が 1 つの課題に 30 人の生徒を割り当てている場合、採点タブに 30 行、課題に 1 行が表示されます。割り当て名の重複は許可されていません。

クライアントがデータを要求しているときは、バッファリングされたリーダーと URL を使用して文字列をダウンロードします。これは、クライアントが割り当て名を受け取ったときの出力例です。

Test Assignment;Secondary Test Assignment;

列名がダウンロードされると、クライアントには次のように表示されます。 ここに画像の説明を入力

ご覧のとおり、最初の 2 つの列はデフォルトでそこにあり、最後の 2 つは割り当て名です。

テーブルの各行を学生にしたい。しかし、ここで問題が発生します。グレーディングから適切なデータを取得しようとしています。どうすればいいのかわかりません。私は Java で約 3 か月の経験があるので、間違いなく初心者と呼ぶことができます。

これが私のアイデアですが、それほど素晴らしいアイデアだとは思いませんでした。 すべての列名を検索し、割り当て名が一致する行の適切な列に値を挿入します。

それがどれほど難しいことか、私は知りませんでした。私は、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. データに基づいて 2D 配列を作成し、テーブルに配置します (まだ PHP インターフェイスを使用している場合は、区切り文字で文字列を分割して 2D 配列を作成する必要があります)。

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

EDIT 行を検索して値を探し、見つけた行の列を更新したいだけだと確信している場合は、正しい方向に進むはずです。

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。(実際にはString、簡単にするために a から読み取っていますが、実際のケースに合わせてコードを簡単に変更できます。コード内のコメントを参照してください)。

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 に答える