mfrc522.PICC_IsNewCardPresent();
It's useless to call this function when you don't give a rats ass what it returns.
Your action() method is nonsense. You do NOT compare the contents of arrays like that. There is a really stupidly simple to use function, memcmp(), that compares arrays correctly.
It would also make sense to change checkread() to actually do what the name suggests. Check that there is a card AND read the card. Return true only if the card is successfully read.