2014-09-23 124 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>'); 
});