Probleem:
Afgelopen weekend stuurde de beheerder van Autostrada.tv een e-mail dat hij geen reacties meer kon goedkeuren. Wanneer je op goedkeuren klikte werd deze goedgekeurd maar na de pagina te herladen werd dit weer teruggedraaid. De actie werd niet definitief opgeslagen in de database.
Klikken onder de reactie op “Wijzigen” zorgde voor de foutmelding “Ongeldig reactie-ID. Ga terug”. De knop “Verwijderen” toonde dezelfde foutmelding. Via PHPMyAdmin blijkt dat de reactie echt bestaat. Het overzicht van reacties in WordPress bewijst dit ook.
Reden dat het fout gaat:
Wanneer een actie op een reactie wordt uitgevoerd zoals goedkeuren/wijzigen/verwijderen, wordt hiervoor een uniek record id gebruikt dat opgeslagen staat in de wp_comments tabel. De URL ziet er bij een klik op “Wijzigen” zo uit: www.domein.nl/wp-admin/comment.php?action=editcomment&c=12345.
In het geval van Autostrada was het id 12345 veranderd in een nummer van 18 cijfers. Het veld in de database gaat tot 20 dus dat kon het probleem niet zijn. De id in de URL wordt door WordPress in het bestand wp-admin/comment.php veilig gemaakt via de functie absint() op regel 69. Deze functie voert eigenlijk de volgende regel PHP code uit: abs(intval($foo));
Ervan uitgaande dat de webserver 32 bits ondersteund accepteert intval getallen in een range van -2147483648 tot 2147483647, wat dus betekent dat een id niet meer dan 10 cijfers mag bevatten. Met deze achtergrond informatie was het mogelijk om de grens te vinden bij de reacties die wel beheerd konden worden en welke niet. Getallen hoger dan dit geven het maximale getal terug dat intval() accepteert te weten 2147483647.
In de afgelopen weken waren de onderstaande plug-ins geïnstalleerd en weer verwijderd:
- https://nl.wordpress.org/plugins/seo-facebook-comments/
- https://nl.wordpress.org/plugins/facebook-comments-sync/
- https://nl.wordpress.org/plugins/facebook-comments-plugin/
Vermoedelijk zorgde een van deze plug-ins ervoor dat de ids in de database steeds meer cijfers gingen gebruiken. Binnen enkele reacties was het id van 5 naar meer dan 10 getallen gegroeid terwijl normaal MySQL het id met 1 ophoogt tijdens het toevoegen van een nieuwe record.
Het blijft bij een aanname omdat het hierna niet getest is aangezien de oplossing meer prioriteit had. Zie ook onderstaande screenshot van de wp_comments tabel die een vreemde groei van ids laat zien.
Oplossing:
De oplossing was de reacties met vreemde nummers opnieuw te nummeren in een opvolgende volgorde en de tabel auto increment te resetten naar het eerst vrije nummer. In het geval van Autostrada werd er opnieuw genummerd vanaf 15312
Oplossing getest op:
CentOs 32 bits, Apache webserver, WordPress 4.3.1