2

データベースの目的

ホームスクールの情報を保存するために、Apache サーバーで mysql データベースを使用しています。成績表のように各課題を追跡して、科目と月ごとにクエリを実行してスコアを追跡しようとしています。

私のデータベース設計

割り当てはメイン テーブルであり、id(primary auto inc)、student_id、subject_id、points_id、date、Notes_id、および type があります。

notesには、割り当てに関するオプションのメモが含まれており、id(primary auto inc)、メモ、および日付があります。

ポイントには、割り当てに使用できるスコアと合計があり、id(primary auto inc)、受け取った、および合計が含まれています。

Student は生徒(私の子供) のリストであり、id(primary auto inc)、first_name、および last_name が含まれています (はい、この列は私の子供なので無意味であることはわかっていますが、練習のために行いました)。

subjectは現在のサブジェクトのリストであり、id(primary auto inc)、名前、説明が含まれています。私の論理は、毎年必要に応じて実用的に科目を追加できるというものでした。

typeには割り当てのタイプが含まれ、id(primary auto inc)、name、description が含まれます。

印刷するにはどうすれば参加できますか?

課題、生徒、科目、点数、メモを 1 つのテーブルに結合する必要があります。このテーブルを while ループで反復処理して、最近のアクティビティ (データ入力) を html テーブルにエコーアウトできます。

次のような多くのバージョンを試しました。

$result = mysql_query("SELECT * FROM assignment, student, subject, points, notes
                            WHERE assignment.student_id = student.id 
                            AND assignment.subject_id = subject.id 
                            AND assignment.points_id = points.id 
                            ");

そうすることで、空のクエリしか生成されませんでした。誰かが私を正しい方向に向けることができますか? 私が探している最終結果は、次のような表示したい値を割り当てに格納された _id に入力する結合されたテーブルです。

必要に応じて追加情報... データを格納する PHP 関数

function submit_entry($con){
    $student = $_POST['student'];
    $subject = $_POST['subject'];
    $type = $_POST['type'];
    $notes = mysql_real_escape_string($_POST['notes'],$con);
    $received = mysql_real_escape_string($_POST['received'],$con);
    $total = mysql_real_escape_string($_POST['total'],$con);
    
    //Retreive student data
    $token = strtok($student, " ");
    $student_firstname = $token;
    $token = strtok(" ");
    $student_lastname = $token;
    $result = mysql_query("SELECT * FROM student WHERE first_name='$student_firstname'");
    $row = mysql_fetch_array($result);
    $student_id = $row['id'];
    
    //Retrieve subject data
    $result = mysql_query("SELECT * FROM subject WHERE name='$subject'");
    $row = mysql_fetch_array($result);
    $subject_id = $row['id'];
    
    //Retrieve type
    $result = mysql_query("SELECT * FROM type WHERE name='$type'");
    $row = mysql_fetch_array($result);
    $type_id = $row['id'];
    
    //obtain last inserted ID (assignment)
    if(!mysql_query("INSERT INTO points ( received, total)
    VALUES ('$received', '$total')"))
    {
        die('Error:  ' . mysql_error() . ' in points INSERT!');
    }
    $points_id = mysql_insert_id();
        
    if(!mysql_query("INSERT INTO assignment (student_id, subject_id, type, date, points_id)
    VALUES ('$student_id', '$subject_id', '$type_id', NOW(), '$points_id')"))
    {
      die('Error: ' . mysql_error() . ' in assignment INSERT!');
    }
    

}
4

2 に答える 2

1

私はレムの提案に同意しました。各テーブル (学生、科目、およびタイプ) の値をポーリングし、それらを連想配列に格納しています。

function recent_activity($count){

$subject_list;
$student_list;
$assignment_type;
$alt_table = false;

//build arrays with keys for echo
$result = mysql_query("SELECT * FROM subject");
while($row = mysql_fetch_array($result))
{
    $subject_list[$row['id']] = $row['name'];
}

$result = mysql_query("SELECT * FROM student");
while($row = mysql_fetch_array($result))
{
    $student_list[$row['id']] = $row['first_name'] . " " . $row['last_name'];
}

$result = mysql_query("SELECT * FROM assignment ORDER BY date DESC LIMIT $count");
$entry_date = null;

while($row = mysql_fetch_array($result))
{
    if($entry_date != $row['date'])
    {
        if($entry_date == null)
        {
            $entry_date = $row['date'];
            $entry_date_array = date("F j Y", strtotime($row['date']));
            $token = strtok($entry_date_array, " ");
            $token = strtok(" ");
            create_date($token, substr($entry_date_array, 0, 3));
            echo "<table class=\"student-table\">";
            $alt_table = false;
        }
        else
        {
            echo "</table>";
            echo "<div class=\"clear_float\"></div>";
            $entry_date = $row['date'];
            $entry_date_array = date("F j Y", strtotime($row['date']));
            $token = strtok($entry_date_array, " ");
            $token = strtok(" ");
            create_date($token, substr($entry_date_array, 0, 3));
            echo "<table class=\"student-table\">";
            $alt_table = false;
        }
    }

    if($alt_table == true)
    {
        echo "<tr class=\"alt\">";
        $alt_table = false;
    }
    else
    {
        echo "<tr>";
        $alt_table = true;
    }

    echo "<td>" . "<a href=\"" . $student_list[$row['student_id']] . "\">" . $student_list[$row['student_id']] . "</a>" . "</td>";
    echo "<td>" . $subject_list[$row['subject_id']] . "</td>";
    $row_id = $row['id'];
    $points_result = mysql_query("SELECT * FROM points WHERE id = '$row_id' ");
    $points_row = mysql_fetch_array($points_result);
    echo "<td>" . $points_row['received'] . " / " . $points_row['total'] . "</td>";
    echo "</tr>";
}

echo "</table>";
echo "<div class=\"clear_float\"></div>";
}

function create_date($day, $month){
echo "<div class=\"date\">" . "<p>" . $day ."<span>" . $month . "</span>" . "</div>";
}
?>

相変わらずタッチバギーです。テーブルを日付で区切り、css で作成された日付ブロックをそれぞれの前に挿入したい。現在、ステートメントの予期しない問題の結果として、不正確に作成された日付を取得しています

if($entry_date != $row['date'])

私の詳細の徹底から、このプロジェクトがいかに宿題と誤解される可能性があるかが分かります. プロの医療機械プログラマー/オペレーターとして、情報を明確に伝えることの重要性を認識しています。

于 2012-09-24T05:27:57.653 に答える
0

あなたの問題の一部はINNER JOIN、クエリで を使用していることだと思います。つまり、すべてのテーブルにレコードが存在する必要があります。代わりにa を使用することをお勧めしLEFT JOINます:

select *
from assignment a
left join notes n
  on a.notes_id = n.id
left join points p
  on a.points_id = p.id
left join student stu
  on a.student_id = stu.id
left join subject sub
  on a.subject_id = sub.id
left join type t
  on a.type_id = t.id

構文に慣れていない場合JOINは、次のリンクが役立ちます。

SQL 結合の視覚的な説明

于 2012-09-17T19:58:42.217 に答える