Я пытаюсь использовать подготовленный запрос оператора, чтобы вставить несколько строк в таблицу. Мне нужно получить 2 значения из второй таблицы и вставить их вместе с 3 параметрами.
MySQL видит только суб-запрос как одно значение, а не извлекаемое 2, поэтому просит добавить дополнительный параметр, поскольку присутствует только четыре.
$stmt = $mysqli->prepare("INSERT INTO tbl_permit_daily_sign_off (permit_id, shift, employee_id, sign_off_date, type)
VALUES ((SELECT tbl_permit_project.permit_id, tbl_shifts.shift_name FROM tbl_permit_project
INNER JOIN tbl_shifts ON tbl_permit_project.project_id = tbl_shifts.project_id
WHERE tbl_shifts.end_time <= NOW()), ?, ?, ?)");
$stmt->bind_param("iss", $permit_employee = 0, $today, $type = "auto");
$stmt->execute();
$stmt->close();
Вам нужна INSERT... SELECT
форма вставки, а не форма INSERT... VALUES()
.
INSERT INTO tbl_permit_daily_sign_off
(permit_id, shift, employee_id, sign_off_date, type)
SELECT tbl_permit_project.permit_id, tbl_shifts.shift_name
FROM tbl_permit_project
INNER JOIN tbl_shifts ON tbl_permit_project.project_id = tbl_shifts.project_id
WHERE tbl_shifts.end_time <= NOW()), ?, ?, ?)
Как это работает?
1) вы создаете запрос SELECT с указанием столбцов, которые вы хотите использовать в запросе INSERT. Затем вы проверите и устраните неисправность.
2) Вы помещаете INSERT INTO tbl (col, col, col...)
прямо перед вашим SELECT.
Ваш INSERT выбирает столбцы (permit_id, shift, employee_id, sign_off_date, type)
но ваш SELECT упоминает только два из этих столбцов. Вам нужен SELECT, чтобы упомянуть все пять.
$type = 'auto'
в качестве параметра нерегулярен, насколько PHP идет. Эта переменная не имеет значения, просто передайте'auto'
напрямую.