Задать вопрос
  • Как хранить информацию в БД о поставщиках когда они могут являться разынми сущностями?

    Vindicar
    @Vindicar
    RTFM!
    Это, по сути, наследование. Абстрактный класс-предок (поставщик) и конкретные классы-потомки (физлицо, ИП, организация). Наследование обычно выражается в структуре БД так: создаётся таблица "Поставщик", содержащая общие для всех классов поля и имеющая свой ключ.
    Затем под каждый класс-потомок создаётся отдельная таблица, содержащая сведения, уникальные для этого класса. В этой таблице первичный ключ одновременно является внешним ключом, ссылающимся на таблицу "Поставщик". Иными словами, в таблице-потомке могут быть только записи с ключами, которые есть в таблице "Поставщик", а для каждой записи в "Поставщик" будет не более одной записи в таблице-потомке.

    В таблице "Поставщик" также может быть поле, указывающее на конкретный тип поставщика (физлицо, ИП, организация), т.е. в какой таблице искать остальные данные. Наличие или отсутствие этого поля - вопрос вкуса. В принципе, если нам нужны сведения о конкретном типе поставщика, мы можем попытаться сделать INNER JOIN с нужной конкретной таблицей. Это отсеет все записи других типов.
    Такой подход (без поля типа) позволяет избежать противоречий, когда запись находится в одной таблице-потомке, а поле указывает на другую. Но с другой стороны, если мы не знаем, какой конкретный тип у данного поставщика, нам придётся либо перебирать таблицы-потомки в рамках нескольких запросов к БД, либо делать LEFT JOIN со всеми таблицами-потомками, и смотреть, какие поля не будут NULL.

    Слабая сторона такой схемы в том, что связь по внешнему ключу не запрещает существование записей в нескольких таблицах-потомках, ссылающихся на одну и ту же запись в "Поставщике". Это придётся контролировать отдельно, триггерами или хранимыми процедурами.
    Ответ написан
    4 комментария
  • Перенести коммиты с локали в удаленный репозиторий?

    @res2001
    Developer, ex-admin
    Добавите в локальную репу URL удаленного репозитория с помощью git remote add ...
    Или, если надо изменить старый URL, то git remote set-url ...
    Для справки git remote --help
    Дальше пушите в добавленную репу.
    Ответ написан
    Комментировать
  • Каким софтом просматривать список функций исполняемого файла в Linux?

    @res2001
    Developer, ex-admin
    dumpobj, nm - просмотр импорта/экспорта
    ldd - зависимости от библиотек
    Ответ написан
    2 комментария
  • Какую книгу прочитать про SQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Изучать SQL как сферический язык в вакууме - нет особого смысла. Особенно если ты спрашиваешь про хинты. Хинты - это опция конкретной реализации DBMS. У Оракла - свои хинты. У Microsoft - свои. И знания между ними - совершенно не переносимые. И сами хинты кажется не стандартизированы в SQL стандарте. Здесь я могу ошибаться - пускай знающие подскажут.

    Вобщем если ты где-то уже работаешь и вы используете конкретную БД - то бери и читай по ней.

    Я в своё время тоже искал теоретическую литературу по оптимизации SQL. Нет толком ничего. Есть Ден Тоу. Настройка SQL для профессионалов. Он пытается подогнать под оптимизацию свою теорию. Считает селективности и кардинальности для суб-запросов и рисует "облачки" - диаграммы пытаясь вывести формулу cost. Но это всё не работает. Это разбивается о практику. Ни одна практика Oracle/PG/MSQL/MySQL не подрверждает эффеткивности диаграмм Тоу. Вобщем я зря потратил время на чтение этой книги. И тебе не советую.

    Бери конкретные книги от вендора и по ним смотри.

    И в твоём вопросе не хватает еще одного хеш-тега.
    Ответ написан
    Комментировать
  • Как вывести данные из базы данных в инлайн кнопки?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    1. Разделяете задачу на более мелкие пункты до тех пор, пока их можно разделить.
    2. Ищите реализацию пункта в документации/гугле.
    3. Пишите.
    4. Если в процессе не получается что-то конкретное - задаете вопрос гуглу или здесь.
    Ответ написан
    3 комментария
  • Как сделать обводку div блока в определенное время на php?

    Liatano
    @Liatano
    Воспользоваться функциями даты и времени (date(), time()), сравнивая текущее время с необходимым диапазоном. Однако,сама по себе идея делать подобное через php - неочень. PHP исполняется на стороне сервера, а значит на страницу нельзя повлиять до обновления страницы, так что состояние блоков будет устаревшим. В данном случае нужно пользоваться JS, т.к. именно он исполняется на стороне клиента, подробнее про работу со временем в JS читаем тут
    Ответ написан
    Комментировать
  • Нужно ли в таких случаях делать защиту от инъекций?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Нужно!!!
    Ответ написан
    Комментировать
  • Нужно ли в таких случаях делать защиту от инъекций?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    во первых - у вас ошибка в коде, отсутствует кавычка: 'password,
    Во вторых - вопрос в корне не верный, если мы говорим о коде. Основное правило при работе с данными от пользователя - данным от пользователя нельзя доверять никогда.
    Отсюда же и второе правило - любые данные в запросах, если это переменные пришедшие из кода, а не прописанные буквами и цифрами в запросе, должны быть через подготовленные выражения, вы не можете гарантировать что где-то не пропустите пользовательский ввод в запрос.
    Ответ написан
    Комментировать
  • Нужно ли в таких случаях делать защиту от инъекций?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нужно, разумеется.
    Это как в одном пошлом анекдоте про поручика Ржевского,
    - Запрос есть? Значит нужно.

    Если кажется, что защита слишком сложная, то либо вариант предложенный Сергей delphinpro в комментариях,
    $stmt = mysqli_prepare($connect, "INSERT INTO `bd` (`id`, `name`, `tel`) VALUES (NULL, ?, ?)");
    mysqli_stmt_execute($stmt, [$_POST['name'],  $_POST['tel']]);

    Либо, поскольку это ещё не везде работает, пишется маленькая функция на 5 строк, и кладётся в файл, где прописано соединение с БД
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    И дальше просто
    $sql = "INSERT INTO `bd` (`name`, `tel`) VALUES (?,?)";
    prepared_query($connect, $sql, [$_POST['name'], $_POST['tel']]);

    Просто, быстро, аккуратно, безопасно
    Ответ написан
    Комментировать
  • Как заменить часть строки данными из массива (php)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    8 комментариев
  • Почему RedBeanPHP возвращает Array?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В РНР Array - это список значений
    Вы получили ровно то что хотели
    Ответ написан
    3 комментария
  • Для чего в проектах принудительно используют use?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Часть проблем высосана из пальца, как очень смешной п.2 - разница в одну точку с запятой, а уже "гораздо длиннее", карл. При том что если класс использовать в коде хотя бы дважды, то вот тут как раз действительно получится "гораздо длинее"

    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Extension::unload([ 'vendor.module.components.cabinet.personal' ]);
    vs
    \Framework\Main\UI\Extension\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    \Framework\Main\UI\Extension\Extension::unload([ 'vendor.module.components.cabinet.personal' ]);

    и будешь постоянно спотыкаться в коде об эти палочки.

    А часть решается не просто, а очень просто: вместо того, чтобы писать код в Блокноте Виндоус, надо в кои-то веки освоить работу с нормальной IDE. Которая
    - автоматом скрывает блок use
    - по ctrl+наведение курсора показывает полный путь, а по ctrl-click сразу переходит в определение метода
    - подсвечивает неиспользуемые неймспейсы, и не проблема их удалить
    Ответ написан
  • Как сделать что бы возвращало все значения RB php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо прочитать в документации, что делает функция getCell, а потом подумать.
    Кроме просмотра обучающих видео на юбтубе, программирование также требует и собственной мыслительной активности программиста.

    Если думать совсем не получается, то надо пройти по ссылке из ответа на свой предыдущий вопрос, и прочитать там.
    Ответ написан
    5 комментариев
  • Для чего в проектах принудительно используют use?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Минусы как бы очевидны:
    нет, не очевидны, по крайней мере миллионам разрабов

    1 Код становится трудно читаем. По месту использования не всегда понятно что имеется ввиду под Order::load() - \Framework\Sale\Order::load или \Vendor\Project\Sale\Order::load - приходится проматывать к верху файла.
    Вам как разрабу должно быть в принципе фиолетово, какой из пакетов используется, если они соблюдают один интерфейс. Если не соблюдают, при том что называются одинаково, значит все пошло не так задолго до проблем с определением пакета...

    2 Код становиться длиннее - там где было бы просто:
    \Framework\Main\UI\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    приходится писать:
    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Код становится длиннее в проектах где 2 контроллера и в них по 1 экшену. Там где Extension::load будет вызываться больше одного раза, очевидно экономия на эксплуатации клавиатуры заметно увеличивается. А в больших проектах создание объекта может (и будет) повторяться многократно.

    4 Код становиться замусоренным, так как верхушки файлов запросто превращаются во что-то вроде:
    Если не обращать внимание на отсутствие пункта 3, то... нет, не могу не обращать внимание, вот же торопыга....
    Во первых - данная портянка очень аккуратно прячется любой адекватной ИДЕ,
    Во вторых - это правильно и логично, хранить все импорты в одном месте
    В третьих - если ты пишешь неимпортированный класс в коде - ИДЕ обычно предлагает варианты внесения его в блок импорта, и все выглядит аккуратно.

    И хрен его знает используются импортированные классы ниже ещё или уже нет, ведь никто не убирает этот мусор.
    Хрен не знает, а ИДЕ замечательно знает и даже подсвечивает серым цветом неиспользуемые.
    Ответ написан
    4 комментария
  • Как сделать сайт новичку, чтоб он одинаково корректно открывался старыми и новыми браузерами, в том числе смартфонами на Windows mobile 5, Symbian?

    @rPman
    Простых рекомендаций нет.

    Использование фреймворков заранее определит список устройств и браузеров (про устройства - важное замечание, так как банальный размер и наличие скалинга многое определяет), но сделает работу проще, а если делать все самому то будет эффективнее,больше гибкости и главное понимание что как работает и почему нет!

    Бессмысленно делать поддержку для всех, нужно чётко определить свою целевую аудиторию, приобрести или настроитьсимуляцию всех используемых устройств и активно тестировать любое нововведение.

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

    Есть два основных направления разработки веб приложений, основные на месте генерации итогового html - на серверной стороне и на клиенте.

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

    Второй подход, его ещё называют SPA, переносит все что касается интерфейса на сторону клиента, оставляя серверу бизнеслогику, это сильно уменьшает затраты на разработку бакэнда и снижает затраты ресурсов сервера, причем на столько, что даже миллионы пользователей потянет один сервер (защита ддос, CDN и т.п. можно считать фичей провайдера), но затраты на разработку со стороны браузера возрастут именно при необходимости поддержи большего количества устройств..

    Для начинающего я бы рекомендовал первый подход, с оглядкой на постепенный переход к SPA.
    Ответ написан
    Комментировать
  • Чем снять образ диска?

    @Zzzz9
    ddrescue
    Ответ написан
    Комментировать
  • Как составить план обучения после основ С#?

    Раз у тебя уже есть готовый список, то вот что можно ответить:

    Самое важное, без чего ты вообще никак не сможешь работать:
    ASP NET Core, Postgresql
    Им нужно уделить больше внимания.
    Курсы есть и по тому и по другому, есть и вполне хорошие бесплатные.
    Например у Postgrespro есть бесплатный курс (тебя должен интересовать PostgreSQL для разработчика) и книги.

    Затем то, что точно пригодится в работе, но что сравнительно быстро можно изучить:

    git - ты его не упомянул, но он очень важен. Есть бесплатная книга Pro Git где подробно описаны все его команды + есть немало видео на youtube где в действии показано, как им пользоваться.

    SOLID - можно почитать статьи и книгу "Чистая Архитектура". В любом случае от тебя не ждут знаний на уровне архитектора тут.

    Unit tests - просто попробуй сам писать тесты на каком-нибудь фреймворке. Например на xUnit.
    Ещё можешь почитать книжку Кента Бэка про разработку через тестирование.

    Code review - просто почитай пару статей о том, зачем это нужно, и как не быть мудаком-ревьюером, и как принимать обратную связь на ревью.

    Методологии разработки - просто ознакомься с теми, какие вообще есть.
    Большинство сейчас работают по Scrum или Kanban (либо на чём-то производном от них).
    Можешь ещё agile manifesto почитать
    Опять же - от тебя тут не ждут знаний уровня менеджера проектов, и тебе не придётся с нуля процесс разработки в команде выстраивать.
    Ответ написан
    1 комментарий
  • Preg_replace_callback, как записать найденные значения в массив?

    @dodo512
    $text = 'Просто текст 12345';
    $matches = [];
    $text = preg_replace_callback('~[0-9]~', function($match) use(&$matches) {
    $matches[] = $match[0];
    return '';
    }, $text);
    
    var_dump($text, $matches);
    Ответ написан
    1 комментарий
  • Стоит ли покупать ультрабук для учёбы в ВУЗе (программирование)?

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    Если потребности нет, то не стоит слушать посторонних людей. И тут тоже))
    Купите когда действительно понадобится.
    А так на казённых хоть к линуксу привыкните))
    Ответ написан
    Комментировать