help with millis()

This
if (digitalRead (buttonPin) == LOW) // check if the button is pressed
suggests your button connects to Gnd when pressed.

This
pinMode (buttonPin, INPUT);
says you are not utilizing the internal pullup.
Change to
pinMode (buttonPin, INPUT_PULLUP);
to ensure the pin is not floating and leading to what would appear as false low readings and the repeated actions you see.