For simplicity's sake let's assume there's only one admin and that the students have a fixed, unchanging number of fields they can edit. You'll have a table students and then a table students_info, which has id, student_id, updated, and the info. When updating a student's info your easiest solution is to INSERT a new record instead of an UPDATE. that way when the admin logs in to check for changes you can say "which student_info have updated since X" and then you can get student_info (where updated<=X) and compare field-by-field to student_info (latest version). Whatever doesn't match has been updated.
Alternately you can store each piece of student_info data as a separate entity (id, student_id, field_id, field_value, updated) and then scan for all student_info updated since time X. In this second method you can use either the UPDATE or INSERT methods. If you use UPDATE you won't be able to roll back a user's changes but you also run less risk of causing your student_info_id to roll over.