2014-09-23 125 views
0

我在尝试用新条目更新菜肴表并将其交叉引用到现有的配料表中。对于添加的每道菜,用户都需要分配现有配料和多条生产线所需的体积。提交时,应将盘子输入“盘子”表格中,并将所分配的成分输入到“DishIng”链接表格中。从PHP插入多个MySQL的问题

我的表是这样设置:

Table: "Dishes" Columns: DishID, DishName, Serves, etc... 
Table: "DishIng" Columns: DishID, IngID, Volume 
Table: "Ingredients" Columns: IngID, IngName, Packsize etc... 

HTML:

<form action="Array.php" method="post"> 
<ul> 
<li>DishID: <input type="text" name="DishID"></li> 
<li>Name: <input type="text" name="DishName"></li> 
<li>Catagory : <input type="text" name="DishCatID"></li> 
<li>Serving: <input type="text" name="Serving"></li> 
<li>SRP: <input type="text" name="SRP"></li> 
<li>Method : <input type="text" name="Method"></li> 
<li>Source : <input type="text" name="SourceID"></li> 
<br> 
<li>IngID: <input type="text" name="IngID"></li> 
<li>Volume: <input type="text" name="Volume"></li> 

<li>IngID: <input type="text" name="IngID"></li> 
<li>Volume: <input type="text" name="Volume"></li> 

<li>IngID: <input type="text" name="IngID"></li> 
<li>Volume: <input type="text" name="Volume"></li> 

</ul> 
<input type="submit"> 
</form> 

动态地添加在HTML成分的排任何建议将是非常欢迎的。

PHP:

<?php 

require_once('db_connect.php'); 

$DishID = mysqli_real_escape_string($con, $_POST['DishID']); 
$DishName = mysqli_real_escape_string($con, $_POST['DishName']); 
$DishCatID = mysqli_real_escape_string($con, $_POST['DishCatID']); 
$Serving = mysqli_real_escape_string($con, $_POST['Serving']); 
$SRP = mysqli_real_escape_string($con, $_POST['SRP']); 
$Method = mysqli_real_escape_string($con, $_POST['Method']); 
$SourceID = mysqli_real_escape_string($con, $_POST['SourceID']); 
$IngID = mysqli_real_escape_string($con, $_POST['IngID']); 
$Volume = mysqli_real_escape_string($con, $_POST['Volume']); 

$array = array('$DishID', '$IngID', '$Volume'); 


$sql="INSERT INTO Dishes (DishID, DishName, DishCatID, Serving, SRP, Method, SourceID) 
VALUES ('$DishID', '$DishName', '$DishCatID', '$Serving', '$SRP', '$Method', '$SourceID')"; 

$sql2 = "INSERT INTO DishIng (DishID, IngID, Volume) VALUES ('$DishID', '$IngID', '$Volume')"; 

$it = new ArrayIterator ($array); 

$cit = new CachingIterator ($it); 

foreach ($cit as $value) 
{ 
    $sql2 .= "('".$cit->key()."','" .$cit->current()."')"; 

    if($cit->hasNext()) 
    { 
     $sql2 .= ","; 
    } 
} 

if (!mysqli_query($con,$sql)) { 
    die('Error: ' . mysqli_error($con)); 
} 
echo "1 record added"; 


if (!mysqli_query($con,$sql2)) { 
    die('Error: ' . mysqli_error($con)); 
} 
echo "records added"; 


require_once('db_disconnect.php'); 
php?> 

目前上提交,它仅更新“菜”表,并给了我这个消息:“1个纪录addedError:您在您的SQL语法错误; ('0','$ DishID'),('1','$ IngID'),('2','$ Volume')附近使用正确的语法检查与您的MySQL服务器版本相对应的手册。 'at line 1'

+0

变量不会在单引号内部扩展。所以'$ array'包含字符串'$ DishID',而不是该变量的值。你为什么要把这些值放在引号中? – Barmar 2014-09-23 07:49:35

+1

您的表单中有多个字段具有相同的名称。只有其中一个将被提交。你应该给他们以'[]'结尾的名字,然后PHP将它们收集到一个数组中。 – Barmar 2014-09-23 07:51:09

+0

我真的很努力做到这一点,正确的是我的foreach语句的基础,正如其他人正在采取的那样,而不是数组元素。你会如何建议这是最好的书面? – nbren007 2014-09-23 11:15:47

回答

0

你需要改变您的表单使用阵列式名称进行重复输入:

<form action="Array.php" method="post"> 
<ul> 
<li>DishID: <input type="text" name="DishID"></li> 
<li>Name: <input type="text" name="DishName"></li> 
<li>Catagory : <input type="text" name="DishCatID"></li> 
<li>Serving: <input type="text" name="Serving"></li> 
<li>SRP: <input type="text" name="SRP"></li> 
<li>Method : <input type="text" name="Method"></li> 
<li>Source : <input type="text" name="SourceID"></li> 
<br> 
<li>IngID: <input type="text" name="IngID[]"></li> 
<li>Volume: <input type="text" name="Volume[]"></li> 

<li>IngID: <input type="text" name="IngID[]"></li> 
<li>Volume: <input type="text" name="Volume[]"></li> 

<li>IngID: <input type="text" name="IngID[]"></li> 
<li>Volume: <input type="text" name="Volume[]"></li> 

</ul> 
<input type="submit"> 
</form> 

然后你的PHP应该是:

$DishID = mysqli_real_escape_string($con, $_POST['DishID']); 
$DishName = mysqli_real_escape_string($con, $_POST['DishName']); 
$DishCatID = mysqli_real_escape_string($con, $_POST['DishCatID']); 
$Serving = mysqli_real_escape_string($con, $_POST['Serving']); 
$SRP = mysqli_real_escape_string($con, $_POST['SRP']); 
$Method = mysqli_real_escape_string($con, $_POST['Method']); 
$SourceID = mysqli_real_escape_string($con, $_POST['SourceID']); 

$sql="INSERT INTO Dishes (DishID, DishName, DishCatID, Serving, SRP, Method, SourceID) 
     VALUES ('$DishID', '$DishName', '$DishCatID', '$Serving', '$SRP', '$Method', '$SourceID')"; 
mysqli_query($con, $sql) or die(mysqli_error($con)); 

$values = array(); 
foreach ($_POST['IngID'] as $i => $ingID) { 
    if (!empty($ingID)) { 
     $ingID = mysqli_real_escape_string($con, $ingID); 
     $volume = mysqli_real_escape_string($con, $_POST['Volume'][$i]); 
     $values[] = "('$DishID', '$ingID', '$volume')"; 
    } 
} 
if (!empty($values)) { 
    $sql2 = 'INSERT INTO DishIng (DishID, IngID, Volume) VALUES ' . implode(', ', $values); 
    mysqli_query($con, $sql2) or die(mysqli_error($con)); 
} 
1

对于您的$sql2,您在foreach循环内添加的第一行不会以逗号分隔。它也没有相同数量的字段(3和2)。

$sql2 = "INSERT INTO DishIng (DishID, IngID, Volume) VALUES ('$DishID', '$IngID', '$Volume')"; // 3 fields 
... 
$sql2 .= "('".$cit->key()."','" .$cit->current()."')"; // 2 fields 

一个很好的方法做,这是你的字符串存储阵列内使用implode函数','胶水。逗号将在两个元素之间自动插入。

+0

对不起,在这里很厚,但我会在哪里额外的逗号?我从教程中学习了这个方法,所以不确定我是否完全理解它。 – nbren007 2014-09-23 09:09:51

+0

这取决于。如果你有多个字段,你必须在''''''''之后加一个')。但是,如果你只有一个价值,那么不是。这就是为什么最好在数组中插入所有'('$'DishID','$ IngID','$ Volume')'并使用'$ sql2 = implode(',',$ array);' – GHugo 2014-09-23 10:04:03

+0

How你会指定它进入的表吗? 你的意思是这样吗? '$ array = array('$ DishID','$ IngID','$ Volume'); $ sql2 = implode(',',$ array);' 每个行的DishID总是相同的。其他两个将是可变的。这些可能有很多行。 – nbren007 2014-09-23 10:19:34

0

你应该看看创建的查询。

您的静态sql2字符串和动态值之间缺少一个逗号。另外,你想插入的值不正确,我假设。用你创建的查询,你想插入4行,你在你的请求中使用了dishID,IngID和Volume作为IngID,你不想让我想。

P.S .:您可以使用像MySQL Workbench这样的工具在执行它们之前测试您的语句。 (你可以看到它们的结果)

+0

对不起,我不确定我是否按照你说的逗号缺失的地方。 我希望DishID在第一个SQL语句的第二个SQL表中始终保持不变。第二个陈述应该只是将可变成分和体积更新到另一个表中。 – nbren007 2014-09-23 11:18:25

0

这里的例子对于使用JavaScript动态,如果你考虑使用表上添加一行:

<div> 
<input name='buttonadd' type='button' id='add_table' value='Add'> 
</div> 

<table id='mytable'> 
    <tr> 
    <td>DishID: <input type="text" name="DishID[]"></td> 
    <td>Name: <input type="text" name="DishName[]"></td> 
    <td>Catagory : <input type="text" name="DishCatID[]"></td> 
    </tr> 
    </table> 

和这里的的JavaScript:

$("#add_table").click(function(){ 
$('#mytable tr').last().after('<tr><td>DishID: <input type="text" name="DishID[]"></td><td>Name: <input type="text" name="DishName[]"></td><td>Catagory : <input type="text" name="DishCatID[]"></td> 
     </tr>'); 
});