PHP:需要仔细检查这个小代码中的错误

I have this simple Select box that is suppose to store the selected value in a hidden input, which can then be used for POST (I am doing it this way to use data from disabled drop down menus)

<body>
    <?php 
    $Z = $_POST[hdn];
    ?>
    <form id="form1" name="form1" method="post" action="test.php">
    <select name="whatever" id="whatever" onchange="document.getElementById('hdn').value = this.value">
      <option value="1">1Value</option>
      <option value="2">2Value</option>
      <option value="3">3Value</option>
      <option value="4">4Value</option>
    </select>

<input type="hidden" name ='hdn' id="hdn" />
<input type="submit" id='submit' />
<?php
echo "<p>".$Z."</p>";
?>
</form>
</body>

The echo call works for the last 3 options (2,3,4) but if I select the first one it doesnt output anything, and even if i change first one it still doesnt output anything. Can someone explain to me whats going on, I think it might be a syntax issue.

EDIT: As mentioned in first paragraph: I am using the hidden field instead of just using the value of selected because i plan on disabling the select drop down in my actual website, and when you disable the menu the POST data is no longer accessible. By putting it into a hidden field you can still access the information

The first one is the default, so when you "change" to the first one, it hasn't actually changed and the event does not fire.

You should be reading the value directly from the select and not depending on JS to set a hidden field though. The JS is just pointless, unreliable complexity.

Does anything else in your client-side application depend on that hidden field? If the ONLY purpose of the hidden field is to duplicate the selected value of the dropdown, then there's absolutely no reason to use an onchange handler.

Best solution would be to set an onsubmit handler on the form itself to copy the dropdown value into the hidden field.

<form ... onsubmit="document.getElementById('hdn').value = document.getElementById('whatever').value">

Try your post access like this:

<?php
if (array_key_exists('hdn', $_POST)) {
    $Z = $_POST['hdn'];
}
else {
    $Z = 1;
}
?>

change your input:

<input type="hidden" name='hdn' id="hdn" value= <?php echo "$Z"; ?> />

this.value has no value. That is why $_POST['hdn'] doesn't have a value when you initially load the form.

As @David said, if you use Firefox you can see the post data for hdn is empty/null.