Regarding your db, if there's no worry about students loaning cards, and the cards id the student, then why not just have the db log their coming and going (via scanning) without any other interaction from them?
That would definitely be better. To your earlier point, I've spent a while watching...