php - MySQLi - 插入多行 - 空 POST 数组

标签 php database forms mysqli

更新

多亏了 Martin,我才得以解决这个问题。更改了 php 代码以反射(reflect)解决方案。

问题:在表单中输入数据并提交之前执行插入语句

解决方案:使用 !empty() 仅在点击“提交”按钮后执行插入。


我被要求创建一个数据库,用于跟踪巧克力生产中使用的烘焙、包装和成分,并通过 Web UI 插入数据。

创建一批的过程中使用了三种成分。我想一次添加所有三个。所有三个只有一张 table 。

我的表单看起来像这样,在一个表格中包含 20 多个输入字段:

<form action="index.php" method="post">
<input type="text" id="bCode" name="bCode" value="1234" />
</form>

在添加多行语句之前,我有两个用于包装/产品的 SQL 语句运行良好。

错误信息是:

Error : (1048) Column 'batchCo' cannot be null

编辑:我还收到所有变量的未定义索引通知,但我想那是因为表单中还没有数据。

我遵循了 a basic tutorial 中的一个例子.

如果之前有人回答过这个问题,我很抱歉。我可能没有理解那些答案,我是一个糟糕的程序员......

编辑:整个php代码

session_start();

// product vars
$bCode = $_POST["bCode"];
$proName = $_POST["proName"];
$proGrindDate = $_POST["proGrindDate"];
$proBeanBatch = $_POST["proBeanBatch"];
$proSugarBatch = $_POST["proSugarBatch"];
$proButterBatch = $_POST["proButterBatch"];
$proQTY = $_POST["proQTY"];  
$proLabel = true;
$proFinish = true;        

// ingredient vars
$beanBatch = $_POST["beanBatch"];
$beanWeight = $_POST["beanWeight"];
$beanRoastDate = $_POST["beanRoastDate"];
$beanWinnowYield = $_POST["beanWinnowYield"];
$beanWinnowDate = $_POST["beanWinnowDate"];
$beanCarryOver = $_POST["beanCarryOver"];
$sugarBatch = $_POST["sugarBatch"];
$sugarWeight = $_POST["sugarWeight"];
$butterBatch = $_POST["butterBatch"];
$butterWeight = $_POST["butterWeight"];

// package vars
$packBagDate = $_POST["packBagDate"];
$packMouldDate = $_POST["packMouldDate"];
$packWrapDate = $_POST["packWrapDate"];
$packType = $_POST["packType"];
$packQTY = $_POST["packQTY"];

$mandatory = ["bCode", "proName", "proGrindDate", "proQTY", "beanBatch", "beanWeight", "sugarBatch", "sugarWeight", "butterBatch", "butterWeight", "packType", "packQTY"];  

echo($bCode);

// connection vars
$servername = "...";
$username = "...";
$password = "...";
$database ="traceability";       

// Create connection
$conn = new mysqli($servername, $username, $password, $database);

if(!empty($_POST["submit"])){ 

// Insert into database - single rows
// table product
$queryProduct = "INSERT INTO product (batchCo, name, dateGrind, quantity, ingBeansBatch, ingSugarBatch, ingButterBatch, label, finished) VALUES(?,?,?,?,?,?,?,?,?)";
$stmtProduct = $conn->prepare($queryProduct);

//bind parameters for markers, where (s = string, i = integer, d = double,  b = blob)
$stmtProduct->bind_param('issdsssbb', $bCode, $proName, $proGrindDate, $proQTY, $proBeanBatch, $proSugarBatch, $proButterBatch, $proLabel, $proFinish);

if($stmtProduct->execute())
    {
        echo "Everything is working"; 
    }
else
    {
        die('Error : ('. $conn->errno .') '. $conn->error);
    }
$stmtProduct->close();

// table packaging
$queryPackaging = "INSERT INTO packaging (dateBag, dateMould, dateWrap, Qty, batchCo, type) VALUES(?,?,?,?,?,?)";
$stmtPackaging = $conn->prepare($queryPackaging);
$stmtPackaging->bind_param('sssiis', $packBagDate, $packMouldDate, $packWrapDate, $packQTY, $bCode, $packType);

if($stmtPackaging->execute())
    {
        echo "Everything is working"; 
    }
else
    {
        die('Error : ('. $conn->errno .') '. $conn->error);
    }

$stmtPackaging->close();

// Insert into database - multiple rows
// table ingredients

    if (!empty($bCode) && is_numeric($bCode)){
$insert = $conn->query("INSERT INTO ingredients (batchNo, type, weight, roastDate, winnowDate, winnowYield, winnowCarryOver, batchCo) VALUES
    ('$beanBatch', 'Beans', '$beanWeight', '$beanRoastDate', '$beanWinnowDate', '$beanWinnowYield', '$beanCarryOver', '$bCode'),
    ('$sugarBatch', 'Sugar', '$sugarWeight', NULL, NULL, NULL, NULL, '$bCode'),
    ('$butterBatch', 'Butter', '$butterWeight', NULL, NULL, NULL, NULL, '$bCode')");
}

if($insert){
    //return total inserted records using mysqli_affected_rows
    print 'Success! Total ' .$conn->affected_rows .' rows added.<br />'; 
}else{
    die('Error : ('. $conn->errno .') '. $conn->error);
}
}

最佳答案

在您的 MySQL 语句中,您需要将 PHP 变量括在引号中,以将它们定义为 SQL 调用的输入值。

见:

$insert = $conn->query("INSERT INTO ingredients (batchNo, type, weight, roastDate, winnowDate, winnowYield, winnowCarryOver, batchCo) VALUES
('$beanBatch', 'Beans', '$beanWeight', '$beanRoastDate', '$beanWinnowDate', '$beanWinnowYield', '$beanCarryOver', '$bCode'),
('$sugarBatch', 'Sugar', '$sugarWeight', NULL, NULL, NULL, NULL, '$bCode'),
('$butterBatch', 'Butter', '$butterWeight', NULL, NULL, NULL, NULL, '$bCode')");

这是一种更好的 SQL 查询格式。

这是哪里 bCode字段值?我在你的代码中看不到它?但是这个$bCode变量需要赋值。

您还可以将整个 SQL 查询包装在一个检查中,以确保仅在存在有效 $bCode 时才初始化值:

已更新:

if ( !empty($bCode) && is_numeric($bCode)){
//run insert SQL here.
}

更新

问题来自名为“bCode”的输入字段的值。 在您的 PHP 页面顶部,请输入:

print "<pre>";
print_r($_POST);
print "</pre>";

然后看到 $_POST['bCode'] 的值是有效值。让我知道这个值是多少。

另请注意 value="1234"/></td>最后一个引号和斜杠之间应该有空格,所以:value="1234" /></td>是正确的。

我重申,您需要按照我回答的顶部将所有变量括在引号内。您还没有对问题中引用的代码执行此操作。

请告诉我您收到的错误输出或更改内容的最新信息:)

关于php - MySQLi - 插入多行 - 空 POST 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752013/

相关文章:

java - 如何获取存储在数据库中的图像路径并将其设置为按钮

javascript - React.js 设置输入值

php - 在保存到 mysql 的 php 脚本中转义引号的最佳方法是什么?

php - 如果使用 ORM 层,将如何在 PHP 中进行单元测试?

php - PayPal Rest SDK API - 获取 token

c# - 如何从我的数据库(formview)中检索数据并将其相乘,visual studio

MySQL 查询以获取所有(其他)症状和疾病

ruby-on-rails - 带有电话号码验证的搜索表单

php - 如何使用多个值和 SELECT 语句插入?

php mysql 在2个表内动态选择