从PHP插入多个MySQL的问题

时间:2014-09-23 07:40:28

标签: php html mysql

我正在尝试使用新条目更新菜肴表并将其交叉引用到现有的成分表中。对于添加的每个菜肴,用户需要分配多行所需的现有成分和体积。提交时,应将菜肴输入“菜肴”表中,并将指定的成分输入“DishIng”链接表中。

我的表格设置如下:

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?>

目前正在提交,它只更新'Dishes'表并给我这条消息:'1 record addedError:你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'('0','$ DishID'),('1','$ IngID'),('2','$ Volume')附近使用正确的语法'在第1行'

4 个答案:

答案 0 :(得分: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函数作为粘合剂','。将在两个元素之间自动插入逗号。

答案 1 :(得分:0)

您应该查看创建的查询。

静态sql2-string与动态值之间缺少逗号。您想要插入的值也不正确我假设。使用您创建的查询,您想要插入4行,并且您在请求中使用dishID,IngID和Volume作为IngID,这是您不希望我想到的。

P.S。:您可以使用MySQL Workbench之类的工具在实现它们之前测试您的语句。 (你可以看到他们的结果)

答案 2 :(得分:0)

以下是使用javascript动态添加行的示例,如果您考虑使用table:

<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>');
 });

答案 3 :(得分: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));
}