$_POST的未定义索引(新手问题!)

5

可能重复:
PHP:“Notice: Undefined variable”和“Notice: Undefined index”

我正在学习PHP,但一直收到“未定义索引”错误。我正在学习的书籍有一个HTML表单和一个处理表单的PHP页面,使用以下格式:

<!-- The form fields are all set up something like this -->
<input type="text" id="howlong" name="howlong" /><br />

// The PHP starts with one line like this for each of the form fields in the HTML
$how_long = $_POST ['howlong'];

// And there is one line for each one like this to output the form data: 
echo ' and were gone for ' . $how_long . '<br />';

我正在处理的示例包含约12个表单字段。
奇怪的是,并非所有变量都会引发此错误,但我无法看出其中的模式。
我已检查所有HTML字段名称是否与我输入的PHP $_POST变量名称相匹配,并确保在填写表单并提交后,所有字段都填入了某些内容。有趣的是,可以从书籍下载的完整代码也会引发此错误。
我意识到这段代码可能不符合最佳实践,它来自该书的第一章,而我显然是个新手 :)
如果有所区别的话,我正在使用安装有Windows 7 Home Premium的XAMPP 1.7.4上的PHP 5.3.5。
3个回答

6

请记得在表单标签中设置方法为POST...

以下是我用来测试的代码,对我有效:

在名为test.php的文件中:

<html>
  <body>
    <form method="POST" action="testProc.php">
      <input type="text" id="howlong" name="howlong" /><br/>
      <input type="submit" value="submit"/>
    </form>
  </body>
</html>

在testProc.php文件中:

<?php
if (isset($_POST)) {
  if (isset($_POST["howlong"])){
    $howlong = $_POST['howlong'];
    echo ' and were gone for ' . $howlong . '<br />';
  }
}
?>

作为建议,为了使用样式表进行显示操作,我建议将表单放在一个表格中,就像这样:

<html>
  <body>
    <form method="POST" action="testProc.php">
      <table>
        <tbody>
          <tr>
            <th>
              <label for="howlong">How long? :</label>
            </th>
            <td>
              <input type="text" id="howlong" name="howlong" />
            </td>
          </tr>
          <tr>
            <input type="submit" value="submit"/>
          </tr>
        </tbody>
      </table>
    </form>
  </body>
</html>

Hope you can use this...


如何最好地使用isset()来处理一打表单字段? - red4d
呃,我在那里犯了一个简单的语法错误……在不该使用美元符号的地方使用了$_POST['$howlong']。如果我没有运行你建议的isset,我可能仍然会困惑。现在可以工作了!谢谢! - red4d
这经常发生...我个人讨厌在变量前加美元符号。关于你的第一个评论,我想到的是创建一个包含要测试的键的数组(我们称之为a = {"name", "passwd", "email", ... };),并且通过for循环迭代数组,并调用类似于isset($_POST[$a[i]])的语句,一次性测试每个键。虽然我从未这样做过,我总是逐个测试每个键。但是,我认为你应该尽可能使你的表单简短以获得“用户友好”的效果 嘿嘿 - Throoze
是的,我使用NetBeans,并有一个代码模板,以使从$ _POST插入这些变量的过程更快...只是由于某种原因,我在表单字段名称所在的模板中添加了一个$符号,因此NetBeans执行了我的要求并添加了它 :) 我最终也逐个检查了这些字段,似乎更少麻烦。感谢您的帮助。 - red4d

2

你需要检查表单是否已提交,然后才能尝试使用 $_POST 数组,因此你应该将以下代码放在上面:

if(isset($_POST['send'])) {

其中,“send” 是提交按钮的名称。


1
您可以使用isset()函数测试变量是否已设置。
此外,并不是所有的HTML表单元素在所有情况下都会发布值。常见的例子是复选框;未选中的复选框不会成为发送回服务器的数据的一部分。因此,您期望设置的 $_POST 元素将不会被设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接