Во-первых, я не вижу смысла морочиться с именованными параметрами, если запрос все равно никто не увидит. А с вопросами код в сто раз проще.
Во-вторых, последний foreach не нужен, надо просто написать $stmt->execute($toBind);
В-третьих и самое главное:имена полей никак не санитизируются вообще. Надо их валидировать обязательно.
Например вырезать из всех имен обратную кавычку и обрамлять в них же
Чтобы положить в карман 5 рублей, надо обязательно всю мелочь из кармана доставать?
Или может просто кинуть сколько есть?
Зачем ты сначала достаешь? По твоему бд не знает, какое сейчас значение?
Никогда не пиши в бд дату в виде
21.06.2021
Тебя помянут очень нехорошим словом те, кому придется с этой базой работать.
А строка твоя делается просто.
Не используй массивы, а пиши сразу строку. В частеости, скобки добавляй сразу. По ходу выводи результат и корректируй код.
У вас не может быть двух одновременных запросов, потому что mysqli по умолчанию использует небуферизованные запросы (для подготовленных операторов
Это кто у нас писал? Я? Или может быть Пушкин Александр Сергеевич?
А, я понял. У тебя шизофрения. Одна личность задаёт вопрос, а другая на него отвечает, обращаясь к первой в третьем лице. Одна личность не использует подготовленные запросы, и проблема у нее из-за хранимой процедуры или идиотского использования мульти квери. А вторая лепечет про подготовленные запросы, но воображает, будто у них проблема лечится через next result.
Не надо мне задавать вопросы. Вопросы здесь пишут не в комментариях, а в форме для нового вопроса.
Если ты не знаешь, решает или нет, то не надо было писать ответ.
Вот смотри, ты пишешь,
$data = null;
Это же ты сам писал, никто тебя не заставлял?
А почему теперь удивляешься, что $data не проходит проверку is_array и foreach на нее ругается? ;)
Йи все ошибки отлавливает и логирует автоматом.
Ничего добавлять не нужно.
Там где ты сам понаставил try catch их надо либо выпилить, либо добавлять догирование руками