将多个(多选菜单)数据插入 MySQL

分享于2022年07月17日 mysql php 问答
【问题标题】:将多个(多选菜单)数据插入 MySQL(insert multiple (Multi select menu) data into MySQL)
【发布时间】:2022-06-11 00:39:51
【问题描述】:

我有一组数据包含一个(多选菜单文本)和 4 个输入字段








这组数据根据用户的选择重复多次

我已经将变量正常推送到 jQuery

let threads = [];
let colorSelect = [];
let countPiece = [];
let total = [];
let hadr = [];

$(".threads-value").each(function() {
  threads.push($(this).val());
});

$(".color_select_thread option:selected").each(function() {
  let text = $(this).text();
  //let tempVal = $(".color_select_thread").text();
  if (text.indexOf(text) >= 0 && colorSelect.indexOf(text) < 0) {
    colorSelect.push(text);
  } else if (text.indexOf(text) < 0 && colorSelect.indexOf(text) >= 0) {
    colorSelect.splice(colorSelect.indexOf(text), 1);
  }
  //  colorSelect.push($(this).text());
});

$(".total_thread").each(function() {
  total.push($(this).val());
});

$(".hadr_thread").each(function() {
  hadr.push($(this).val());
});

$.ajax({
  url: "requests/ordersAddAccessories.php",
  dataType: 'text',
  data: {
    "action": "add_threads",
    "order": ,
    "threads": threads,
    "colorSelect": colorSelect,
    "colorNumber": colorNumber,
    "countPiece": countPiece,
    "total": total,
    "hadr": hadr,
    "last": last
  },

我写了后端代码将值输入到数据库中

$order = $_POST['order'];
$colorSelect = $_POST['colorSelect'];
$threads = $_POST['threads'];
$hadr = $_POST['hadr'];
$total = $_POST['total'];
$last = $_POST['last'];

for ($i =0; $i < count($threads); $i++){
    foreach ($colorSelect AS $meriag){
        $result = $conn->query("INSERT INTO order_threads(order_id,
         thread_id,
         color_select,
         colorNumber_input,
         countPiece ,
         total,
        hadr,
        egmaly ) 
        VALUES
        (
        '$order',
        '$threads[$i]', 
        '$meriag',  // This is Multi Select menu data
        '$colorNumber[$i]',
        '$countPiece[$i]',
        '$total[$i]',
        '$hadr[$i]',
        '$last[$i]')");   
    }
}

$result2 = $conn->query("UPDATE orders SET thread=1 WHERE id='$order'");

if ($result2){
    echo 'done';
}

代码对所有输入都很好,除了多选菜单的数据

不是插入数据成功

我该如何解决这个问题?

  • 将表单字段发送到 PHP 的 JS 代码在哪里?
  • 我把3个代码第二个放在帖子里
  • 我看到你设置了一堆变量,但没有 $.ajax() 调用来发布它们。
  • @Barmar 现已添加到帖子中:)
  • text.indexOf(text) 始终为 0 。测试的目的是什么?

【解决方案1】:

您需要将 colorSelect 设为二维数组。第一个维度是每个 select ,第二个维度是该 select 中的选项列表。

let colorSelect = $(".color_select_thread").map(function() {
    return [$(this).find(":selected").map(function() {
        return $(this).text();
    }).get()];
}).get();

如果需要内部 map() 来解决 jQuery .map() 自动展平嵌套数组,则返回值周围的额外数组。见 Is there a jQuery map utility that doesn't automically flatten?

那么您在 PHP 中的循环将如下所示(我还将代码转换为使用准备好的 statemts 来防止 SQL 注入)。

$order = $_POST['order'];
$colorSelects = $_POST['colorSelect'];
$threads = $_POST['threads'];
$hadrs = $_POST['hadr'];
$totals = $_POST['total'];
$lasts = $_POST['last'];
$colorNumbers = $_POST['colorNumber'];
$countPieces = $_POST['countPiece'];

$stmt = $conn->prepare("INSERT INTO order_threads(order_id, thread_id, color_select, colorNumber_input, countPiece , total, hadr, egmaly ) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssssss", $order, $thread, $meriag, $colorNumber, $countPiece, $total, $hadr, $last);

for ($i =0; $i < count($threads); $i++){
    $thread = $threads[$i];
    $colorNumber = $colorNumbers[$i];
    $countPiece = $countPieces[$i];
    $total = $totals[$i];
    $hadr = $hadrs[$i];
    $last = $lasts[$i];
    foreach ($colorSelects[$i] AS $meriag) {
        if (!$conn->execute()) {
            die("INSERT failed: " . $conn->error);
        }
    }
}

$stmt = $conn->prepare("UPDATE orders SET thread = 1 WHERE id = ?");
$stmt->bind_param("s", $order);
if (!$stmt->execute()) {
    die("UPDATE failed: " . $conn->error);
}
echo 'done';

  • 谢谢,我收到了这个错误(在 C:\xampp\htdocs\arabia\requests\ordersAddAccessories.php 中为 foreach() 提供的参数无效 102
    )
  • var_dump($colorSelects) 显示什么?
  • 您是否注意到我将 $colorSelect 重命名为 $colorSelects ?我将所有这些变量都更改为复数,以将它们与循环中的单数变量区分开来。
  • 它显示数组(4){ [0]=> 字符串(10)“白色”[1]=>字符串(10)“黄色”[2]=>字符串(10)“黄色" [3]=> 字符串(8) " 灰白色" }
  • 这不是我的 JavaScript 代码创建的二维数组。您是否记得删除您填写 colorSelect 的代码并用我的代码替换它?