首页 > 解决方案 > 通过PHP动态删除表格内容的mySQL自动增量+自动调整id?

问题描述

我目前正在尝试构建一个“ToDo-App”,它可以让我INSERT将文本输入数据库,然后将其显示。有一个“功能”可以根据他们的ID.

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

我必须在“删除输入字段”中输入“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 输出 MySQL 仪表板HTML 输出 MySQL仪表板

标签: phpmysqlincrement

解决方案


正如评论中所讨论的,您可以有多个复选框形成一个数组参数:<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>

推荐阅读