2014-02-27 39 views
2

我对PHP和MySQL都很陌生,对于我当前的技术诀窍,我有一个相当复杂的任务。它是这样的:如何从PHP数组插入多个MySQL表行

我想创建一个数据驱动的网站,手工制作的CMS将允许没有网页设计/网页开发知识的用户来管理它。当我试图创建查询来处理插入数据库的数据时,我遇到了困难。这是一家书店,我正在数据库中插入书籍。我想创建3张桌子,一张存放自己的书本,一张存放这些书籍所属的类别(文学,神秘,幻想等),由于这两张桌子之间的关系是多对多的关系,我还创建了一个查找表来链接这两个,使用填充了2个外键的2列代表这两个表的ID。

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

我曾经见过有人认为这会破坏价值观,但那会在一行中存储多个值,还是我误会了?因为这不是我想要的,我想(如果用户选中了3个类别复选框)在查找表中创建3行。

预先感谢您的时间看到我的问题。

回答

0
$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); 
} 
+0

感谢您的回复,我想我明白了! – litzel

+0

事情是我不能只声明数组的类别,我需要通过HTML窗体,现在我使用循环像这样'echo(“".$tag_name。“
”);'把它们展示给用户。任何想法如何将他们变成一个数组? – litzel

+0

如果你在表单中有'name ='row_tag []'',你应该在PHP中得到一个数组,如'array(1,2,3)',这可以。做类似'var_export($ _ POST ['row_tag']);'看看你得到了什么,确切地说。 – cornelb

0

您可以使用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).")"; 

?> 

或者,如果你想使用现有的表,以获得IDS则是这样的: -

<?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).")"; 

?> 
+0

中正确地得到它们。谢谢你的回复,但是因为我是PHP新手,不会将多个值插入到一列中吗?这不是我需要的。如果选中3个复选框,则需要3行,如果选中5个,则需要5行。 – litzel

+0

不,因为您可以将分隔符和其他列放入implode的第一个参数中。因此第一个参数是“),($ category” – Kickstart

0

不,你不能插入多个表中的一个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'); 
+0

感谢您的回复,我不是试图用一个查询插入到多个表中,我试图在一个表中插入多个包含一个或多个查询的多行。 – litzel

+0

我编辑了我的回复。请检查它 – joe

0

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

比方说你有以下categorie的ID从复选框:array(21, 42, 64); 现在你可以构建这样的查询将它们插入到lookup表:

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

感谢您的回复,请试试看并通知您! – litzel

+0

似乎我没有得到它如何通过HTML表单分配ID类别...有这样的:'echo(“".tag_name。”
\ n“);'在while循环中显示它们HTML表单,它是否正确?如果是,我该如何将这些值转换为$ categories []数组? – litzel

0

非常基本的思路是迭代循环在提交的类别上,并在查找表中运行包含类别ID和书籍ID的插入查询。

$bookID= $_POST['bookid']; 
foreach ($categories as $category) { 

    mysql_query("INSERT INTO lookup(bookid,categoryid) values($bookID,$catetory)"); 
} 
+0

感谢您的回复,但是$ nppkID是什么?对于向其他人提出简单的事情,基金会表示抱歉,但我我真的很陌生... – litzel

+0

是错字!更新! – goseo

+0

不用担心!一切安好 – litzel