【问题标题】:How to insert multiple MySQL table rows from a PHP array如何从 PHP 数组中插入多个 MySQL 表行
【发布时间】:2014-02-27 09:36:18
【问题描述】:

我是 PHP 和 MySQL 的新手,对于我目前的专业知识,我有一项相当复杂的任务要做。它是这样的:

我正在尝试使用手工制作的 CMS 创建一个数据驱动的网站,该网站将允许不了解网页设计/网页开发的用户进行管理。当我尝试创建一个查询来处理插入数据库的数据时,我遇到了困难。这是一家书店,我在数据库中插入书籍。我想创建 3 个表,一个用于存储书籍本身,一个用于存储这些书籍所属的类别(例如文学、神秘、幻想等),并且由于这两个表之间的关系是多对多的关系,我还创建了一个查找表来链接这两者,使用 2 个填充有 2 个外键的列来表示两个表的 ID。

问题是我找不到如何在一列和不同的第二列(类别 ID)上插入具有相同 ID(书籍 ID)的多行。类别将通过复选框以 HTML 形式选取。我在这里的几篇文章中看到我需要在 PHP 脚本中创建一个数组来存储用户选择的复选框中的数据,但是我完全不知道如何构造将这些复选框变成多个 MySQL 表行的查询.

我看到有人建议将值内爆,但这会将多个值存储在一行中,还是我弄错了?因为这不是我想要的,所以我想要(如果用户选中 3 个类别复选框)在查找表中创建 3 行。

提前感谢您抽出宝贵时间查看我的问题。

【问题讨论】:

    标签: php mysql sql database


    【解决方案1】:
    $categories = array(1,2,3,4);
    $bookId = 5;
    
    foreach ($categories as $categoryId) {
    
        $data = array(
            'book_id' => (int)$bookId,
            'category_id' => (int)$categoryId
        );
    
        $query = "INSERT INTO `lookup` SET ";
        $fields = array();
        foreach ($data as $field => $value) {
            $fields[] = "`$field` = '$value'";
        }
        $fields = implode(', ', $fields);
        $query .= $fields;
    
        mysql_query($query);
    }
    

    【讨论】:

    • 感谢您的回复,我想我明白了!
    • 问题是我不能只声明类别的数组,我需要通过 HTML 表单获取它,现在我正在使用像这样的循环 echo("<input type='checkbox' name='row_tag[]' value='$tag_id' />".$tag_name."<br />"); 向用户展示它们.任何想法如何将它们变成一个数组?
    • 如果表单中有name='row_tag[]',你应该在PHP中得到一个数组,比如array(1, 2, 3),这样就可以了。执行var_export($_POST['row_tag']); 之类的操作,看看你得到了什么。
    • 看来我得到了 NULL 值和 row_tag 的未识别索引。我试图在 while 循环中回显它,该循环在复选框之后将类别复选框呈现给 HTML 表单。我应该在其他地方呼应它,还是做其他事情?
    • 表格看起来好吗?如果您在表单上查看源代码,您能正确看到这些值吗?此外,如果您不选择任何复选框,则 $row_tag 变量将为空
    【解决方案2】:

    您可以使用 implode 构建插入以插入多行。像这样的东西:-

    <?php
    
    $Category = 123;
    
    $Books = array(1,2,3,4,5,6,7,8,9,10);
    
    $sql = "INSERT INTO book_category_link(NULL, category_id, book_id)
            VALUES ($Category".implode("),($category", $Books).")";
    
    ?>
    

    或者,如果您想使用现有的表来获取 id,那么可以这样:-

    <?php
    
    $Category = (123, 456, 789);
    
    $Books = array(1,2,3,4,5,6,7,8,9,10);
    
    $sql = "INSERT INTO book_category_link(NULL, category_id, book_id)
            SELECT NULL, categories.id, books.id
            FROM books
            CROSS JOIN categories
            WHERE books.id IN (".implode(",", $Books).")
            AND categories.id IN (".implode(",", $Category).")";
    
    ?>
    

    【讨论】:

    • 感谢您的回复,但由于我是 PHP 新手,不会将多个值插入一列吗?那不是我需要的。如果选中 3 个复选框,我需要 3 行,如果选中 5 个,则需要 5 行等。
    • 不,因为您可以将分隔符和其他列放在 implode 的第一个参数中。因此第一个参数是 "),($category"
    【解决方案3】:

    这真的很简单。首先将书插入books 表,然后插入get the ID of it。假设这个例子的 ID 是 5

    假设您在复选框中有以下类别 ID:array(21, 42, 64); 现在您可以构造这样的查询将它们插入到lookup 表中:

    INSERT INTO `lookup` (book_id, category_id') VALUES (5, 21), (5, 42), (5, 64);
    

    【讨论】:

    • 感谢您的回复,会试用并通知您!
    • 看来我不明白如何从 HTML 表单中分配类别 ID...我有这个:echo("&lt;input type='checkbox' name='row_tag[]' value='$tag_id' /&gt;".$tag_name."&lt;br /&gt;\n");在一个 while 循环中以在 HTML 表单中显示它们,这是对的吗?如果是,我如何将这些值转换为 $categories[] 数组?
    【解决方案4】:

    不,您不能在一个 MySQL 命令中插入多个表。但是,您可以使用事务。

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    

    如果你想添加多行插入,那么你可以使用语法

    INSERT INTO  table (col1, col2) VALUES ('value', 'value'), (value, 'value');
    

    【讨论】:

    • 感谢您的回复,我不是想用一个查询插入多个表,我想用一个查询插入多行,或者,如果需要,多个查询。
    【解决方案5】:

    最基本的想法是在提交的类别上迭代一个循环,然后将包含类别 ID 和图书 ID 的插入查询运行到查找表中。

    $bookID= $_POST['bookid'];
    foreach ($categories as $category) {
    
        mysql_query("INSERT INTO lookup(bookid,categoryid) values($bookID,$catetory)");
    }
    

    【讨论】:

    • 感谢您的回复,$nppkID 是什么?很抱歉问一些简单的事情,对其他人来说是基础,但我对此真的很陌生......
    猜你喜欢
    • 2013-09-10
    • 2016-10-19
    • 1970-01-01
    • 2020-02-07
    • 2014-04-29
    • 1970-01-01
    • 2017-07-03
    • 2018-02-01
    • 2014-12-08
    相关资源
    最近更新 更多