如何将php变量传递给新页面以从数据库中删除行?

时间:2017-09-18 13:13:37

标签: php mysql sql post

在list.php页面上,我使用表单中的隐藏输入法传递一个变量。

此表单重定向到listd.php,其中变量用于运行SQL查询以从变量== name的数据库中删除特定行。 如果我在处理SQL查询之前在listd.php上打印变量,那么它是可见的,但是在处理查询时它会给出未识别的索引错误。

如果我在同一页面上从用户那里获取输入,listd.php中的代码就会起作用。

list.php的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> Sports </title>
 <link rel="stylesheet" href="main.css" type="text/css" />
 <link href="https://fonts.googleapis.com/css?family=Tangerine">
 <link href="https://fonts.googleapis.com/css?family=Dancing+Script|Great+Vibes|Roboto|Barrio" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
</head>

<body>


<?php
require ("config.php");
?>




<div class="row">
<div class="container-fluid">
<div class="jumbotron text-center">
<h3> List Events</h3>
<?php 
        session_start();



        if($_SESSION['username'])
            echo "<h2>Welcome ".$_SESSION['username']."!</h2>";
        else
                header('location:index.php');


      //session_start();
      if(isset($_SESSION['username']))
        echo "<h3><a href='logout.php'>Logout</a></h3>";
      ?>   


</div>
</div>
</div>

<div class="container">
  <h2>Hover Rows</h2>
  <p>The .table-hover class enables a hover state on table rows:</p>            
  <table class="table table-hover">
    <thead>
      <tr>
        <th>Event </th>
        <th>Add</th>
        <th>Edit</th>
        <th>Delete</th>
      </tr>
    </thead>
    <tbody>

     <!--
          <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      -->
     <?php



      {$result="SELECT name FROM events";
     $q = mysqli_query($conn,$result) or die(mysql_error());
         while ($row=mysqli_fetch_array($q))
     {  

         echo "<tr> <td>";
         echo $row['name'];
         echo "</td>";

         echo "<td>";
         echo '<a href="adde.php"><button> Add </button></a> <br><br>';
         echo "</td>";

         echo "<td>";
        echo '<form action="liste.php" method="post" >';
        echo '<input type="hidden" name="edit" value="';?>
    <?php echo $row['name']; 
    echo'"> <input type="submit" value="Edit">';
     echo "</form>";
        echo "</td>";


         echo "<td>";
         echo '<form action="listd.php" method="post" >';
        echo '<input type="hidden" name="del2" value="';?>
    <?php echo $row['name']; 
    echo'"> <input type="submit" value="Delete">';
         echo "</td>";

         echo "</form>";


     }


}

    ?>  

      <!--  
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>

      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>

      -->


    </tbody>
  </table>

</div>
</body>
</html>

listd.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> Sports </title>
 <link rel="stylesheet" href="main.css" type="text/css" />
 <link href="https://fonts.googleapis.com/css?family=Tangerine">
 <link href="https://fonts.googleapis.com/css?family=Dancing+Script|Great+Vibes|Roboto|Barrio" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
</head>

<body>


<?php
require ("config.php");
?>




<div class="row">
<div class="container-fluid">
<div class="jumbotron text-center">
<h3> Events </h3>


<div class="row">
<div class="container-fluid text-primary text-center">


<br>
<a href="adde.php"><button class="btn"> Add </button></a> <br><br>
<a href="edite.php"><button class="btn"> Edit </button></a> <br><br>
<a href="deleteev.php"><button class="btn"> Delete </button></a> <br><br>
<a href="viewe.php"><button class="btn"> View </button> </a><br><br>
</div>
</div>

<?php 
        session_start();    
?>
<form action="listd.php" method="post" class="a">
<table>
    <tr>
    <td> Category Name </td>
    <td>
    <strong>
    <?php echo $_POST["del2"]; 
    $k=$_POST['del2'];
    ?>
    </strong>
    </td>
    </tr>



    <tr>
    <td></td>
    <td> <input type="submit" value="Delete" name="delete"> </td>
    </tr>

</table>


</form>




<?php

$event=$k;

if(isset($_REQUEST['delete'] )&& $event )
{   
    $sql="DELETE FROM events WHERE name='$event'";

    if(mysqli_query($conn,$sql))
        {
        echo "deleted  Succesfully";
        //header('location:listd.php'); 
        }
    else
            echo "error";

}   

 ?>

</div>
</div>
</div>



</body>
</html>

1 个答案:

答案 0 :(得分:0)

除非这是一个非常危险的行为,否则没有必要使用两种形式来执行此操作。这也是你问题的根源。 $ k不会保留在第二个回发上。请求是无国籍的。当您提交第二个表单时,listd.php脚本将从头开始运行,并在上次运行时分配给变量的值。这通常是HTTP请求的正常行为。

单一形式的版本可能如下所示:

<强> list.php的

<?php 
//this needs to be before anything else otherwise the redirect might fail due to headers already sent.
session_start();
if(isset($_SESSION['username'])) //corrected to use isset(). Only one test for this is needed.
{
    echo "<h2>Welcome ".$_SESSION['username']."!</h2>";
    echo "<h3><a href='logout.php'>Logout</a></h3>";
}
else
{
    header('location:index.php');
    die(); //script needs to die because webcrawlers/bots will ignore the redirect header, and view the rest of the page anyway, without permission. Using die() means the rest of the page never gets output.
}
?>   
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> Sports </title>
<link rel="stylesheet" href="main.css" type="text/css" />
<link href="https://fonts.googleapis.com/css?family=Tangerine">
<link href="https://fonts.googleapis.com/css?family=Dancing+Script|Great+Vibes|Roboto|Barrio" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
</head>

<body>
<?php
require ("config.php");
?>
<div class="row">
<div class="container-fluid">
<div class="jumbotron text-center">
<h3> List Events</h3>
</div>
</div>
</div>

<?php 
$message = null; //will hold any extra message to the user resulting from data processing actions (such as delete)

//only run the next section if del2 has been submitted from a postback.
if(isset($_POST['del2']))
{
  $event = $_POST['del2'];
  $sql= "DELETE FROM events WHERE name='$event'"; //here you should use parameterised queries, I will leave it to you to look this up online, using the link I gave in the comments.

  if(mysqli_query($conn,$sql))
  {
    $message = "Deleted succesfully";
  }
  else
  {
    $message = "error";
    //here you should check mysqli_error() and log the output somewhere (not visible to the user)
  }
}  
?>

<div class="container">
  <h2>Hover Rows</h2>
  <!-- here is an example of how you can inject the confirmation message into somewhere suitable in the page. You can modify this to suit your needs. -->
  <?php if ($message != null) { echo "<p><b>".$message."</b></p>"; } ?>
  <p>The .table-hover class enables a hover state on table rows:</p>            
  <table class="table table-hover">
    <thead>
      <tr>
        <th>Event </th>
        <th>Add</th>
        <th>Edit</th>
        <th>Delete</th>
      </tr>
    </thead>
    <tbody>

     <?php
     $result="SELECT name FROM events";
     $q = mysqli_query($conn,$result) or die(mysqli_error()); //corrected to use mysqli_error not mysql_error
     while ($row=mysqli_fetch_array($q))
     {  
        echo "<tr> <td>";
        echo $row['name'];
        echo "</td>";
        echo "<td>";
        echo '<a href="adde.php"><button> Add </button></a> <br><br>';
        echo "</td>";
        echo "<td>";
        echo '<form action="liste.php" method="post" >';
        echo '<input type="hidden" name="edit" value="';
        echo $row['name']; 
        echo'"> <input type="submit" value="Edit">';
        echo "</form>";
        echo "</td>";
        echo "<td>";
        echo '<form action="list.php" method="post" >';
        echo '<input type="hidden" name="del2" value="';
        echo $row['name']; 
        echo'"> <input type="submit" value="Delete" onclick="return confirm("Are you sure?");>'; //adds a confirmation dialog box to the delete button
        echo "</td>";
        echo "</form>";
     }
?>  
</tbody>
</table>
</div>
</body>
</html>

您根本不需要 listd.php

P.S。一个单独的提示:我看到您正在将相同的HTML <head>等材料复制到每个页面脚本中。这不是必需的。您可以创建两个文件,例如header.phpfooter.php。在header.php中,您可以将开头<html><head>标记向下放到<body>以及所有网页的一致布局所需的任何其他封闭标记。然后在footer.php中,您可以放置​​等效的结束标记。然后在您网站的所有其他页面中,您只需将<?php require_once("header.php"); ?>作为第一行,<?php require_once("footer.php"); ?>作为最后一行。然后,您需要对标题进行的任何更改(例如,新的CSS文件或其他内容)会自动应用于所有页面,而不会进行繁琐的复制/粘贴操作。虽然我建议您在此处删除第二个脚本,但您可以对站点中的任何其他页面执行此操作。这也是代码重用的一般原则,您可以将其应用于未来代码中的各种情况。

P.P.S。我还考虑使用最新的doctype。 HTML5 doctype声明只是<!DOCTYPE html>。这可能会导致页面中HTML和CSS的行为更加一致,并且可以使您的应用程序面向未来,而不会弃用不再使用的旧文档类型。