Hi, I am working on building a PHP-CLI 'game' for converting binary/hex/decimal, to better your speed at converting between base number systems. I started on the game class, and created a little menu with user input for different game modes. If the user inputs invalid data, the script is supposed to say 'invalid' and ask for the input again. Then, as long as the data remains invalid, the user is continuously prompted until the data is valid, whereas the correct method is called. My issue is that when invalid data is input, the 'invalid, try again' message is displayed 3 times before the script stops for the user to try again. So instead of: Invalid data. Mode: (here, waits for the user to input) it says: Invalid data. Mode: Invalid data. Mode: Invalid data. Mode: (here, waits for the user to input) I have tried altering my loop a few different ways, to no avail. This is also my very first php-cli and so I am a bit of a newb when it comes to php-cli. The code is below. I'm not worried about other portions of the code at this point; can anyone see what I am doing incorrectly that is looping this message three times instead of just displaying once? class BaseGame { public function run() { fwrite(STDOUT,$this->welcome()); $input = $this->getSelection(); $this->decideMode($input); } private function welcome() { $menu = "Welcome to the Binary/Hexadecimal conversion Practice Tool.\n"; $menu.= "This tool is used as a game for learning binary/hexadecimal/decimal conversion.\n\n"; $menu.= "\tTo continue, please select your game mode.\n\n"; $menu.= "\t[Mode]\t[Description]\n"; $menu.= "\tA.)\tGiven a random binary value, resolve to decimal.\n"; $menu.= "\tB.)\tGiven a random binary value, resolve to hexadecimal.\n"; $menu.= "\tC.)\tGiven a random hexadecimal value, resolve to binary.\n"; $menu.= "\tD.)\tGiven a random hexadecimal value, resolve to decimal.\n"; $menu.= "\tE.)\tGiven a random decimal value, resolve to binary.\n"; $menu.= "\tF.)\tGiven a random decimal value, resolve to hexadecimal.\n"; $menu.= "\tG.)\tGiven two random values, decide which is larger.\n"; $menu.= "\tQ.)\tQuit.\n\n"; $menu.= "\tTo begin, simply type the mode letter.\n\n"; return $menu; } private function getSelection() { fwrite(STDOUT,"Mode: "); $input = strtoupper(fgetc(STDIN)); return $input; } private function decideMode($input) { while($input) { if($input == "Q") { exit(0); } elseif($input == "A") { $this->binary2decimal(); } elseif($input == "B") { $this->binary2hexadecimal(); } elseif($input == "C") { $this->hexadecimal2binary(); } elseif($input == "D") { $this->hexadecimal2decimal(); } elseif($input == "E") { $this->decimal2binary(); } elseif($input == "F") { $this->decimal2hexadecimal(); } elseif($input == "G") { $this->comparison(); } else { fwrite(STDOUT,"\nInvalid choice. Choose again.\n"); $input = $this->getSelection(); } } exit(0); }