Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2017, 18:51   #1
tonchikp
Пользователь
 
Аватар для tonchikp
 
Регистрация: 16.07.2016
Сообщений: 15
Вопрос PHP - execute

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

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

Есть массив (кстати, может заменить на объект?) и две таблицы в базе данных:
Код:
$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 и он сам взял что ему необходимо, но насколько я знаю, больше чем нужно параметров нельзя указывать.

Прошу учесть, что задача упрощена! В таблицах куча колонок, а не по две как здесь, поэтому их перечисление трудоёмко, это и заставляет искать иные способы!
Изучаю Python3. Добавляйтесь в друзья: tonchikp@jabberon.net
tonchikp вне форума Ответить с цитированием
Старый 18.07.2017, 19:18   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

В питоне можно вот так,

Код:
db = sqlite3.connect('sqlite3.db');
cursor = db.cursor();

users = [(name1,phone1, email1, password1),
         (name2,phone2, email2, password2),
         (name3,phone3, email3, password3)];

cursor.executemany(''' INSERT INTO users(name, phone, email, password) VALUES(?,?,?,?)''', users);
db.commit();
db.close();
Должно быть что то похожее и в php


Ну или старые добрые транзакции


Код:
BEGIN TRANSACTION;
INSERT INTO 'table' table VALUES ('data1', 'data2');
INSERT INTO 'table table VALUES ('data3', 'data4');
...
COMMIT;
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 18.07.2017 в 19:21.
pompiduskus вне форума Ответить с цитированием
Старый 18.07.2017, 19:53   #3
tonchikp
Пользователь
 
Аватар для tonchikp
 
Регистрация: 16.07.2016
Сообщений: 15
По умолчанию

Нет, не то. Вы о множественной вставке, то есть несколько строк. А я о вставке одной (ну можно и многих) строки, но разной в разные таблицы. У вас параметры те которые нужны для запроса, поэтому всё нормально вставится, а в моей задаче есть как бы лишние параметры, поэтому нужно что-то делать. Про вручную удалить лишнее и про вручную указать нужное я знаю, но хотелось бы автоматически как то. Ведь в реальной задаче много "нужного" и много "лишнего", вручную трудно.
Изучаю Python3. Добавляйтесь в друзья: tonchikp@jabberon.net
tonchikp вне форума Ответить с цитированием
Старый 18.07.2017, 23:31   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от tonchikp Посмотреть сообщение
Ведь в реальной задаче много "нужного" и много "лишнего", вручную трудно.
Как ваша «реальная задача» определяет "нужное" и "лишнее"?
Andkorol вне форума Ответить с цитированием
Старый 19.07.2017, 01:29   #5
tonchikp
Пользователь
 
Аватар для tonchikp
 
Регистрация: 16.07.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Как ваша «реальная задача» определяет "нужное" и "лишнее"?
"Нужное" и "лишнее" с точки зрения запроса. Всё очень просто, в запросе два параметра требуются, а даётся три - значит один лишний. Это легко определяется по сообщениям выше
Изучаю Python3. Добавляйтесь в друзья: tonchikp@jabberon.net
tonchikp вне форума Ответить с цитированием
Старый 19.07.2017, 09:40   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от tonchikp Посмотреть сообщение
"Нужное" и "лишнее" с точки зрения запроса. Всё очень просто, в запросе два параметра требуются, а даётся три - значит один лишний.
Так вот об этом и вопрос – как ваша «реальная задача» определяет, в какую именно из двух таблиц какие именно два параметра из трёх записывать?
В одну таблицу записываются параметры animal и age – а в другую animal и color.
Почему так – а не наоборот?
По каким признакам или условиям это определяется?
По списку доступных полей в таблице?
По расположению звёзд и планет на момент выполнения запроса?
Как?
Andkorol вне форума Ответить с цитированием
Старый 19.07.2017, 14:42   #7
tonchikp
Пользователь
 
Аватар для tonchikp
 
Регистрация: 16.07.2016
Сообщений: 15
По умолчанию

Так вот в том то и дело, что видимо автоматического решения нет, то есть ей конкретно нужно два параметра из трёх, только нужные, и так каждой таблице свои. А жаль, в таком случае только если формировать два массива, без лишнего.
Само ничего не делается. Мой вопрос был "а возможно ли само" (автоматически то есть). Надежда была на то что он сам возьмёт из массива, откинув лишнее, руководствуясь именами переменных, как-то так
Изучаю Python3. Добавляйтесь в друзья: tonchikp@jabberon.net
tonchikp вне форума Ответить с цитированием
Старый 19.07.2017, 15:16   #8
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Это важ нужен квантовый компьютер тогда.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 19.07.2017, 16:26   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,157
По умолчанию

ваша проблема кроется скорее всего в нерациональном планировании структуры БД
и точно в отсутствии четкого понятия того что же вам нужно

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

то есть
Цитата:
Код:
$massive1 = [
'animal' => 'cat',
'age' => '1',
'color' => 'gray'
];

$massive2 = [
'animal' => 'cat',
'sex' => 'm',
'die' => 12
];

InsertInDB($massive1);
InsertInDB($massive2);
а функция, "волшебным" образом определяла - в какую таблицу вы хотите вставить, и какие поля при этом использовать?
так?

Последний раз редактировалось ADSoft; 19.07.2017 в 16:33.
ADSoft вне форума Ответить с цитированием
Старый 19.07.2017, 17:34   #10
tonchikp
Пользователь
 
Аватар для tonchikp
 
Регистрация: 16.07.2016
Сообщений: 15
По умолчанию

Не совсем, тогда уж
Код:
$massive = [
'animal' => 'cat',
'age' => '1',
'color' => 'gray'
];

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

$prepare1 = $db -> prepare("INSERT INTO 'table1' (animal, age) VALUES (:animal, :age)");
$prepare2 = $db -> prepare("INSERT INTO 'table2' (animal, color) VALUES (:animal, :color)");

$prepare1 -> execute($massive);
$prepare2 -> execute($massive);
Вот такого хотелось бы, чтобы execute просто проигнорировал лишние ключи, а массив был бы для двух запросов сразу. Ещё раз повторюсь что в реальной базе таких ключей очень много и перечислять их в таком подходе по три раза (сначала в массиве, потом в insert возле into, потом в insert возле values) это ужас, а если ещё bindParam - так ещё хуже
Цель этой затеи исключить человеческий фактор, за три то раза можно и ошибиться
Против bindParam - ничего не имею, безопасность тоже хотелось бы
Изучаю Python3. Добавляйтесь в друзья: tonchikp@jabberon.net
tonchikp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с EXECUTE AS Greek9000 SQL, базы данных 6 24.09.2018 20:18
execute sky_diver89 Общие вопросы Delphi 2 18.12.2014 07:47
не выполняется opendialog1.Execute virtuhay266 Помощь студентам 9 08.01.2011 22:12
Инструкция Execute Desha Microsoft Office Access 6 10.06.2010 20:11
Проблема с фкнкцией Execute rocky7 Общие вопросы C/C++ 0 01.03.2009 16:42