• Какую бд лучше выбрать?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега SQL
    Седой и строгий
    Mongo почти никогда не проще использовать. Для её выбора должны быть очень веские основания.
    Ответ написан
    Комментировать
  • Переход с MD5 на SHA256 что нужно сделать чтобы работало)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Проблема решается постепенным переводом пользователей на новое хранение пароля по мере их входа в систему.
    В момент аутентификации пользователя нам известен его пароль, поэтому если новый хэш для пользователя не определён, то аутентифицируем его по старому методу, генерируем и сохраняем новый хэш, удаляем старый хэш.
    И, конечно же, надо забыть о самодельных системах хэширования и использовать стандартные password_hash и password_verify.
    Ответ написан
  • Почему картинка вставленная через picture растягивается на неопределенную ширину в firefox?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Это увлекательная история.
    Вот представьте себя на месте браузера.
    Что видите в коде:
    Картинка должна занять 100% высоты и width auto.
    Как будете рисовать высоту, если у родителя картинки высота тоже 100%, у его родителя тоже нет и т.д. до самого верха. От чего считать проценты? Вроде есть какой-то намек из top 0 и bottom 0. Не прямой, конечно, но хоть что-то.
    Теперь про ширину: написано нарисуй авто. Размер в атрибуте не задан, но можно посмотреть, что там у файла. И хотелось бы сохранить пропорции.
    Следующий этап размышлений о том, что делать с picture. Вроде надо растянуть по содержимому, но у него auto, которым и так сложно решить что делать.

    Как рисовать будете? Как догадаетесь что хотел сказать верстальщик, если у браузера нет возможности заглянуть ни к вам в голову ни в макет?

    Ну вот FF берет в качестве ширины для picture исходную ширину картинки.

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

    Как исправить:
    Вариант 1 (похуже)
    Тег picture тег с особенностями и ещё и часто не известно, будет ли он вообще в разметке или клиенты его потеряют.
    Поэтому самое умное, что можно ему задать это display: contents;, чтобы не мешался.
    И дальше работать с оберткой. Тут вариантов много. Например, задать пропорции, а картинке object-fit. Правда у FF есть проблемы с aspect-ratio от высоты.

    Вариант 2 (получше)
    Картинка, по крайней мере в примере, вообще не контентная и её можно убрать в стили (псевдоэлемент и его фон)
    Ответ написан
  • Почему запрос возвращает пустоту?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если запрос выполняется без ошибок но не возвращает ни одной строки, это значит что в БД отсутствуют данные, подходящие под указанные в запросе условия.
    Ответ написан
    Комментировать
  • Как можно решить проблему с доступам к методам PHP классов унаследованным от одного класса?

    Красиво сделать не получится. Но можно сделать так, чтобы хотя бы на тестах оно упало и показало, что нельзя так делать.

    <?php
    
    class Node
    {
        protected function func1() {
            print "NODE PARENT; ";
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {
            print "NODE A; ";
        }
    
        // Используем метод родителя внутри этого класса
        public function func1Overrided() {
            print "From parent: " . parent::func1();
        }
    
        // Переопределяем метод так, чтобы его нельзя было использовать
        protected function func1() {
            throw new \Exception("Нельзя вызывать этот метод из NodeB");
        }
    }
    
    class NodeB extends Node
    {
        // Функция инициализации
        public function onInit(NodeA $a): void
        {
            // Сделал так, чтобы не мокать api )
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Метод теперь кидает исключение, использовать не получится
            })($a);
        }
    }
    
    $nodeA = new NodeA;
    $nodeA->func1Overrided(); // Работает вызов метода funс1 из родителя
    
    $nodeB = new NodeB;
    $nodeB->onInit($nodeA); // Выдаёт ошибку, нельзя использовать метод func1 из класса NodeB


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

    Вот минимально-инвазивное решение, которое позволит и наследование сохранить (если оно прям ну вот сильно надо), и решить проблему при помощи композиции, основанной на трейте.

    <?php
    // Делаем общий трейт для всех классов
    trait Func1 {
        private function func1() {
            print "FUNC1; ";
        }
    }
    
    class Node
    {
        // Включаем трейт
        use Func1;
    }
    
    class NodeA extends Node
    {
        // Включаем трейт
        use Func1;
    
        public function FUNC2() {
            print "FUNC 2 NODEA; ";
        }
    }
    
    class NodeB extends Node
    {
        // Включаем трейт
        use Func1;
    
        // Функция инициализации
        public function onInit(NodeA $a): void
        {
            // Добавить зависимость
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Метод использовать не получится, т.к. он private
            })($a);
        }
    }
    
    $nodeA = new NodeA;
    
    $nodeB = new NodeB;
    $nodeB->onInit($nodeA); // Выдаёт ошибку, нельзя использовать метод func1 из класса NodeB
    Ответ написан
  • Как работать с блоками HTML?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    В данном случае – изучить документацию Bootstrap
    Если что-то непонятно будет, то тогда и задавать конкретные вопросы
    Ответ написан
    1 комментарий
  • Какую библиотеку для PHP 8 можно использовать для редактирования метадаты в PDF файлах?

    Adamos
    @Adamos
    Ghostscript через командную строку. Он все равно должен быть установлен, чтобы работать с PDF.
    Ответ написан
    9 комментариев
  • Как исправить Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :max?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. В PostrgeSQL используется синтаксис
    [ LIMIT { number | ALL } ] [ OFFSET number ]
    2. Нельзя передавать в запрос параметры, для которых в запросе нет плейсхолдеров.
    Ответ написан
    1 комментарий
  • Какие особенности разработки сайтов под тор/даркнет?

    vabka
    @vabka Куратор тега Веб-разработка
    Токсичный шарпист
    Никаких особенностей нет - это точно такие же сайты.
    Мб максимум - стоит попытаться реализовать их без js, тк в том же Тор браузере изначально стоит расширение, которое отключает js
    Ответ написан
    1 комментарий
  • Google Consent Mode v2 / режим согласия Google v2 как установить?

    @lotse8
    Ставить нужно обязательно. У Google есть список доверенных платформ, с которыми он работает.
    Вот бесплатный вариант до 5000 просмотров в месяц, дальше 12 евро/мес. - цены ниже на странице, написано все на русском, можно язык переключить
    https://www.consentmanager.ru/%d0%b8%d0%b7%d0%b4%d...
    Поставьте срочно этот, а потом, если желание будет разбираться и свой писать, то разбирайтесь. Удачи.
    Ответ написан
    Комментировать
  • Работа с api/hash или как правильно защитить http/fetch запросы на сайте?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Лучший (и единственный) вариант - работать через свой бэкенд и нигде никогда не светить ключи от посторонних API. На своём бэке вы можете вводить любые ограничения на частоту и количество запросов к чужому API.
    Всё, что попадает к клиенту, или приходит от клиента - небезопасно по умолчанию.
    А Restrict to domain вам не поможет, в браузере можно написать JS-код, который будет работать с вашим ID прямо на вашей же странице и массово генерировать запросы.
    Ответ написан
    8 комментариев
  • Почему выводится текст вместо QR кода?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Ничего не понял из того на чем вы это делаете, но
    qr('{$product.name')}
    скобка - апостроф - фигурная
    а справа идут не в обратном порядке
    Ответ написан
    Комментировать
  • Как составить запрос на экспорт таблицы БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Выгружаемые запросом данные - это именно данные. Сведения о структуре выходного набора - это метаданные. Получить одновременно их в одном запросе в общем не получится.

    Возможное решение - UNION ALL двух запросов. Первый - получающий список полей таблицы из INFORMATION_SCHEMA.COLUMNS в виде CSV, второй - собственно показанный запрос. Поскольку UNION ALL не перемешивает выходные записи, получится вроде бы то, что нужно.

    Однако есть грабли. Невидимые вычисляемые столбцы. Они будут присутствовать в списке полей, но не в наборе данных.

    См. fiddle
    Ответ написан
    Комментировать
  • Как исправить "Input string was not in a correct format."?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Полагаю, вы хотели подставить между знаками процента значение из поля ввода (txtSearch.Text), которое передается в string.Format? В таком случае надо между фигурным скобками подставить порядковый номер параметра (он начинается с 0): string.Format("%{0}%", txtSearch.Text)

    PS Из соображений безопасности (чтобы избежать SQL-инъекции) крайне не рекомендуется напрямую копировать в строку запроса сырые, непроверенные, данные из ввода пользователя - а вы сделали именно так. В учебной задаче это допустимо, но лучше сразу привыкать делать по уму: например, использовать в строке запроса параметры и передавать ввод через них.
    Ответ написан
    Комментировать
  • После регистрации пользователь в базу таблицы users не попадает..В чем проблема?

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

    Во-первых, при создании соединения с БД, надо сказать ПДО, чтобы он сообщал об ошибках.
    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    Во-вторых, временно, на период разработки, включить отображение ошибок РНР. Чтобы тупо увидеть, если произошла какая-то ошибка.
    ini_set('display_errors', 1);

    И в-третьих, начать собственно отладку.
    Для начала убедившись, что РНР код в принципе запускается, и проблема в нем, а не в форме.
    Для этого в самом начале action.php пишем большими буквами
    die("пхп хотя бы запустился");
    И если после нажатия на кнопку мы этот текст не увидели, то начинаем тупить в свою форму - а с чего она вообще должна что-то посылать в файл action.php (и попутно задаваться вопросом - а какое отношение наш вопрос имеет к php и sql?)?
    Если форма отправляется аяксом, то смотрим ответ пхп в инструментах разработчика, вкладка Сеть.

    Если обработку формы мы начали, то заезжаем внутрь условия
    die("начали обработку формы");

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

    А в целом, конечно, код очень жестокий.
    Вот прямо хочется спросить -
    зачем здесь функция test_input?
    зачем здесь try {}catch (){echo 'Error : '.$e-getMessage();}?
    зачем class Auth extends Database?
    почему showMessage - это часть класса Database? Ну вот серьёзно, каким местом вывод сообщения в браузер в виде HTML хоть как-то относится к работе с базой данных?

    Чтобы сделать этот код минимально осмысленным, надо
    выкинуть класс Database
    в класс Auth добавить
    public function __construct($pdo){
                $this->conn = $pdo;
        }

    и выкинуть из него require_once 'config.php';

    В config.php оставить только соединение с PDO
    в action написать
    require 'config.php';
    $user = new Auth($pdo);

    и выкинуть условие при регистрации, оставив только
    $user->register($name,$email,$hpass);
    $_SESSION['user'] = $email;

    И тогда этот код станет минимально осмысленным
    Ответ написан
    Комментировать
  • Как исправить не правильное форматирование css который вставляет php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас в голове полная каша. Вы не можете понять где у вас сервер, где HTML, а где браузер.

    некоторые файлы он вставляет с форматированием , а другие нет.


    РНР не вставляет никакие файлы. Из РНР вы получаете ссылку. Её читает браузер. Который дальше и читает файл, и "вставляет" код, и форматирует его.
    При чем то, что браузер показывает в инструментах разработчика, может не иметь вообще ничего общего с тем, что на самом деле лежит в файле. Если хотите посмотреть реальное "форматирование", то надо смотреть сам файл, а не то что браузер рисует в инспекторе
    Ответ написан
    4 комментария
  • Когда нужен MVC, а когда API?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    API есть у любой программы. MVC это способ организации кода, наличия API он не исключает. Не стоит сравнивать тёплое с мягким.
    Ответ написан
    3 комментария
  • Что учесть в начале создания веб-портала и перейти с начальной версии на продвинутую без потерь? Как выбрать разработчика, структуру и платформу?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Давай начнем с вопроса - чем твой портал будет отличаться от тех сайтов на WP который ты делал раньше сразу после запуска? Через Х лет в максимальной комплектации?

    А теперь кратко по твоим вопросам

    1) Делай ссылки в виде ЧПУ и их можно будет безболезненно реализовать на любом фреймворке. Но именно на фреймворке, если на какой-то cms со своей структурой страниц, то там могут быть проблемы и прийдеться устраивать танцы с бубнами и реврайтами.

    2) Как не смешно, но для начала подойдет Wordpress если своими силами или самопис на Laravel если есть бюджет на фрилансера. Статьи и админка под них на нем делается очень быстро и бюджетно. Ну и потом можно добавить любой функционал. За основу даже можно взять мой движок (секунда рекламы) https://github.com/yepbro/cookbook делаю для своего проекта.

    3) Отзывы, адекватность в общение, неготовность работы без тз, ежедневные отчеты о статусе работ, каждый день обновляемый демо-сервер.
    Ответ написан
    Комментировать
  • Зависит ли скорость записи в БД от количества в ней записей?

    yesbro
    @yesbro
    Думаю, помогаю думать
    1. Меняется/Зависит ли как-то скорость записи в таблицу БД от количества записей в таблице?


    При добавление записи в таблицу обновляются индексы (если они там есть), так что чем больше таблица тем медленнее будет запись (если в таблицы есть индексы кроме primery key). Это можно заметить если начать добавлять большое кол-во строк (построчно) в таблицу с индексами. Сперва добавление будет идти быстро, потом все медленнее и медленнее. Один из способов борьбы с этим - пакетное добавление.
    Ответ написан
    Комментировать