2

数据库的目的

我正在使用带有 Apache 服务器的 mysql 数据库来存储家庭学校信息。我正在尝试跟踪类似于成绩册的每项作业,我可以在其中按主题和月份查询以跟踪分数。

我的数据库设计

assignment是主表,具有:id(primary auto inc)、student_id、subject_id、points_id、date、Notes_id 和 type。

notes包含关于作业的可选注释,并具有 id(primary auto inc)、note 和 date。

points具有可用于分配的分数和总分,并包含 id(primary auto inc)、received 和 total。

student是一个学生列表(我的孩子),包含 id(primary auto inc)、first_name 和 last_name(是的,我知道这个专栏是我的孩子,但我这样做是为了练习)。

subject是当前主题的列表,包含 id(primary auto inc)、name、description。我的逻辑是我每年都可以根据需要务实地添加更多科目。

type包含分配的类型,并包含 id(primary auto inc)、name、description。

现在我如何加入打印出来?

我需要将作业、学生、主题、分数、笔记加入到一个表中,我可以使用 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,例如:html 表中的 2012 年 9 月 12 日 Jane Doe 数学测验 25/28。

如果需要,请提供其他信息... 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

我同意 Remm 的建议。我正在轮询每个表(学生、主题和类型)中的值并将它们存储在关联数组中。

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在查询中使用了一个,这意味着记录需要存在于所有表中。我建议使用 aLEFT 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 回答