• Чем делать резервную копию Windows?

    delphinpro
    @delphinpro
    frontend developer
    Важные файлы на яндекс-диске.
    Рабочие проекты на гитхабе/гитлабе.
    А саму систему нафига бэкапить? Она у меня на днях в первый раз за 8 лет рухнула. Ну накатил по новой и фиг с ней.
    Ответ написан
  • Как вывести строку по id php ?id=1?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос хороший, но здесь мы упираемся в главную беду пхп - ВСЕ учебники в интернете, и особенно видео - показывают как писать адов говнокод из прошлого века.

    1. Получение значения из адресной строки

    Чтобы получить значение переменной, которую передали в строке запроса (это то что после знака вопроса), надо обратиться к переменной $_GET

    То есть в данном случае можно написать $id = $_GET['id']. Имя получаемой переменной ($id) может быть любым и не обязательно совпадать с переданным значением. А вот в индекс массива $_GET разумеется надо писать именно то имя, которое в адресной строке. То есть если site.com/?id=1 то в $_GET['id'] будет значение 1.

    2. Валидация данных

    Далее очень желательно проверить, что мы в переменной получили то что хотели, а так же что мы вообще хоть что-то получили.

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

    Затем, поскольку id может быть только целым числом больше нуля, то лучше проверить и это тоже и тоже выдать ошибку.

    3. Соединение с БД.

    в "config.php" должно быть написано не то что там сейчас а вот это (со своими параметрами подключения разумеется)
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");


    4. SQL

    Запрос, который нам нужен, выглядит так:
    SELECT * FROM `product` WHERE id=1

    5. Выполнение запроса в РНР

    Но разумеется вместо 1 надо подставить значение переменной.
    Это самое сложное. Но надо один раз выучить и потом везде применять

    Важно, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    1. Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    2. Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    3. Привязать переменные к запросу.
    4. Выполнить подготовленный ранее запрос с помощью с помощью execute()
    5. Получить результат запроса через get_result()
    6. и дальше конкретную строку из БД с помощью уже знакомой fetch_assoc


    В коде это будет так
    $sql = "SELECT * FROM `product` WHERE id=?";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    6. Вывод данных.

    Важно понимать, что в момент вывода данных никакой работы с БД уже быть не должно!
    Должны быть только переменные РНР с уже полученными данными.
    Ответ написан
    1 комментарий
  • Как взламывают бд крупных компаний?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Взламывают точно так же как и мелкие.
    В статье описана обычная SQL инъекция, когда данные подставляются прямо в SQL запрос.

    Я просто сомневаюсь, что valve может нанять таких людей в backend

    Не надо сомневаться.
    Нету никаких "особенных способов взлома".
    А есть такое явление как "эффективные менеджеры". У которых размер премии зависит от того, сколько денег они сэкономили акционерам.

    Если бы там были подготовленные выражения, то и взлома бы не было.
    Но вместо подготовленных выражений в больших компаниях есть эффективные менеджеры. Которые экономят на нормальных программистах, и заказывают разработку в Индии, в штате Бангалор. Где живет какой-нибудь Хамишь Кумар, который родился в касте вычерпывателей говна из сортиров. И вот у него только один шанс не черпать говно всю жизнь - всеми правдами и неправдами научиться программировать, путь даже за еду. Сравниваем с силиконовым программером с запросами $250k в месяц. Экономия налицо!

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

    1. данные подставляем в запрос только через плейсхолдеры
    2. идентификаторы и ключевые слова подставляем только из белого списка, прописанного в нашем коде.


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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вам просто нужно на хостинге поднять свою собственную почту и уже его использовать для отправки. Ну а для ленивых есть уведомления через телеграм, отправлять которые самому себе можно без ограничений.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы при наведении на отдельную квартиру (path) менялся стиль ссылки, соответствующей этой квартире?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Из data-атрибута получать номер квартиры. По нему выбирать и path и элемент списка:

    Подробнее.
    Интересуют события, когда мышка наезжает на path или на элемент списка, и когда уезжает.

    И у path и у элементов списка у каждого в дата-атрибуте data-flat записан номер квартиры.
    Когда происходит событие, надо:
    1. получить из data-атрибута номер квартиры
    2. переключить класс active (включить или выключить его, в зависимости от типа события

    Зная номер квартиры, можно выбрать элементы, у которых атрибут data-flat совпадает с этим номером. Для этого используется селектор [data-flat="42"]
    Ответ написан
    4 комментария
  • Какое регулярное выражение использовать для получения части строки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не надо никаких регулярных выражений:

    str.split('=').pop()
    // или
    str.slice(str.indexOf('=') + 1)

    Но, конечно, можно и регулярками:

    str.replace(/[^=]*=/, '')
    // или
    str.match(/(?<==).*/)[0]
    // или
    /[^=]*$/.exec(str).shift()

    А вообще, учитывая, чем является эта строка, и что вы хотите из неё получить:

    new URLSearchParams(str).get('sort')
    Ответ написан
    1 комментарий
  • Как составить регулярное выражение?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    3 комментария
  • Как сделать чтобы input и label работали без id и for?

    0xD34F
    @0xD34F
    Пробовал input в label положить вообще не помогает

    помогает
    Ответ написан
    Комментировать
  • Какие более короткие варианты, или альтернативы деструктрирующего присваивания?

    profesor08
    @profesor08 Куратор тега JavaScript
    Но что делать, если элементов много?

    Если есть такая потребность, то скорее всего ты что-то делаешь не так. Лучше попробуй подумать как обработать свой массив иначе.

    осторожно говнокод

    либо подложить кому-то свинью
    const arr = [1,2,3,4,5,6,7,8,9,10];
    
    arr.forEach((value, index) => {
      window[`elem_${index}`] = value;
    })
    
    console.log(elem_1); // 1
    console.log(elem_2); // 2

    Ответ написан
    6 комментариев
  • Как в php немедленно выводить данные?

    @Vitsliputsli
    То что вы хотите не нужно делать через http, либо используйте web-socket, либо полностью перетащите этот функционал на фронт. Http предназначен для получения данных, а не отправки команд-сигналов с сервера. Манипуляции с ajax или переполнением буфера - также будут извращением.
    Ответ написан
    1 комментарий
  • Как скрыть карту сайта от публичного доступа через NGINX или Cloudflare?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Разница между поисковым роботом и обычным браузером - только в юзерагенте, который легко подделать. Можно, конечно, добавить ещё и проверку принадлежности IP-адресов поисковым компаниям... но зачем, в целом? То, что проиндексировано гуглом - можно в нём легко найти.
    Ответ написан
    9 комментариев
  • Как выбрать элемент массива в зависимости от рейтинга?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Второй вариант – то, что надо. Остаётся получить случайное от 0 до 4 (с равномерным распределением) и взять соотв. имя. У Ивана шансов как раз 3/5.

    Upd.
    function getRandomWinner($ppl)
    {
      $choice = rand(0, array_sum(array_values($ppl)) - 1);
    
      $sum = 0;
      foreach($ppl as $name => $rank) {
        $sum += $rank;
        if ($choice < $sum) return $name;
      }
    }
    
    $winnerName = getRandomWinner([
      'Иван' => 60,
      'Максим' => 20,
      'Вова' => 20,
    ]);
    Ответ написан
  • Как настроить nginx на проксирование по двум портам?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    можно-ли как-то настроить проксирование на второй порт, пробовал добавить второй локейшн, но это не работает.

    Можно, именно так это и работает - в разных серверных блоках/локейшенах указываете разные proxy_pass`ы. Пробуйте ещё.
    Ответ написан
    Комментировать
  • Че он на элемент не нажимает?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ну короче типа внатуре getElementsByClassName возвращает как бы коллекцию элементов, а у коллекции, мамой клянусь, свойства childNodes нет.

    По секрету, братиш, вот: document.querySelector('.case-print')

    Ну там ещё дальше click работать не будет, но это уж самостоятельно в виде домашнего задания.
    Ответ написан
    Комментировать
  • Как красиво/правильно скомбинировать значения из двух массивов, один из которых короче?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    У вас вполне хороший код. Можно чуть изменить, полагаясь на то, что именно второй массив короче первого:
    $result = [];
    $limit = count($arr2);
    foreach ($arr1 as $index => $item) {
        $result[] = $item . $arr2[$index % $limit];
    }


    Или короче, хуже, менее читаемо:
    Ацкий однострочник
    $result = array_map(function($item, $i) use ($arr2) {return $item . $arr2[$i % count($arr2)];}, $arr1, array_keys($arr1));
    Ответ написан
    9 комментариев
  • Как можно сократить данный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если бы был порядок и полное совпадение имен переменных и классов, можно часть сократить так:
    const buttons = {};
    'all,love,chef,girl,boy,grandma,grandpa'
      .split(',').forEach((name) => buttons[name] = menuWrapper.querySelector('.' + name));
    Использовать потом, например, вместо girlButtonbuttons.girl
    Ответ написан
    Комментировать
  • Как реализованы анимации при скролле на сайте?

    @YahorDanchanka
    Frontend developer
    Вот пример подобной анимации, меняется одна css переменная, от которой все отталкивается.


    Из ответа
    Ответ написан
    Комментировать
  • Как сделать умножение в Select?

    egor_nullptr
    @egor_nullptr
    select *, price * (73 - (72 * valuta)) as price_in_rub
    from ...
    where ...
    Ответ написан
    4 комментария
  • Как узнать последнюю цифру числа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Для целых чисел все просто, как уже верно заметил Stalker_RED достаточно взять остаток от деления на 10n % 10
    Но вот с дробными числами все намного интереснее. Потенциально, можно получить целое представление последовательно умножая число на 10 (сдвигая тем самым десятичную точку вправо), а после воспользоваться предыдущим приемом. Но проблема тут в том, что потенциально такая последовательность может оказаться бесконечной и такой алгоритм зациклится.
    Если обратится к стандарту IEEE 754, то можно узнать, что в 64 битах можно точно представить не более 16 десятичных разрядов, а это уже можно использовать как ограничитель, так как при превышении 16 сдвигов десятичной точки значение все равно уже не будет точным
    const lastDigit = n => {
        // в n совсем не то
        if (isNaN(n) || !isFinite(n)) return NaN;
        // в n целое
        if (n % 1 === 0) return n % 10;
        // для дробных проще со строкой работать
        const s = String(Math.abs(n));
        // неточные значения
        if (s.length > 16 || s.includes('e')) return NaN;
        return +s.slice(-1);
    }
    Ответ написан
    Комментировать
  • Как узнать последнюю цифру числа?

    Stalker_RED
    @Stalker_RED
    Последняя цифра - это остаток при делении на 10.
    const lastDigit = 765 % 10; // -> 5
    Ответ написан
    5 комментариев