尝试从链接返回值时未定义索引错误?

时间:2015-05-30 05:04:25

标签: php

我知道它是重复的,但我在尝试获取从链接传递的数据时遇到此错误。我不知道如何解决它。

这是我的代码:

add_package.php

 echo "<td><a href='delete.php?name3=" .  $row['package_type']."&id3=".$row['p_id']."'>Delete</a></td>";
 echo "<td><a href='edit_package.php?name3=" . $row['package_type']."&id3=".$row['p_id']."'>Update</a></td>";

这里删除链接工作正常,但是当我点击更新时,它会转到edit_package页面,我收到一个未定义的错误..

edit_package.php的代码:

<?php
 include('db.php');
 $id4 = $_GET['id3'];//update the page
 $name4 = $_GET['name3'];//helps to update the package 
 echo $id4;
 echo $name4;//getting values here correctly..
 if(isset($_POST['submit']) )
 {
   $package=$_POST['package'];
    if (ctype_alnum($package) && !empty($id4) && !empty($name4))
    {     
     $sql13="select package_type,id from tbl_package where package_type='".$package."'";
    $retvali=mysql_query($sql13,$conn);
    $num_rows1 = mysql_num_rows($retvali);
    if ($num_rows1 == 0 || $num_rows1=="")
    {   
      $sql = "Update tbl_package set package_type='".$package."' where package_type='".$name4."' and p_id='".$id4."'";
      $retval = mysql_query( $sql, $conn );
      ?><script>alert("Updated Successsfully");window.location ='http://localhost/demo/add_package.php';
      </script><?php
    }
    else
    {
      ?><script>alert("Already Exists");window.location ='http://localhost/demo/add_package.php';
      </script><?php
    }
}
  else
  {
  ?><script>alert("enter only letters and numbers")</script><?php
  }
 }
?>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<form id="form-validation" action="edit_package.php" method="post" class="form-horizontal" enctype="multipart/form-data" novalidate="novalidate">
<div class="col-md-6">
<div class="block" style="height:500px;">
<div class="block-title">
<h2><strong>State the Package For Tour</strong></h2>
</div>
<fieldset>
  <div class="form-group">
   <label class="col-md-4 control-label" for="val_username">Update Package <span class="text-danger">*</span></label>
  <div class="col-md-6">
  <div class="input-group">
  <input type="text" id="package" name="package" class="form-control" required >
  <span class="input-group-addon"><i class="fa fa-user"></i></span>
  </div>
 </div>
</div>

 <div class="form-group form-actions">
  <div class="col-md-8 col-md-offset-4">
   <input type="submit" class="btn btn-info btn-primary " value="Update" name="submit">
  </div>
 </div>
 </fieldset>
</form>

当我按下更新按钮时,我得到一个未定义的错误,我不知道为什么?..提前谢谢 我正在为其附加图片。enter image description here

From this link the data has to be passed to the edit_package file...I'm getting those two values but when i click the update button its getting an error

1 个答案:

答案 0 :(得分:3)

尝试更改<form>的操作网址以包含您的GET变量:

<form id="form-validation" action="edit_package.php?id3=<?php echo $_GET['id3']; ?>&name3=<?php echo $_GET['name3']; ?>" method="post" class="form-horizontal" enctype="multipart/form-data" novalidate="novalidate">

请注意:非常不安全!在使用之前,您需要清理所有用户输入。我上面的例子,不尊重安全性,只是为了证明我的观点。 GET和POST数据是用户变量。恶意用户可能会在URL中放入错误的代码(即?name3=<badcode>),并且它会打印在页面上,以及源代码中,它们很容易弹出。此外,在SQL查询中,您需要转义数据或使用预准备语句。

您不应该使用mysql函数,切换到MySQLi或PDO。 MySQL已经被杀了一段时间了..

这些只是要求你被黑客入侵:

$sql13="select package_type,id from tbl_package where package_type='".$package."'";

和..

$sql = "Update tbl_package set package_type='".$package."' where package_type='".$name4."' and p_id='".$id4."'";

您很容易受到SQL注入攻击,很容易让恶意攻击者在您的数据库中添加/编辑/查看/删除数据。

问题是,您的SQL查询中有$package(来自POST的原始数据)和$id4以及$name4(来自GET的原始数据)。

你会对它们使用mysql_real_escape_string(),但无论如何你应该使用mysqliPDO ......

示例:

$name4 = mysql_real_escape_string($_GET['name3']);

令人困惑,我不知道GET变量叫做name3,但你为它赋予了变量$name4..随后出现的任何人(甚至你)都会在你的代码中丢失

更新

试试这段代码。我在您的PHP代码中交换了您的GET POST,并将您的URL中的GET变量作为表单中的隐藏字段传递。

<?php
include('db.php');

if(isset($_POST['submit']) )
{
    $package = mysql_real_escape_string($_POST['package']);
    $id4 = mysql_real_escape_string($_POST['id3']);         // why is variable named id4 but its id3??
    $name4 = mysql_real_escape_string($_POST['name3']);     // why is variable $name4 but its name3??

    if (ctype_alnum($package) && !empty($id4) && !empty($name4))
    {     
        $sql13 = "SELECT package_type,id FROM tbl_package WHERE package_type='$package' LIMIT 1";
        $retvali = mysql_query($sql13, $conn);
        $num_rows1 = mysql_num_rows($retvali);

        if ($num_rows1 == 0 || $num_rows1=="")
        {   
            $sql = "Update tbl_package set package_type='$package' WHERE package_type = '$name4' AND p_id='$id4'";
            $retval = mysql_query( $sql, $conn );

            echo '<script>alert("Updated Successsfully");window.location = "http://localhost/demo/add_package.php";</script>';

        } else {

            echo '<script>alert("Already Exists"); window.location = "http://localhost/demo/add_package.php";</script>';
        }
    } else {
        echo '<script>alert("enter only letters and numbers");</script>';
    }
 }
?>


<form action="edit_package.php" method="post" enctype="multipart/form-data" novalidate="novalidate">

    <input type="hidden" name="id3" value="<?php echo htmlspecialchars($_GET['id3'], ENT_QUOTES | ENT_HTML5); ?>" />
    <input type="hidden" name="name3" value="<?php echo htmlspecialchars($_GET['name3'], ENT_QUOTES | ENT_HTML5); ?>" />

    Update Package: <input type="text" id="package" name="package" class="form-control" required >

    <input type="submit" class="btn btn-info btn-primary " value="Update" name="submit">

</form>

我从表单中删除了您的HTML格式。你有div标签没有匹配..我看不到你的整个代码,但看起来你有一堆混乱的div(即:没有关闭他们在哪里应该)。我还将mysql_real_escape_string()添加到传递的变量中,并将htmlspecialchars()添加到GET变量中,在表单的隐藏字段中回显。这是一个开始。

如果您编写的代码更清晰,您可能能够更好地理解代码并排除错误。不试图打击你:)正确的缩进,间距和格式化很长一段路。在这样的时候,它会使你的眼睛和自己更容易......

我离开了您的<script>代码,因为我认为您有理由想要弹出一个消息框..我只会使用header('Location: /path/to/where.php');并通过会话变量或其他内容传递您的错误消息,例如一系列错误,您可以获得,清除并在页面上显示错误。