Input text upload to MySQL DB
Can someone tell me if this is clean code...

The code is somewhat easy to read (e.g. it appears to somewhat align with the recommendations of PSR-12. It is also great that parameters are bound to the queries so SQL injection should be less likely to occur.

...or if it's too much?

The mixing of PHP within HTML is not great. It is recommended to have the PHP fetch data and then within the HTML just output any data that might have been retrieved.
There are quite a few duplicate lines in these three blocks:

if (isset($_POST['beginner'])) {
    # code...
    $get_exercises = $con-&gt;prepare(&quot;SELECT exercise_name, difficulty FROM exercises WHERE difficulty = ?&quot;);
    $get_exercises-&gt;bind_param(&quot;s&quot;, $_POST['beginner']);
    $get_exercises-&gt;execute();
    $get_exercises-&gt;store_result();
    $num_of_rows = $get_exercises-&gt;num_rows;
    $get_exercises-&gt;bind_result($exercise_selected, $difficulty);
}

if (isset($_POST['intermediate'])) {
    # code...
    $get_exercises = $con-&gt;prepare(&quot;SELECT exercise_name, difficulty FROM exercises WHERE difficulty = ?&quot;);
    $get_exercises-&gt;bind_param(&quot;s&quot;, $_POST['intermediate']);
    $get_exercises-&gt;execute();
    $get_exercises-&gt;store_result();
    $num_of_rows = $get_exercises-&gt;num_rows;
    $get_exercises-&gt;bind_result($exercise_selected, $difficulty);
}

if (isset($_POST['advanced'])) {
    # code...
    $get_exercises = $con-&gt;prepare(&quot;SELECT exercise_name, difficulty FROM exercises WHERE difficulty = ?&quot;);
    $get_exercises-&gt;bind_param(&quot;s&quot;, $_POST['advanced']);
    $get_exercises-&gt;execute();
    $get_exercises-&gt;store_result();
    $num_of_rows = $get_exercises-&gt;num_rows;
    $get_exercises-&gt;bind_result($exercise_selected, $difficulty);
}


It appears that only two of each eight lines in each block changes - i.e. the if condition and the second parameter passed to $get_exercises-&gt;bind_param().
A commonly accepted principle is the Don't Repeat Yourself. principle. The common lines could be abstracted to a function, or even a simple check for common values:
Instead of setting the name attribute uniquely on each button

&lt;button id=&quot;beginner&quot; name=&quot;beginner&quot; value=&quot;beginner&quot;&gt;Beginner&lt;/button&gt;&lt;br&gt;&lt;br&gt;


Set the name on all three the same - e.g. name=“difficulty”. That can make the query logic much simpler:
//initialize to avoid undefined variables if POST not set
$exercise_selected = $difficulty = null;
if (isset($_POST['difficulty']) {
    $get_exercises = $con-&gt;prepare(&quot;SELECT exercise_name, difficulty FROM exercises WHERE difficulty = ?&quot;);
    $get_exercises-&gt;bind_param(&quot;s&quot;, $_POST['difficulty']);
    $get_exercises-&gt;execute();
    $get_exercises-&gt;store_result();
    $num_of_rows = $get_exercises-&gt;num_rows;
    $get_exercises-&gt;bind_result($exercise_selected, $difficulty);
}