Votre logique mysqli semble correcte, il y a quelques exemples dans le manuel PHP ici au cas où vous ne les auriez pas vus.
Pourquoi sélectionnez-vous l'ID lorsque vous ne le consommez pas ? De plus, vous n'avez pas vraiment besoin de lier un résultat lorsqu'il n'y aura qu'une seule ligne renvoyée dans le jeu de résultats complet, car je suppose que cela se produira dans ce cas (l'ID est un index unique dans la table), utilisez get_result à la place.
L'utilisation de mysqli prepare protégera contre toutes les attaques par injection courantes, mais pas contre les trucs de style 0-day qui n'ont pas encore atteint le pilote.