Как создать универсальную CRUD-операцию Create на php для разных таблиц?
Попытаюсь объяснить что имею ввиду.
Разрабатываю класс для CRUD операций для своего проекта.
Есть функция для Update. Она довольно проста, передаю ей массив с парами: ключ-значение. Ключ равен названию соответствующего столбца в бд. Просто в цикле перебираю все эти пары и обновляю в базе те поля, которые есть в этом массиве. Запрос sql формируется вида UPDATE table SET f1 = v1, f2=v2 ... и т.д.
Т.е. значения после "SET" это фактически и есть пары из массива: ключ-значение. Соответственно, эту функцию можно применить к абсолютно любой таблице, если соблюдать правило, что ей передаются данные где ключ в массиве соответствовал бы названию этого поля в базе.
Но вот как быть с операцией добавления? Ведь запрос INSERT имеет такой синтаксис, что в нем должны быть обязательно перечислены все поля, которые есть в таблице, да еще и в нужном порядке. Получается, что этой функции нельзя передать произвольный набор данных, которые и будут добавлены в базу?
FanatPHP: Главным образом для того, что б не гуглить аббревиатуру.
Мало ли что из этого en.wikipedia.org/wiki/PDO может выбрать юный велосипедостроитель
FanatPHP: я просто стараюсь ответить полезно. и не знаю, как можно таким образом ответить на вопросы такого формата. Так же часто вижу, что люди совершают кучу ошибок просто из-за того, что не знают, что то или иное - существует.
Познакомится с пдо, миграцией, глядишь, до схемы дойдет. И многие вещи станут на свои места.
Описать все в одном посте врядли получится. А уход от чистого sql - хорошее начало, на мой взгляд.
Да и тем более, привязываться к какой-то конкретной субд - это лишнее. Лучше, на мой взгляд, понять, что процесс вообще фуфло (создавать собственный класс доступа к "объектам" базы.
FanatPHP: только объясни, пожалуйста, тупому, в каком страшном сне, кроме "сайтов-визиток" и "домашних страничек" нужно писать чистый sql для прямого доступа в базу в обход моделей?
Ты всё равно не поймешь. Я тебе задал простой вопрос из одного предложения: какая связь между PDO и форматом запроса INSERT. Ты в ответ накатал килобайт текста, в котором ни одно из ключевых слов вопроса не встречается. Это значит, что даже простого вопроса в одну строчку ты не понял. А уж более сложных объяснений и подавно не поймешь.
FanatPHP: Ты тоже щас сделал аналогичное)
Суть тех двух строчек со ссылкой, что я написал в ответе, что на самом деле вопрошающему нужен не формат запроса INSERT.
FanatPHP: да я не спорю, что оно не совсем в тему. И написал, что надеялся, что путь пдо->миграции натолкнет на схемы, и все это каким-нибудь боком заденет один из паттернов доступа к базе через модели, т.к. подход чистого sql - в корне неверный (понимание - да, использование - нет).
Аналогии в мире пхп могу приводить хреновые, да, слабо в нем шарю. Но вот то, что в первую очередь нужно бить по рукам за такой подход в веб-разработке, а не поощрять - это верно для любого языка
проблема в том, что смысла термина CRUD ты тоже не понимаешь. Иначе бы не рассказывал про чистый SQL. Про который, кроме тебя, тут НИКТО больше не упоминает.
Виктор Выскребенцев: Если рекомендуете работать с PDO (его я сейчас тоже изучаю) помогите тогда разобраться.
Скажем, вот так добавляю в таблицу запись:
Т.е. тут опять жестко перечислены поля, из которых состоит моя таблица и в которые я должен вписать соответствующие данные.
Но если, например, моей функции добавления были переданы не все параметры, могу я перечислить только их и сработает ли это?
Вот господин FanatPHP в случае с чистым MySQL подсказал, что для INSERT есть синтаксис, аналогичный синтаксису UPDATE с использованием "SET". Где после SET могу в цикле сформировать пары только тех параметров, которые мне нужны. Например, INSERT INTO table SET `name1` = 'test', `text` = 'test' ; А неупомянутые id, url, name2 будут добавлены пустыми (за исключением id, если это первичный ключ).
$db->query("UPDATE ?n SET ?u WHERE id=?i",$table, $data, $_POST['id']);
Нахрена этот код ? Пишешь новый дата-маппер или эктив-рекорд ? Это не чистый sql? без каких-либо валидаций и коллбэков. Или тут бизнес-логика, в будущем, будет реализована в mySQL ? :)
Я вообще молчу о том, что приведенный код предлагает лупануть переменную пользователя прямо в sql. Хрен с ними со всем разделением кода, паттернами и т.д.. Давайте сделаем из php "скриптовый язык" (где все делается в скрипте в 1000 строк), что б дальше его считали говнокодерским :)
Бред, товарищ, бред. А совет, что вы дали человеку - в народе называется "медвежья услуга".
Дмитрий: я Вам посоветую ознакомиться с тем, что такое ORM, ActiveRecord, DataMapper. И в работе использовать фреймворки и опробованные подходы. Безусловно, разбираться в том, что под капотом необходимо. Но, на мой взгляд, уже после того, как можете "тупо-на-фреймворке-сделать-что-то-лишь-бы-работало"
Дмитрий: Просто, если бы вы разделили код своего приложения, использовали бы модели, потихоньку пришла б мысль, что нужно бы еще и маппер какой-то. Оглянулись бы, увидели, например эктив-рекорд, разобрались. И вопросы, типа "как обновить разные таблицы" даже не мог бы появиться.
Виктор Выскребенцев: Если бы хотя бы чуть-чуть понимал, о чем говоришь, тебе было бы очень стадно :) Окей, ты не смог понять вопроса про формат INSERT. Окей, ты не понимаешь, что рекомендуемый тобой PDO не делает НИЧЕГО, кроме выполнения поносимого тобой же чистого SQL (хотя это само по себе ржака и шизофрения %). Но теперь ты опять наступаешь на те же грабли, и в твою голову, забитую умными словами, не помещается тот факт, что любой ORM в конечном итоге, внутри у себя, не посредством волшебной палочки выполняет запрос, а посредством того самого, чистого SQL :)))
Дмитрий: ну не тупи уже теперь ты. я столько не выдержу. PDO к твоему вопросу не имеет ни малейшего отношения. PDO может только ВЫПОЛНИТЬ твой запрос, но СОСТАВИТЬ его за тебя не может. А у тебя вопрос - КАКОЙ вопрос выполнить. PDO - ЭТО НЕ БАЗА ДАННЫХ. Глупо спрашивать, есть ли у него синтаксис insert. Нету. Синтаксис есть у mysql. Именно поэтому ответ, который мы сейчас комментируем, так истерически смешон. Не уподобляйся. Через PDO ты легко можешь выполнить запрос c SET. Точно так же, как можешь составить динамический INSERT в классическом синтаксисе.
троллить, на самом деле, часто это хорошее решение (серьезно). Но терять суть в этом случае тоже не стоит.
Попробуй перечитать сначала, а потом смотри квинтэссенцию разговоров в комментарии.
- ПДО имеет мало общего с вопросом автора, согласен
- На вопрос автора нет смысла отвечать, т.к. он в корне ошибочен. Ему надо дать правильный путь (на который, собственно и наталкивает то, что я написал. Возможно, не очень хорошо наталкивает, но это другой вопрос)
- Я несколько раз повторил, что знать, что под капотом (читай, чистый sql) - нужно. Использовать же его - нет. Для этого есть прослойки.
- Соглашусь, в одном ты был прав - вопрос я читал не особо внимательно. Т.к. с пхп я так себе связан, то решил, что раз автор не знает, что такое именованные параметры, значит, и не знает, что такое пдо. А это хороший первый шаг.
- Ну, и повторю, что б все стало на свои места: на вопрос я отвечать не собирался, я хотел, что бы человек пошел правильным решением, а не плодил говнокод.
Эк тебя корёжит :) Тяжко признавать свою неправоту? В первом пункте я оказался прав, а в четвертом, оказывается, я снова "только в одном" прав :) Плюс, ты так и не понял, что чувак как раз и пишет ту самую прослойку. То есть, ты неправ по всем пунктам. Ну, и чтобы все встало на свои места: если не собираешься отвечать на вопрос - не отвечай.
FanatPHP: В чем признать?) Если станет легче, признаю еще раз, что ПДО не связано с вопросом автора. Надо еще раз повторить, что вопрос ни о чем?
Бинго! Автор пишет прослойку! Вопрос: нахера? :)
Насчет того, что если не хочешь отвечать - не отвечай, ты это лучше ему скажи - https://toster.ru/user/FanatPHP/answers :)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.