【问题标题】:INSERT, UPDATE, DELETE multiple Tags input using INNERJOIN使用 INNER JOIN 插入、更新、删除多个标签输入
【发布时间】:2017-03-25 16:01:03
【问题描述】:

从这样的形式

<?php
if(isset($_POST['submit'])){
 $tags = $_POST['tags'];
 ?>
<form method="post">
     <select name="tags" multiple>
          <option>PHP</option>
          <option>HTML</option>
          <option>CSS</option>
     </select>
<button type="submit" name="submit">
</form>

表格:

          [     POSTS     ]  [     TAGS   ]  [       POSTS_TAGS       ]
          | id |   title  |  | id |  name |  | id |  post_id |tage_id |
          |----|----------|  |----|-------|  |----|----------|--------|
          | 1  |   PHP7   |  | 1  | PHP   |  | 1  |     1    |    1   |
          | 2  |   HTML   |  | 2  | HTML  |  | 2  |     1    |    2   |
          | 3  |   CSS3   |  | 3  | CSS   |  | 3  |     1    |    3   |
          _________________  ______________  | 4  |     2    |    2   |
                                             | 5  |     2    |    3   |
                                             | 6  |     3    |    3   |
                                             __________________________

如何插入、更新、删除 POSTS_TAGS 表中的所有 options?我也许可以理解如何使用 implode 和 explode 插入它,但是更新和删除,无法弄清楚如何有效地做到这一点。

【问题讨论】:

  • 顺便说一句,您已经遇到了解析错误。
  • 您可能需要多个查询语句来插入、更新和删除您将使用连接选择的数据集。因此,如果您要创建新帖子,则需要在插入帖子标签之前为帖子执行插入操作,这样您就可以获得帖子条目的新 ID
  • @M31 那么我是否将两个insert 语句发送到insert 将帖子发送到POSTS 并将post_id 发送到POSTS_TAGS? 使用1 个查询插入两个表是好的还是2个查询更好?
  • 您可以创建一个包含两个插入语句的查询,并在第二个插入语句中使用类似 LAST_INSERT_ID() 的内容来获取帖子 ID 值。如果您可以确认您正在使用 php 处理表单数据和 MySQL 数据库,我可以写一个带有更具体建议的答案
  • @M31 我不完全使用 MySQL,但现在我使用 phpmyadmin,我不知道是否每个人在发布他们的网站以获得更好的数据库后迁移到 MySQL 是否是自然的。

标签: php mysql sql


【解决方案1】:

所以您提到您使用的是 phpMyAdmin,它是 MySQL 数据库的用户界面。如果您尝试使用表单操作该数据库中的记录,则需要将其提交到 php 脚本,该脚本将运行您正在查找的查询。我更新了您的表单以包含帖子标题并让操作将数据发送到 submit.php。您也可以通过其他方式提交表单,但对于本示例,我将坚持使用 HTML 默认值:

<form method="post" action="submit.php">
     <input type="text" name="title">
     <select name="tags" multiple>
          <option value="1">PHP</option>
          <option value="2">HTML</option>
          <option value="3">CSS</option>
     </select>
     <button type="submit" name="submit">
 </form>

在 submit.php 中,您将处理来自表单的数据并运行您的 sql 查询。

<?php
      //connect to mysql 
      $con = mysqli_connect("localhost","user","password","db_name");
      //collect data from form
      $tags = explode(",",$_POST['tags']);
      $title = mysqli_escape_string($_POST['title']);
      //create sql statements
      $sql = "INSERT INTO Posts (title) VALUES ('$title'); SET @pid = LAST_INSERT_ID();";
      // add insert statement for each selected tag
      foreach($tags as $tag){
            $sql .= "INSERT INTO Posts_Tags (post_id,tag_id) VALUES(@pid,".mysqli_escape_string($tag).");";
      }
      // Run the complete query
      $result = mysqli_multi_query($con,$sql);
      if($result){
           //success
      }else{
           //error
      }
 ?>

此代码旨在使用两个或多个插入语句创建和执行查询,这些语句将添加新帖子并关联正确的标签。您可以使用 phpMyAdmin 测试 sql,如下所示:

INSERT INTO Posts (title) VALUES ('Post Title');
SET @pid = LAST_INSERT_ID();
INSERT INTO Posts_Tags (post_id,tag_id) VALUES(@pid,1);
INSERT INTO Posts_Tags (post_id,tag_id) VALUES(@pid,2);

您可以执行类似于处理更新和删除的操作,但是在更新查询的情况下,将需要一些额外的逻辑来测试 Posts_Tags 中的记录,因为关联已被删除,这些记录需要被删除。删除将非常简单:

DELETE FROM Posts WHERE id = 1; DELETE FROM Posts_Tags WHERE post_id = 1;

您只需要从删除表单提交帖子 ID 即可创建查询。我希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多