MySQLi - 插入多行 - 空 POST 数组
Posted
技术标签:
【中文标题】MySQLi - 插入多行 - 空 POST 数组【英文标题】:MySQLi - Insert multiple rows - empty POST array 【发布时间】:2015-06-27 10:07:54 【问题描述】:更新
感谢 Martin,我已经能够解决这个问题。更改了 php 代码以反映解决方案。
问题:在表单中输入数据并提交之前执行的插入语句
解决方案:使用 !empty() 仅在点击“提交”按钮后执行插入。
我被要求创建一个数据库,用于跟踪巧克力生产中使用的烘焙、包装和配料,并通过 Web UI 插入数据。
在创建一批的过程中使用了三种成分。我想一次添加所有三个。这三个人只有一张桌子。
我的表单看起来像这样,表格中包含 20 多个输入字段:
<form action="index.php" method="post">
<input type="text" id="bCode" name="bCode" value="1234" />
</form>
在我添加多行语句之前,我有两个用于包装/产品的 SQL 语句运行良好。
错误信息是:
错误:(1048) 列 'batchCo' 不能为空
编辑:我还收到所有变量的未定义索引通知,但我想这是因为表单中还没有数据。
我按照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);
【问题讨论】:
这个值好像是NULL
:错误信息很清楚,你试着打印出来却看不到。
你是如何给bcode字段赋值的?
@jeroen 问题是它为什么是 NULL,在我为多行添加部分之前似乎不是。
@fry3993 将其添加到原始帖子中。
【参考方案1】:
在您的 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>
是正确的。
我重申您需要根据我的答案的顶部将所有变量括在引号内。您尚未对问题中引用的代码执行此操作。
请告诉我你得到什么错误输出或发生了什么变化:)
【讨论】:
将值添加到我的初始帖子以及更多代码中。我试图像这样包装插入语句,但没有任何变化。 查看您的代码 -$bCode
来自哪里?这是一个帖子值,但没有名称为 bCode @zuhani 的输入
我将它添加到帖子的底部。所有输入字段看起来像这样。我将再次编辑帖子以使其更加可见。
@zuhani 我已经为你更新了我的 anwser - 请给我关于你的代码状态等的反馈:)
@zuhani 您的 BatchCo 值是自动增量值吗?如果是,则根本不需要将代码提供给 SQL 语句,而是在将数据保存到数据库行时自动生成。以上是关于MySQLi - 插入多行 - 空 POST 数组的主要内容,如果未能解决你的问题,请参考以下文章