PHP - execute

tonchikp

Новичок
Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как эффективно и просто решить задачу:

Есть массив (кстати, может заменить на объект?) и две таблицы в базе данных:
Код:
$massive = [

'animal' => 'cat',
'age' => '1',
'color' => 'gray'

];

$db = new PDO('sqlite:file.sqlite');

$db -> exec("CREATE TABLE IF NOT EXISTS 'table1' (
id INTEGER PRIMARY KEY AUTOINCREMENT,

animal TEXT,
age INTEGER

)");

$db -> exec("CREATE TABLE IF NOT EXISTS 'table2' (
id INTEGER PRIMARY KEY AUTOINCREMENT,

animal TEXT,
color TEXT

)");

$prepare1 = $db -> prepare("INSERT INTO 'table1' (animal, age) VALUES (:animal, :age)");
$prepare2 = $db -> prepare("INSERT INTO 'table2' (animal, color) VALUES (:animal, :color)");
Цель: записать массив в обе таблицы. Вроде просто и не было бы вопроса, если бы можно было этот массив отдать в execute и он сам взял что ему необходимо, но насколько я знаю, больше чем нужно параметров нельзя указывать.

Прошу учесть, что задача упрощена! В таблицах куча колонок, а не по две как здесь, поэтому их перечисление трудоёмко, это и заставляет искать иные способы!
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну вот пробегаешься по массиву в foreach и впихиваешь все построчно, либо конструируешь запрос с мультивставками.

Если же ты хранишь массив по-колоночно - переделывай структуру БД
 

tonchikp

Новичок
Ну вот пробегаешься по массиву в foreach и впихиваешь все построчно, либо конструируешь запрос с мультивставками.

Если же ты хранишь массив по-колоночно - переделывай структуру БД
Массив в данном случае - это объединённый массив нужных параметров для вставки в запрос, то есть это одна строка для вставки, а не строки, зачем же foreach? Но проблема в том что он объединённый, то есть там как бы слиты два массива для запросов, а поэтому есть лишние поля. Не в смысле намеренно слиты.

либо конструируешь запрос с мультивставками.
А вот об этом поподробнее? Не совсем понял.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@tonchikp, у тебя может быть запрос вида

Код:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Если ты хочешь хранить массив в виде

id | свойство1 | ствойство2 | ... | свойствоN

Все в одну строку - это хреновое решение, хотя бы потому, что у тебя может появиться новое свойство и тебе придется менять структуру таблицы, то есть добавлять колонку. Надеюсь, что у тебя не так
 

tonchikp

Новичок
@tonchikp, у тебя может быть запрос вида
Это для данной задачи не подходит, плюс вроде в sqlite3 множественные вставки не поддерживаются, то есть такое придётся делать с многими insert, к сожалению. Вы указали вставку многих строк, а в моей задаче речь идёт об одной строке. То есть весь массив - это одна строка для запроса, поэтому
Все в одну строку - это хреновое решение, хотя бы потому, что у тебя может появиться новое свойство и тебе придется менять структуру таблицы, то есть добавлять колонку. Надеюсь, что у тебя не так
Данный массив - это уже заготовленные данные для вставки в запрос, то есть чтобы дать его в execute, но он сформирован для обоих execute сразу. Вот теперь как быть, есть ли автоматический способ разбить его на два массива для каждого execute без лишних полей, либо какой то иной способ есть.
 

jonjonson

Охренеть
Ну так создайте массивы с нужными ключами для каждого запроса.
Заполните их из общего массива в цикле.
Далее экзекъют.
 
Сверху