【问题标题】:PHP Self-referencing scriptPHP 自引用脚本
【发布时间】:2015-02-28 23:08:39
【问题描述】:

我正在尝试使用以下代码在 HTML 表单中嵌入一个自引用 PHP 脚本:

未定义的索引:conv

<form action = "<?php $_SERVER['PHP_SELF'] ?>" method = "post">
    <input type = "number" id = "temp2" name = "temperature2" placeholder = "28">
    <label for = "temp2"> degrees </label>

    <select>
        <option name = "conv" value = "f"> Fahrenheit </option> 
        <option name = "conv" value = "c"> Celsius </option>
    </select>   

    <input type = "submit" value = "equals">

    <?php
        $type = $_POST["conv"];
        $tmp = $_POST["temperature2"];
        if ($type == "f") {
            $newTmp = (9/5 * $tmp) + 32;
            echo $newTmp . " degrees Celsius.";
        }
        elseif ($type == "c") {
            $newTmp = (5 * ($tmp - 32)) / 9;
            echo $newTmp . " degrees Fahrenheit."; 
        }
    ?>

</form>

我收到以下消息:

注意:未定义的索引:conv 注意:未定义索引:温度2

当 PHP 脚本位于另一个文件中时,一切正常。 有谁知道我做错了什么?

【问题讨论】:

标签: php forms self-reference


【解决方案1】:

您必须确认您已发送页面并且 $_POST 存在。并更正选择元素

<form action = "<?php $_SERVER['PHP_SELF'] ?>" method = "post">
    <input type = "number" id = "temp2" name = "temperature2" placeholder = "28">
    <label for = "temp2"> degrees </label>

<select name = "conv">
    <option  value = "f"> Fahrenheit </option> 
    <option  value = "c"> Celsius </option>
</select>   

    <input type = "submit" value = "equals">

    <?php

        if(isset($_POST["temperature2"])) {        

        $type = $_POST["conv"];
        $tmp = $_POST["temperature2"];
        if ($type == "f") {
            $newTmp = (9/5 * $tmp) + 32;
            echo $newTmp . " degrees Celsius.";
        }
        elseif ($type == "c") {
            $newTmp = (5 * ($tmp - 32)) / 9;
            echo $newTmp . " degrees Fahrenheit."; 
        }
}
    ?>

</form>

【讨论】:

  • 这实际上并没有打印出任何东西,所以我猜它没有设置,虽然我不知道它是什么意思。
  • @puk789 您必须确认您发送了页面并且 $_POST 存在。
  • @puk789 如果你想使用 $_POST["conv"] 你必须先提交页面
  • 嗯,它在我的原始文件中不起作用,但我创建了一个全新的文件,它在那里工作正常。不知道问题是什么,因为我检查了原始文件中的所有变量并且没有重复。不过谢谢
  • 是的,我只是想知道为什么它在原始文件中不起作用...非常有趣
【解决方案2】:

在处理表单之前不会设置变量 ($type = $_POST["conv"];)。做

if (!empty($_POST["conv"])) {
$type = $_POST["conv"];
}

【讨论】:

  • 或者最好只在提交表单时处理的整个块周围检查if (!empty($_POST)) {
  • 我认为另一个错误是select 应该具有name 属性。
  • 我在“select”中包含了name属性。
  • 上面的代码在选项元素中有它。您的代码现在是否按预期工作?
【解决方案3】:

这是我的答案... 首先,最好验证它是否已提交??如果调用了提交按钮,则代码继续休息。否则你会得到错误。此外,在您单击提交按钮之前,不会显示结果和变量。

<form action = "<?php $_SERVER['PHP_SELF'] ?>" method = "post">
    <input type = "number" id = "temp2" name = "temperature2" placeholder = "28">
    <label for = "temp2"> degrees </label>

<select name = "conv">
    <option  value = "f"> Fahrenheit </option> 
    <option  value = "c"> Celsius </option>
</select>   

    <input type = "submit" name="submit" value = "equals">

    <?php

        if(isset($_POST["submit"])) {        

        $type = $_POST["conv"];
        $tmp = $_POST["temperature2"];
        if ($type == "f") {
            $newTmp = (9/5 * $tmp) + 32;
            echo $newTmp . " degrees Celsius.";
        }
        elseif ($type == "c") {
            $newTmp = (5 * ($tmp - 32)) / 9;
            echo $newTmp . " degrees Fahrenheit."; 
        }
}
    ?>

</form>

【讨论】:

    【解决方案4】:

    您的 PHP 代码将在您加载页面时每次运行,而不仅仅是当有人按下提交时。这意味着它会在外面寻找$_POST['conv']$_POST['temperature2'],但由于表单尚未发布,因此什么也找不到。

    您需要命名您的提交按钮,然后用 if 包围您的所有 PHP 处理,如下所示:

    <input type = "submit" name="mysubmit" value = "equals">
    
    <?php
    if (@$_POST['mysubmit']) {
        $type = $_POST["conv"];
        $tmp = $_POST["temperature2"];
        if ($type == "f") {
            $newTmp = (9/5 * $tmp) + 32;
            echo $newTmp . " degrees Celsius.";
        }
        elseif ($type == "c") {
            $newTmp = (5 * ($tmp - 32)) / 9;
            echo $newTmp . " degrees Fahrenheit."; 
        }
    }
    ?>
    

    现在它只会在有人实际提交内容时查看该 PHP 代码。将 @ 放在 @$_POST['mysubmit'] 之前,这样您就不会遇到与之前在这个新数组键上遇到的相同的错误。

    【讨论】:

    • 不要使用@。这会抑制错误并可能在将来隐藏错误。已经为此构建了一些功能,例如空和 isset。
    • 我正在尝试考虑一个来自 $_POST['mysubmit'] 的错误,在这种情况下我不想抑制它......?
    • 当您可以正确解决/处理错误时,为什么还要抑制它?
    • 正确处理它,在这种情况下,正在抑制它。您是否有任何理论示例说明这种抑制何时可以抑制我不想想要抑制的错误?在我的书中,每当你看到 @ 时反射性地投票是很糟糕的形式。考虑一下,首先考虑它是否适当地使用了语言的特性。 @可以被滥用和滥用吗?绝对地!但是它有没有位置,可以适当使用吗?绝对的。
    • 抑制错误/通知如何正确?比发现问题更快?当然。正确的?不。看看我的历史,我曾经投过一次票,在这里。我们也可以把它留给这里接受的答案来解决这场辩论......
    猜你喜欢
    • 2010-10-25
    • 2012-06-26
    • 2015-06-08
    • 2016-12-02
    • 2012-01-24
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多