MySQL通过PHP动态删除表内容来自动增加+自动调整ID?

时间:2019-01-15 15:21:01

标签: php mysql increment id

我当前正在尝试构建一个“ ToDo-App”,该文本可让我INSERT文本进入数据库,然后将其显示出来。有一个“功能”可根据其ID删除内容。

如果我在应用程序中输入了两个任务,则会得到两个ID 1和2的表记录。删除记录1时,ID为2的记录仍然存在。因此,带有ID 2的记录被列为待办事项列表中的第一项。

我必须在“删除输入字段”中输入“ 2”才能从列表中删除第一项!我如何才能使其保持同步? ID字段是否适合维护任务的逻辑/应用程序级别顺序?

<!doctype HTML>
<html>

<head>
    <meta charset="utf-8">
    <title>ToDo-APP</title>
    <link rel="stylesheet" href="css/Lil-Helper.css">
    <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
    <link rel="stylesheet" href="css/webfonts/all.css">
    <link rel="stylesheet" href="css/own.css">

</head>


<?php
    $con = mysqli_connect("","root","","todo");
    $sql = "SELECT text FROM work";
    $res = mysqli_query($con, $sql);


    if(isset($_POST["text"]))
    {
        $eingabe = $_POST["text"];
        $query = "INSERT INTO work(text) VALUES('$eingabe')";
        mysqli_query($con, $query);
        header("Refresh:0");
    }
    else
    {
        echo "";
    }



    if(isset($_POST["del"]))
    {
        $del = $_POST["del"];
        $res = mysqli_query($con, $sql);
        $sql2 = "DELETE FROM `work` WHERE `work`.`id` = $del";
        mysqli_query($con, $sql2);
        header("Refresh:0");
    }
    else 
    {
        echo "";
    }

?>
<body>
    <header class="lil-menu lil-flex lil-flex-center align-center">
        <a href="index.html" class="lil-brand">
            <h3>To-Do</h3>
        </a>
        <a class="lil-menu-item currentLink" href="index.html">ToDo</a>
        <a class="lil-menu-item" href="#archive">Archiv</a>
        <a class="lil-menu-item" href="#Sprachen">Sprachen</a>
    </header>

    <div class="main">
        <div class="lil-box">
            <h3 class="lil-font-rot lil-big-font lil-space lil-font-style" style="font-size: 4rem;">ToDo</h3>
              <div class="lil-box">
            <form action="index.php" method="post">
                <input  class="lil-input" name="text" type="text">
                <input type="submit" class="lil-button-green" value="Hinzufügen">

            </form>

                <ol id="liste" class="lil-list">
                    <?php
                    while($dsatz = mysqli_fetch_assoc($res))
                    {
                        echo "<li>" .$dsatz["text"] ."</li>";
                    }
                    ?>
                </ol>
            <form id="form" action="index.php" method="post">
                <input  class="lil-input" name="del" type="text">
                <input type="submit" class="lil-button-red lil-button-small" value="   Löschen   ">
            </form>
            </div>       
        </div>
    </div>

<script src="js/jquery-3.3.1.min.js"></script>

<script>

    var anzahl = $("#liste li").length; 
    if(anzahl < 1)
    {
        $("#form").hide();
    }
    else
    {
        $("form").show();
    }

    </script>
</body>

</html>

图片:

HTML输出 HTML Output MySQL仪表板 MySQL Dashboard

2 个答案:

答案 0 :(得分:0)

如评论中所述,您可以具有多个复选框,这些复选框形成一个数组参数:具有显式键的<input name="theName[1]">和具有隐式键的name="theName[]"

此外,您应该使用准备好的语句来防止SQL注入攻击。想象一下,攻击者发送了一个在字段中带有单引号'的请求,即,他终止了SQL字符串定界符,并添加了任意SQL代码。准备好的语句使用占位符,并且参数是单独发送的。

您还应该处理错误。在下面的代码中,错误以HTML格式输出,但是,您应该定义自己的记录器功能,而不仅仅是在流中echo。这样可以在开发服务器上输出HTML,但可以记录到生产服务器上的磁盘。

这是一个在MariaDB 10上的PHP7.3上测试的工作示例:

<!DOCTYPE HTML>
<html lang="de">

<head>
  <meta charset="utf-8">
  <title>ToDo-APP</title>
  <link rel="stylesheet" href="css/Lil-Helper.css">
  <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
  <link rel="stylesheet" href="css/webfonts/all.css">
  <link rel="stylesheet" href="css/own.css">
  <style>
    #frm-tasks button
    {
      padding: 0 18px;
    }
  </style>
</head>

<body>

<?php
  mysqli_report(MYSQLI_REPORT_STRICT);
  try
  {
    $con = new mysqli('localhost', 'testuser', 'testpasswd', 'testdb');

    $action = $_POST['action'] ?? 'list';

    if(!empty($_POST["text"]))
    {
      $eingabe = $_POST["text"];
      try
      {
        $stmt = $con->prepare('INSERT INTO work(text) VALUES(?)');
        $stmt->bind_param('s', $_POST["text"]);
        $stmt->execute();
      }
      catch (mysqli_sql_exception $e)
      {
        $msg = $e->getMessage();
        echo "<div>Error processing statement: $msg;</div>";
      }
    }


    if('del' === $action && isset($_POST['rows']) && is_array($_POST['rows']))
    {
      try{
        $stmt = $con->prepare('DELETE FROM `work` WHERE `work`.`id` = ?');
        $stmt->bind_param('i', $row);

        foreach ($_POST['rows'] as $row)
        {
          $stmt->execute();
          if($e = $stmt->error)
            echo "<div>DB Error: $e</div>";

        }
      }
      catch (mysqli_sql_exception $e)
      {
        $msg = $e->getMessage();
        echo "<div>Error processing statement: $msg;</div>";
      }
    }

?>
  <header class="lil-menu lil-flex lil-flex-center align-center">
    <a href="index.html" class="lil-brand">
      <h3>To-Do</h3>
    </a>
    <a class="lil-menu-item currentLink" href="index.html">ToDo</a>
    <a class="lil-menu-item" href="#archive">Archiv</a>
    <a class="lil-menu-item" href="#Sprachen">Sprachen</a>
  </header>

  <div class="main">
    <div class="lil-box">
      <h3 class="lil-font-rot lil-big-font lil-space lil-font-style" style="font-size: 4rem;">ToDo</h3>
      <div class="lil-box">
        <!--form action="index.php" method="post"-->
        <form id="frm-tasks" action="" method="post">
          <input  class="lil-input" name="text" type="text">
          <button type="submit" class="lil-button-green" name="action" value="add">Hinzufügen</button>
<?php
    try
    {
      $res = $con->query('SELECT id, text FROM work');
      if(0 < $res->num_rows)
      {
?>
          <table>
            <thead>
              <tr>
                <th></th><th>ID</th> <th>Aufgabe</th>
              </tr>
            </thead>
            <tbody>
<?php
        while($dsatz = mysqli_fetch_object($res))
        {
?>
              <tr>
                <td><input type="checkbox" name="rows[]" value="<?php echo $dsatz->id;?>"></td><td><?php echo $dsatz->id;?></td> <td><?php echo $dsatz->text;?></td>
              </tr>
<?php
        }
?>
            </tbody>
          </table>

          <button type="submit" class="lil-button-red lil-button-small" name="action" value="del">Löschen</button>
<?php
      }
    }
    catch (mysqli_sql_exception $e)
    {
      $msg = $e->getMessage();
      echo "<div>Error processing statement: $e->msg;</div>";
    }
?>
        </form>
      </div>
    </div>
  </div>

  <!-- not needed atm  script src="js/jquery-3.3.1.min.js"></script-->

  <h2>POST</h2>
<?php
    var_dump($_POST);
  }
  catch (mysqli_sql_exception $e)
  {
    $msg = $e->getMessage();
    echo "<div>Error connecting DB: $msg;</div>";
  }
?>
</body>

</html>

答案 1 :(得分:-1)

列表的键是数据库中的“ th”,因此只需确定限制

替换

if(isset($_POST["del"]))
    {
        $del = $_POST["del"];
        $res = mysqli_query($con, $sql);
        $sql2 = "DELETE FROM `work` WHERE `work`.`id` = $del";
        mysqli_query($con, $sql2);
        header("Refresh:0");
    }

使用

if(isset($_POST["del"]))
    {
        $del = $_POST["del"];
        $res = mysqli_query($con, $sql);
        $sql2 = "DELETE FROM `work` LIMIT 1 OFFSET ".array_search($del, mysqli_fetch_assoc($res));
        mysqli_query($con, $sql2);
        header("Refresh:0");
    }