在localhost上运行PHP页面显示“未定义索引”,但代码运行完美

时间:2014-01-04 20:41:28

标签: php notice

这是我的PHP代码,我想问题出在$_POST[...]

PHP:

<?php
require('connect.php');
$name = $_POST['name'];
$comment = $_POST['comment'];
$submit = $_POST['submit'];
if($submit)
{
    if($name&&$comment)
    {
    $query=mysql_query("INSERT INTO comment (id,name,comment) VALUES ('','$name','$comment')");
    header("Location: success.php");
    }
    else
    {
        echo "Lūdzu aizpildi visus logus.";
    }
}
?>

字段和textarea的形式。

HTML:

<form action="help-add-comment.php" method="POST">
  <label>Jūsu vārds:  </label><br /><input type="text" name="name" size="25" value="<?php echo "$name" ?>" /><br /><br />
  <label>Ziņojums:  </label><br /><textarea name="comment" cols="25" rows="7"></textarea><br /><br />
  <input type="submit" class="button button-red" name="submit" value="Pievienot" /><br/>
</form>

这是我的结果: undefined index

3 个答案:

答案 0 :(得分:3)

检查你的值是否先被定义,它是否有效,因为这不是一个错误,它只是一个警告。

这样做:

<?php
if (!empty($_POST["name"]) && !empty($_POST["comment"]) && isset($_POST["submit"])) {
    require('connect.php');
    //Get Post value
    $name = $_POST['name'];
    $comment = $_POST['comment'];
    $submit = $_POST['submit'];
    //Execute query
    $query=mysql_query("INSERT INTO comment (id,name,comment) VALUES ('','$name','$comment')");
    header("Location: success.php");
}else{
    //one of the value is not set (undefined)
    echo "Ludzu aizpildi visus logus.";
}
?>

详细了解ifif/elseisset()empty()


PS:

您的代码容易受到SQL注入攻击,而且mysql is now deprecated也是如此。 You should use mysqli extensions or PDO. 这很严重,因为你很容易被黑客入侵。

答案 1 :(得分:2)

您正在尝试访问$_POST数组中不存在的字段,警告是正确的。您应该只在实际存在时处理这些字段,因此当您实际响应表单回发时,通过检查请求方法:

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
  $name = $_POST['name'];
  $comment = $_POST['comment'];
  $submit = $_POST['submit'];
  // Handle rest of postback
}

请注意,这仍然允许恶意用户触发警告,从而通过伪造请求获取应用程序内部的知识。您可以通过安全地检索POST值来解决此问题:

function getPostValue($name, $default = null)
{
  return isset($_POST[$name]) ? $_POST[$name] : $default;
}
$name = getPostValue('name');

使用错误抑制运算符(@)可以达到相同的效果,但它对性能有害,对于像这样的简单情况,它被认为是不好的样式。

答案 2 :(得分:0)

尝试:

  <?php
    require('connect.php');
    $name = isset($_POST['name']) ? $_POST['name']: '' ;
    $comment = isset($_POST['comment']) ? $_POST['comment'] : '' ;;
    $submit = isset($_POST['submit']) ? $_POST['submit'] : '' ;;
    if($submit)
    {
        if($name&&$comment)
        {
        $query=mysql_query("INSERT INTO comment (id,name,comment) VALUES ('','$name','$comment')");
        header("Location: success.php");
        }
        else
        {
            echo "Lūdzu aizpildi visus logus.";
        }
    }
    ?>
相关问题