Задать вопрос
  • Какой способ лучше защитит пароль?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Первый вариант, разумеется, вообще ни о чём.

    Есть три вектора атаки на пароли: перебор по радужным таблицам, брутфорс и подбор по словарю.
    От первого защищает соль, от второго алгоритм, от третьего сложность пароля.

    У нас здесь речь идет об алгоритме. То есть, о буртфорсе. Что такое брутфорс? Это тупо подстановка случайных сочетаний символов по очереди и проверка, не совпал ли хэш. Чем быстрее вычисляется хэш, тем быстрее раскалывается пароль.
    ПОЭТОМУ, ключевой характеристикой хэша для паролей является сложность его вычисления.
    Твой ша-пицот-двенадцать выплоненный стопицот раз - это для современной техники как воробей чихнул. А для будущей и подавно.
    Поэтому умные люди придумали алгоритмы которые во-первых вычисляют каждый хэш гораздо медленнее, а во вторых адаптируются под растующую скорость процессоров, и говорят тебе когда пора уже усложнять алгоритм. Именно этим и занимаются встроенные функции, и поэтому ты должен использовать именно их.
    Ответ написан
    Комментировать
  • Php+Mysql. Минимизация кл-во запросов, для подсчета просмотров, как?

    @Stalinko
    PHP'шник и фрилансер до мозга костей
    А зачем делать 20 UPDATE запросов, если можно сделать 1 запрос? :)

    Просто указать все ID списком:
    UPDATE posts SET views = views + 1 WHERE id IN (1,2,3,5)
    Ответ написан
    2 комментария
  • Как избавится от двойной отправки формы, методом POST?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. отправлять форму через XHR / fetch (ajax post).
    2. редирект после отправки формы - типовое и надёжное решение
    3. можно сохранять в сессию последнюю отправленную форму. и если видим дубликат данных то игнорировать этот post-запрос.

    Если редирект "не помогает" то прошу в студию минимальный пример кода где у вас форма + страница которая после получения формы делает редирект, а мы проверим правда ли "не помогает".
    Ответ написан
    3 комментария
  • Есть ли ограничения на количество файлов и папок на php-хостингах?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    БД на файлах называется SQLite и не надо изобретать ничего другого
    расширение для работы с sqlite встроено в РНР начиная ещё с версии 5.3, кажется
    почитать про inodes
    Ответ написан
    Комментировать
  • Наставничество для создания своего сайта: неужели только платные варианты?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Я бы на вашем месте поискал наставника самостоятельно. Здесь, на behance, в телеграм-чатах найдите несколько человек, чьи работы вам действительно нравятся и того уровня, которого вы хотите добиться и просто напишите им просьбу о помощи

    Да, кто-то вам ответит, что его/ее консультации платные, но в основном людям нравится, когда их считают экспертами и ценят мнение, поэтому, я уверен, что большинство вам поможет советом совершенно бесплатно

    Крайне желательно иметь сформулированный список вопросов, а на дизайн и фронтенд лучше искать разных людей
    Ответ написан
    Комментировать
  • Как поставить перенос строки в функции mail?

    @alexalexes
    https://www.php.net/manual/ru/function.mail.php
    Читайте документацию:
    Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
    Ответ написан
    Комментировать
  • Как поставить перенос строки в функции mail?

    @Giperoglif
    PHP_EOL
    Ответ написан
    Комментировать
  • Что это за ошибка (blocked by CORS policy)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    сайт.ру и www.сайт.ру - это два разных сайта. Естественно, что запросы с одного к ресурсам другого будут работать только при соблюдении политики CORS.
    Ответ написан
    4 комментария
  • Возможно ли закешировать около 1 гб в браузере?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Возможно конечно. Для хранения больших объемов данных в браузерах существует встроенная БД IndexedDB.

    Для работы с ней сначала подключаем специальную библиотеку, которая упрощает ввод и вывод:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.js"></script>

    Далее, чтобы сохранить какие-то данные выполняем в консоли браузера:
    result = await localforage.setItem('key', save_data);
    console.log('Данные успешно сохранены:');
    console.dir(result);

    Где в save_data лежат сохраняемые данные, а key это ключ по которому можно было бы получить к ним доступ.

    Из особенностей, в save_data мы можем положить любой тип данных - хоть строку, хоть массив, хоть объект. Да даже файл при желании можно сохранить! При этом нет ограничений по объему хранимых данных, можете хоть сто мегабайт, хоть триста запихнуть - встроенное хранилище все сожрет.

    Чтобы потом извлечь сохраненные данные достаточно выполнить:
    result = await localforage.getItem('key');
    console.log('Данные успешно извлечены:');
    console.dir(result);

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

    P. S. Обратите внимание, что если вы где-то в своем коде внутри функции используете слово await, то такая функция обязательно должна иметь приставку async! Иначе получите ошибку. В консоли можно использовать await в лоб, но для использования await в коде нужно, чтобы функция внутри которой она вызывается была асинхронной!!!
    Ответ написан
    4 комментария
  • Расходуются ли ресурсы на try catch?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Закономерный вопрос.
    Не научившись толком отличать 0 от false, и не научившись правильно писать elseif, каждый нуб в обязательном порядке озабочивается Вселенской Проблемой Производительности.
    "Как же так" - проснувшись одним прекрасным утром думает он - "Как только мой сайт достигнет пиковой нагрузки два посетителя в час, то начнутся стрррашные проблемы с производительностью! И надо срочно, забыв все на свете и теряя на ходу тапки, кидаться их решать!!!1111"
    Дальше выбирается любой рандомный оператор и появляется ВОПРОС: "А не слишком ли медленно ли он выполняется?!"

    И что характерно, чаще всего, как и сейчас, сам по себе оператор является бессмысленным, и вопрос должен быть не "не слишком ли он медленный?", а "на кой он вообще здесь сдался?"

    Наличие операторов в коде должно быть продиктовано не пубертатными фантазиями про "потребление ресурсов", а алгоритмом. Где оператор на своем месте - там он и должен стоять.
    В данном случае никакой трай с кетчем тут сто лет в обед не сдался, поэтому просто убрать его совсем. И всё сразу начнет летать, конечно же.

    Вот кстати я всегда говорил: то что для нормальных людей анекдот, для похапистов - суровая реальность. Каждый второй вопрос на тостере - это анекдот про "у таракана уши в ногах". Или анекдот про срочное обрезание - типичный пример XY problem. Ну или сейчас:

    Идет мент. Смотрит - фонарь стоит, под фонарем лужа, в луже мужик сидит.
    - Чё здесь делаешь?
    - Да вот, часы потерял. теперь ищу.
    Ну, мент думает - дай помогу. Искал-искал, весь перемазался - нету часов.
    - Слушай, мужик. Нету тут никаких часов!
    - Да я знаю. Я их вон там, возле забора потерял.
    - А ЧЕ ТЫ ИХ ЗДЕСЬ ИЩЕШЬ???
    - А тут светлее!


    То есть вопрос тут такой же - ставить трай кетч не там где нужно по логике, а тем где "быстрее"!
    Ответ написан
  • Как генерировать PDF в JS?

    catdesign
    @catdesign
    Веб-разработчик
    Тебе генерация массовая нужна?
    То есть сгенерировать зачем-то, я даже не могу представить зачем, сотню pdf. Или элементарно, что бы какой-нибудь менеджер нажал кнопочку скачать и ему прилетел PDF файл, например со статистикой?
    Ответ написан
    3 комментария
  • ВЕБ студия с сотрудниками фрилансерами?

    catdesign
    @catdesign
    Веб-разработчик
    1. Фрилансер - это черная дыра. Нет никаких гарантий, что вы с первого раза найдете хорошего специалиста. Вы потратите массу времени походив по рукам как портовая путана, потеряете массу времени и сил. В итоге скорее всего специалиста вы найдете, но какой ценой?

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

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

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

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Сферического фрилансера в вакууме намного тяжелее контролировать и практически невозможно привлечь к ответственности. Особенно тех, которые работают "фактически за бесплатно". При этом ваша web-студия, как юрлицо, имеет с заказчиком договор и несёт все риски. Проще говоря, пока вас будут банкротить, ваши фрилансеры будут почти бесплатно вести к тому же ещё пару-тройку таких же ловкачей.
    Ответ написан
    1 комментарий
  • Как правильно составить сложный запрос к db?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    GROUP BY, COUNT(), ORDER BY, LIMIT
    Ответ написан
    4 комментария
  • Как исправить (не выводит и не передаёт по сокету данные)?

    @Vitsliputsli
    Если вы ожидаете увидеть "OK" в переменной $read, то его там уже нет, он будет перезаписан пустой строкой (если больше нет данных, то возвращается пустая строка). Тем не менее, данные вы сохраняете в $fde, и соответственно там и надо искать "ОК".
    Ответ написан
    1 комментарий
  • Что означает ошибка Largest Contentful Paint?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    У Google есть инициатива под названием Web Vitals. Они там решили унифицировать разные метрики для сайтов, выделить что-то основное и человеко-понятное (названия, конечно, не очень интуитивные выбрали). Там сейчас есть три основных метрики:

    • LCP - Largest contentful paint. Грубо говоря это время загрузки первого экрана контента (не начала, а именно полной загрузки первого экрана, с картинками).
    • FID - First input delay. Время полной загрузки страницы, по идее со всеми скриптами, после чего можно полноценно взаимодействовать с ней.
    • CLS - Cumulative layout shift. Общая производительность, насколько быстро перерисовывается страница при изменении layout. Это не 1/FPS, но один из факторов, определяющих отзывчивость страницы, насколько она фризит или не фризит.

    Если кликнуть на синюю ленточку рядом с соответствующим пунктом, то откроется страница с более подробной информацией о том, что это такое и на что там стоит обращать внимание.
    Ответ написан
    Комментировать
  • Личный кабинет для пользователей, админка?

    Sanes
    @Sanes
    Что первое, что второе придется учить. Laravel проще и актуальней.
    Ответ написан
    Комментировать
  • Почему не работает взятие атрибута в JQuery?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    <div  modalid="1">
        <img src="https://habrastorage.org/webt/py/5i/3b/py5i3bttspsri_tolayrfgqdd_4.jpeg">
    </div>

    $('div').on('click', function openModal(){
        console.log($(this).attr('modalid'));
    })
    Ответ написан
    3 комментария
  • Как сделать подчеркивание ссылки на полную длину?

    Aetae
    @Aetae
    Тлен
    Элемент сделать блочным, отступ padding'ом, подчёркивание border'ом.
    Ответ написан
    3 комментария
  • Класс для работы с PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну конкретно этот кривоват, и не реализует все возможности PDO.
    Навскидку:
    - exit('Error connecting to database: ' . $e->getMessage()); - это позор
    - self::$sth - бессмыслица
    - function getAll - делает обрезание оригинальному методу ПДО, который умеет возвращать данные в десятках различных форматов
    - function getValue - стыд, автор не знает что в ПДО есть готовая функция для этого.

    Если говорить о таких вот одностраничниках, то я бы рекомендовал попытаться напистаь своё.
    Но судя по всему, это для тебя задача неподъемная.
    В таком случае, на твоем месте я сначала поучился работать с ванильным PDO. Это реально важно. Это надо обязательно сделать перед тем как начинать использовать всякие обертки. чтобы понимать хотя бы примерно что они там внутри себя делают. А после этого все-таки писал бы свой класс.

    В крайнем случае, ограничился бы функцией-хелпером:

    function pdo($pdo, $sql, $args = NULL)
    {
        $stmt = $pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }


    Ключевое слово здесь - return $stmt;. Оно позволяет работать с результатом запроса.

    // узнать количество строк
    $count = pdo($pdo, "SELECT count(*) FROM users WHERE role=?",[$role])->fetchColumn();
    
    // получить юзера по адресу
    $user = pdo($pdo, "SELECT * FROM users WHERE email=?", [$email])->fetch();
    
    // тупо запросить массив строк
    $data = pdo($pdo, "SELECT * FROM users WHERE salary > ?", [$salary])->fetchAll();
    
    // получить количество удаленных строк 
    $deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();
    
    // вставка
    pdo($pdo, "INSERT INTO users VALUES (null, ?,?,?)", [$name, $email, $password]);
    
    // получить массив строк в виде ключ-значение
    $indexed = pdo($pdo, "SELECT id, name FROM users")->fetchAll(PDO::FETCH_KEY_PAIR);


    Если же хочется чтобы прям как у больших пацанов, но не такое зубодробительно сложное, то https://github.com/auraphp/Aura.Sql
    Ответ написан
    Комментировать