簡體   English   中英

MySQLi-插入多行-空的POST數組

[英]MySQLi - Insert multiple rows - empty POST array

更新

多虧了馬丁,我才得以解決問題。 更改了php代碼以反映解決方案。

問題:插入在表單中輸入數據並提交之前執行的語句

解決方案:使用!empty()僅在單擊“提交”按鈕后執行插入。


我被要求創建一個數據庫,以通過Web UI跟蹤數據,以跟蹤巧克力生產中的烘焙,包裝和配料。

創建一批的過程中使用三種類型的成分。 我想一次添加所有三個。 這三個表只有一張。

我的表單看起來像這樣,表格中包裹了20多個輸入字段:

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

在添加多行語句之前,我有兩個用於包裝/產品的SQL語句運行良好。

錯誤消息是:

錯誤:(1048)列“ batchCo”不能為空

編輯:我也得到所有變量的未定義索引通知,但是我想那是因為表單中還沒有數據。

我從基礎教程中學一個示例。

很抱歉,如果以前已經回答過。 我可能不明白這些答案,我是一個糟糕的程序員...

編輯:整個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.
}

UPDATE

問題來自名為“ bCode”的輸入字段的值。 在PHP頁面的頂部,輸入:

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

並且看到$_POST['bCode']的值是有效值。 讓我知道這個值是什么。

另請注意, value="1234"/></td>在最后一個引號和斜杠之間應有空格,因此: value="1234" /></td>是正確的。

我重申您需要按照我的回答的頂部將所有變量括在引號內。 您尚未在問題中引用的代碼上執行此操作。

請給我更新您得到的錯誤輸出或已更改的內容的信息:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM