• Почему img height отличается от родительского height? И как это решить?

    @jasper-blondin
    Потому что тег IMG -- инлайновый и на него влияют стили типографики.

    Укажите для тега IMG блочные стили:
    img {
        display: block;
    }
    Ответ написан
    1 комментарий
  • Для чего нужно скрывать папки и файлы git в .gitattributes при помощи export-ignore?

    Это в том числе полезно для репозиториев, код которых публикуется в качестве пакетов, для установки в других проектах.

    Устанавливая на свой php-проект либу для работы с базой - мне не нужны ни её тесты, ни readme, ни конфигурации статических анализаторов, ни дока, ни конфиги CI/CD. Мне нужен только код.
    Ответ написан
    Комментировать
  • Переходы на многостраничном сайте?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    Ох, я постараюсь тезисно

    Вам нужен чуть более умный бэкенд (можно на любом языке, включая Node.js)
    Вместо html-файлов вы пишите шаблоны. Если у вас нода+Express.js, у него вроде был встроенный шаблонизатор ejs, есть ещё pug и много других (гуглить по Node шаблонизаторы). Если у вас на фронте React/Angular/View - лучше погуглить "название-библиотеки server side rendering", шаблонизация в них встроена

    Абстрактно, ваш бэкенд получает запрос, идёт в базу данных или какой-нибудь JSON-файл за данными, а потом передаёт эти данные в шаблонизатор

    В шаблонах можно использовать циклы, условия и разные другие плюшки из программирования. Вам не нужно писать 10 тэгов "a" для вывода списка, ваш список - стандартный массив, вы проходитесь по нему циклом и выводите данные в тэг "a". Условно:

    myItems.map(item => (
    <a href={item.link}>{item.text}</a>
    ))


    Нужно поменять что-то в ссылках - меняете в одном месте
    Нужно добавить товар или другие сущности - добавляете их данные в базу или JSON
    Ответ написан
    Комментировать
  • Как выбирать первичные ключи в БД?

    hint000
    @hint000
    у админа три руки
    Но часто всё-таки добавляют искусственный первичный ключ "Номер". Подскажите, почему так?
    В таком простом случае - например, потому, что начинающие программисты. Им так проще. Либо увидели где-то пример и бездумно копируют.

    Хотя можно придумать пример посложнее. Пусть есть несколько филиалов и в разных филиалах отделы с одинаковыми названиями. Тогда составной ключ будет Филиал + Наименование, это уже не очень удобно и тогда появляется обоснованное желание добавить номер вместо составного ключа.
    Здесь перечисляются преимущества ("причины использования") и недостатки:
    https://ru.wikipedia.org/wiki/Суррогатный_ключ
    Причины использования:
    • Неизменность
    • Гарантированная уникальность
    • Гибкость
    • Эффективность
    • Упрощение программирования

    Недостатки:
    • Уязвимости генераторов ключей
    • Неинформативность
    • Склоняет администратора пропустить нормализацию
    • Вопросы оптимизации
    • Невольная привязка разработчика к поведению генератора ключей в конкретной СУБД

    Короче, использовать можно и нужно, если понимать, что в конкретном случае преимущества сильнее, чем недостатки. Без понимания тоже можно использовать, но будет лотерея: либо лучше, либо хуже. Потом придёт сеньор и отрефакторит.
    Ответ написан
    1 комментарий
  • Как выбирать первичные ключи в БД?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Но часто всё-таки добавляют искусственный первичный ключ "Номер".

    Основная идея первичных ключей - неизменяемость и уникальность. В качестве ключа может использоваться, например, инвентарный номер или isbn, даже если содержит буквы/символы, т.к. он физически уникален и не изменяем. С другой стороны есть очень много вещей, которые могут меняться: фио, номера телефонов, логины. И если изменить это данные, то придется изменить их и во всех таблицах, которые ссылаются на эти данные. И чтобы избежать таких ситуаций и используют искусственные ключи.
    Ответ написан
    1 комментарий
  • Как клонировать типовой сайт для новых заказчиков?

    @koder_1
    Битрикс программист
    Посмотрите в сторону механизмов обновления разных cms систем. Обычно все файлы сайта делят на ядро - файлы, одинаковые для всех сайтов на cms, и клиентскую часть - файлы специфичные для каждого конкретного сайта.
    При появлении нового функционала ядро автоматически обновляется.
    Ответ написан
    Комментировать
  • Как исправить Fatal error: Uncaught Error: Call to undefined function mysql_fetch_assoc()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Функции mysql_ отсутствуют уже почти 8 лет, начиная с PHP 7.0.
    Переходите на mysqli или PDO, либо откатывайтесь на PHP 5.
    Ответ написан
    Комментировать
  • Почему секундомер начинает идти быстрее?

    @Azperin
    Дилетант
    Не увидел где там новая игра запускается, зато есть таймер, который явно нигде не клирится
    setInterval(() => {
        if (!gamePause) {
          secondsCounter++;
    
          date = new Date(0, 0, 0, 0, 0, secondsCounter);
        }
      }, 1000);
    Ответ написан
    4 комментария
  • Что делать если не задаётся бэкграунд на nav?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Что значит "не задаётся бэкграунд"? Всё накидывается и работает в соответствии с тем, что указано в css.
    У nav белый фон, у списка внутри - серый, согласно универсальному селектору
    * {
        box-sizing: border-box;
        background: #E5E5E5;
    }
    (без чёткого понимания всех нюансов этого селектора использовать его не рекомендуется).
    Ответ написан
    3 комментария
  • Можно ли постить свои фриланс работы?

    an-tar
    @an-tar
    Full stack web developer
    Правило хорошего тона - спрашивать. Кто-то согласится, а другой будет против. Также может зависеть от юридической стороны вопроса -содержание договоров, NDA и т.п.
    Ответ написан
    Комментировать
  • Можно ли постить свои фриланс работы?

    pozZzitiv
    @pozZzitiv
    Дизайнер и перфекционист
    Кратко: можно, если это не было прямо запрещено.

    Если устно или в переписке была озвучена просьба не выкладывать, то чисто по-человечески следует пойти навстречу. Если просят не выкладывать, но очень хочется — ищите компромисс (убрать упоминание фирмы клиента, выложить лишь часть и т.п.).

    Если запрет прописан в договоре, то нельзя выкладывать.

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

    Jacen11
    @Jacen11
    ссылку на файл указывают в бд
    Ответ написан
    Комментировать
  • Как сложить значения с одинаковым классом js?

    politon
    @politon
    HTML5,CSS3,JS,PHP,SQL,API,canvas,animation...
    let elements = document.querySelectorAll('.right-form-calculator__cost');
    const totalSum = [...elements].reduce((sum, current) => {
      return sum + parseFloat(current.innerText);
    }, 0);
    let calculator__sum = document.querySelector('.right-form-calculator__sum');
    calculator__sum.innerHTML = 'Сумма '+totalSum+' руб'
    Ответ написан
    3 комментария
  • Как грамотно сделать обработку ислючений в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Структура проекта какая-то странная, в нем, судя по всему, контроллером называется роутер, но на этом я останавливаться не буду, обработка исключений от этого не зависит.

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

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

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

    2. Системные ошибки обрабатывает глобальный обработчик исключений, логируя саму ошибку, а на клиент отправляя статус 500 и какое-нибудь абстрактное сообщение о проблеме на сервере. Это самое важное в системных исключениях - текст ошибки никогда, не при каких обстоятельствах не уходит наружу.

    Пример такого исключения - когда запрос в БД порождает ошибку.

    3. Пользовательские исключения, там где они нужны, обычно обрабатываются по месту, но есть нюансы.
    Собственно, под обработкой исключений часто понимают два разных действия:
    - собственно обработку, когда программа совершает какие-то действия, чтобы нивелировать негативный эффект. Например, если не удалось подключение к какому-то сервису, то либо попробовать подключиться к другому, либо просто подождать и попробовать снова.
    - простое информирование пользователя

    Для информирования можно действительно ловить исключение через try..catch и писать какое-то свое сообщение.
    Но можно и автоматизировать этот процесс, вот две статьи, которые показывают примеры, как это можно сделать:
    https://angelovdejan.me/2022/11/24/centralized-exc...
    https://habr.com/ru/articles/688202/
    Ответ написан
    Комментировать
  • Как сделать диаграмму полукругом?

    Stalker_RED
    @Stalker_RED
    Простая дуга в SVG
    Длина закрашенной части это радиус * π * проценты / 100.
    Если "живое" поведение не нужно, то можно выбросить весь js код с обработчиком инпута, а заранее рассчитанное число захардкодить в свойство stroke-dasharray в атрибуте фигуры или в css.
    Ответ написан
    Комментировать
  • Как работает htmlspecialchars()?

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

    Эта функция заменяет спецсимволы, которые являются управляющими в контексте HTML, на безобидные HTML-сущности. Вот и всё.
    Чисто визуально управляющие символы будут выглядеть так же, как и должны, но в коде не будут представлять ни малейшей опасности.

    Для XSS важно, будут ли экранироваться одинарные кавычки или нет, если одинарные кавычки используются для ограничения атрибута.
    Пример

    <?php $name = "' onclick='alert(\"pwned!\")"; ?>
    <input value="<?=htmlspecialchars($name) ?>"> Не важно. Весь текст так и заключен в двойные кавычки
    <input value='<?=htmlspecialchars($name) ?>'> Важно. Закрыли одинарную, вписываем, что хотим

    Во втором случае этот код отрендерится, как
    <input value='' onclick='alert(&quot;pwned!&quot;)'>
    (но при этом &quot; отрендерятся в двойные кавычки, и в onclick будет уже валидный яваскрипт
    alert("pwned!")

    А с взведенным флагом ENT_QUOTES мы получим
    <input value='&#039; onclick=&#039;alert(&quot;pwned!&quot;)'>

    И хотя значение внутри атрибута отрендерится, как ' onclick='alert("pwned!"), но оно все целиком будет внутри атрибута value.

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

    К счастью, РНР уже позаботился о вас и ваших друзьях. Начиная с версии 8.1, флаг ENT_QUOTES ставится по умолчанию. И приведенный выше пример будет работать только на устаревших версиях. Так что ручное добавление уже уходит в область легаси-практик.

    Чтобы не ломать пальцы, каждый раз набирая всё это htmlspecialchars ENT_QUOTES, толковые джуны всегда пишут пользовательскую функцию-макрос, типа
    function esc($var) {
        return htmlspecialchars($var, ENT_QUOTES);
    }

    Правда, надолго с этой функцией не задерживаются, потому что она годится только при обучении. А любой проект сложнее, чем домашняя страничка про любимого котика, в обязательном порядке уже должен для вывода использовать специальный шаблонизатор, например Twig. Где весь вывод идет с помощью специального оператора, который уже по умолчанию экранирует HTML
    <input value="{{$name}}"> Не важно. Все уже проэкранировано до нас

    Важно помнить, что это экранирование работает только в контексте HTML.
    Если выводим данные внутри кода яваскрипт, то htmlspecialchars поможет как мертвому припарки. И в этом случае надо использовать json_encode.

    Ну и разумеется, надо не забывать комбинировать все варианты экранирования.
    Например, код яваскрипт, который пишется в атрибут HTML тега, надо весь целиком экранировать c с помощью htmlspecialchars. А данные для этого кода - c с помощью json_encode:
    <button onclick="<?= htmlspecialchars("window.open(".json_encode($name).")", ENT_QUOTES) ?>">
    Ответ написан
    2 комментария
  • 123456789123456?

    DanArst
    @DanArst Куратор тега CSS
    Гриффиндор в моде при любой погоде!
    Ну дык flex-контейнер у вас div.server-header, а его дочерние элементы - это div без класса и div.server-item.
    Так вот Nomad List и стрелка находятся внутри div-а без класса. Каким образом к ним должен применяться flex, если у их родителя нет таких стилей?
    Научитесь пользоваться DevTools - смотрите исходный код и стили и все встанет на свои места.
    Ответ написан
    Комментировать
  • Мне кажется или Map странно себя ведёт?

    @Scream034
    Новичок в разработке
    Это происходит потому, что в JavaScript массивы и объекты являются ссылочными типами данных, а не примитивными. Когда вы создаете массив key и добавляете его в Map, вы сохраняете ссылку на этот массив в качестве ключа. При попытке получить значение из Map по ключу [1, 2], вы создаете новый массив [1, 2], который уже не равен массиву key, сохраненному в Map. Поэтому вы получаете
    undefined. Верно объяснил?
    Ответ написан
    1 комментарий
  • Как организовать хранение своих наработок и полезных кусков кода, инструкций?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Шикарный сервис посоветовал akelsey

    Тем не менее, когда-то тоже столкнулся с такой задачей. Решением было сделать сайт на базе WordPress.
    Для меня это очень удобно, так как WP расширятся в любом направлении и поддерживает то, что мне нужно. Из перечисленного вами там уже есть готовые теги, категории и поиск. Так же база знаний для вас self-hosted, что бывает важно. Для форматирования кода есть готовые плагины. Часть статей можно сделать общедоступными, чтобы помочь другим. Подобные сайты вы наверняка находили в интернете уже уйму раз.

    Но вариант не из простых, конечно же. Больше как альтернатива. Конкуренцию с Notion или Joplin выдержать сложно.
    Ответ написан
    1 комментарий
  • Как организовать хранение своих наработок и полезных кусков кода, инструкций?

    akelsey
    @akelsey
    Использую joplin, есть на всех платформах, работает без сервера, один бинарь, локально либо синхронизироваться в облака, использует markdown, поиск.
    Ответ написан
    Комментировать