• Зачем в современном php фреймворки?

    Ну вот вы сами себе противоречите
    плохо не использовать фреймворки в современном php?

    наш микро фреймворк документирован

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

    Ну а на Ваш вопрос - Зачем в современном php фреймворки можно ответить очень просто - А зачем Вы в процессе разработки создали свой микрофреймворк?
    Ответ написан
    Комментировать
  • Как внутри программы определить куда вывод идет в терминал или в файл?

    @lil_Toady
    Автор заметил что вывод разный, то что он сам направил вывод в файл он в курсе :)

    Узнать пишем ли мы в терминал можно так:
    isatty(fileno(stdout));

    istty находится в io.h, а fileno в stdio.h

    И ls, действительно смотрит если вывод в терминал - то в одну строку, иначе - в несколько:
    https://github.com/coreutils/coreutils/blob/master...
    Ответ написан
    Комментировать
  • Может ли тег быть частью вопроса?

    Moskus
    @Moskus
    Какой-то свирепый поток сознания.
    Теги на Тостере используются для выборки, поиска, подписок. Иногда они уточняют контекст. Например, если кто-то спрашивает про регулярное выражение, а теги прописал "RegEx", "PHP" - тогда сразу понятно, о каком синтаксисе речь.
    Однако, если вопрос про селектор CSS, из текста вопроса не следует никакой контекст, а в тегах, внезапно, "Блокировка рекламы", сходу догадаться о том, что речь о CSS-подобном синтаксисе uBlock - весьма сложно. Потому этот тег выглядит ошибочным, лишним.
    Дублировать теги в тексте вопроса - не нужно. А вот формулировать вопрос так, чтобы было понятно, о какой конкретно задаче идёт речь - обязательно. Из хорошей формулировки и смысл тегов будет лучше ясен, так что их никто не удалит.
    А иммунитет от редактирования - это зло. В 95% случаев авторы не хотят принимать правки, это делают модераторы. Кто-то считает правки оскорбительными, кто-то считает, что лучше знает, как по-русски писать, и так далее. Один малолетний идиот мне в комментариях даже череп раскроить за правку его "шедевра" грозился. Я очень долго смеялся, но это меня дополнительно убедило, что функционал редактирования, контролируемый модераторами и кураторами, а не авторами - это очень правильно.
    Ответ написан
    4 комментария
  • Как убрать эти огромные пробелы в строке в microsoft word?

    Kalombyr
    @Kalombyr
    Вы ведь по "ширине" растягиваете, по-моему, такие пробелы и есть принцип его работы...
    Какое поведение вы ожидаете тогда?
    Ответ написан
    Комментировать
  • Чем отличается вторая форма нормализации от третьей?

    Третья нормальная форма не допускает наличия транзитивных зависимостей.

    Допустим, у нас есть БД автосалона. Имеется отношение Автомобиль(СерийныйНомер, Модель, Цена). Имеется зависимость СерийныйНомер -> Модель (т.е. для каждого авто мы всегда точно знаем модель этого авто). Также, так как у нас фирменный автосалон, а не продажа подержаных авто, цена автомобиля зависит только от его модели (т.е. все новые авто одной и той же модели будут стоить одинаково, всякие комплектации в расчёт не берем). Т.е. имеется зависимость Модель -> Цена.

    Т.к. по серийному номеру мы можем определить модель, а по модели - цену, то цена также зависит от серийного номера: СерийныйНомер -> Цена. Однако эта зависимость транзитивная: цена зависит не непосредственно (!) от СерийногоНомера, а от Модели. Следовательно, это отношение не находится в третьей нормальной форме (хотя находится во второй). Для приведения отношения в 3НФ его нужно разбить на два - МодельАвтомобиля(СерийныйНомер, Модель) и ЦенаМодели(Модель, Цена).

    Следует заметить, что если бы предметная область определяла бы иные зависимости, то и рассмотренное отношение могло быть в другой НФ. Например, если бы у нас все-таки продавались подержаные автомобили, и цену на каждый из них мы бы устанавливали отдельно, то зависимости Модель -> Цена уже б не было, а была бы прямая (нетранзитивная зависимость) СерийныйНомер -> Цена, и отношение подходило под критерии третьей нормальной формы.
    Ответ написан
    Комментировать
  • Что конкретно делает эта функция mysqli_real_escape_string()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQL инъекции, уже облажался.

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

    Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
    SELECT * FROM table WHERE name='vasya'
    Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
    SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'

    Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
    Поэтому кавычки надо экранировать.
    SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'

    никаких ошибок не выдаст.
    Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки,
    SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'

    то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
    Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений.

    Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в которых слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
    Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

    Но читатель уж сучит ножками в нетерпении - а что же SQL инъекции, о которых так долго говорили большевики? Не может же быть, чтобы они были совсем не при чем. Окей, в качестве побочного эффекта, строка, в которой экранированы спецсимволы (слеш и кавычка), не пропустит инъекцию. Но здесь следует понимать две вещи:

    1. Строки надо форматировать в любом случае, независимо от того, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна.
    2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью.

    То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

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

    В принципе, mysqli умеет так делать, но не так удобно как PDO. Поэтому при возможности вместо нее лучше использовать PDO:
    $stmt = $pdo->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->execute(["Vasya", "Д'Артаньян"]);
    $rows = $stmt->fetchAll();
    - и получить, в итоге, готовый массив с данными, которые вернула БД.
    Если же возможности нет, то кода придется написать чуть побольше
    $stmt = $mysqli->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->bind_param("ss", ...["Vasya", "Д'Артаньян"]);
    $stmt->execute();
    $rows = $stmt->fetch_all(MYSQLI_ASSOC);


    Но при этом всё равно никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. Просто, быстро, лаконично и безопасно.
    Ответ написан
    4 комментария
  • Как добыть информацию этого тега?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Кому-то двойной цикл не помогает, а кому-то и одной строки может хватить:
    print(soup.find('span', {'class': 'searchBar__mediaTabTextValue searchBar__mediaTabTotal'}).get_text())

    >>> 75

    А вообще, с таким вот:
    Нужно рабочее решение !!!!

    На соседний ресурс иди.

    А с такими вот предъявами:
    не принимаю и даю жалобу.

    Иди к маме, а не сюда. Тут ты в первую очередь просишь.
    Ответ написан
    Комментировать
  • Как правильно ставить модули через npm install в laravel?

    @dk-web
    я в свое время с jquery ui промаялся.
    в app.js
    require('../../node_modules/jqueryui/jquery-ui.min.js');
    в bootstrap.js
    window.$ = window.jQuery = require('jquery');
    window.$ = $.extend(require('jquery-ui'));

    попробуйте с вашим плагином
    Ответ написан
    Комментировать
  • Что должен знать дизайнер интерфейсов о бэкенд разработке?

    sim3x
    @sim3x
    Тот кто просто рисует - ничего
    Тот кто проектирует
    - должен понимать в общих чертах как работает его бек
    - порядки задержек при различных запросах
    - уметь находить компромис между фронтендером, бекендером и вашим интерфейсом таким образом чтоб улучшить интерфейс
    Ответ написан
    Комментировать
  • Зачем используют console.clear(); в коде?

    Зачем — чтобы красиво показать кто автор данного творения, без каких-либо варнингов или ошибок со стороны самого codepen, если они будут.
    Ответ написан
    Комментировать
  • Почему не срабатывает .env файл laravel 5.8?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    MIX_PUSHER_APP_KEY

    PUSHER_APP_KEY=...


    Казалось бы, что здесь не так?
    Ответ написан
    1 комментарий
  • Я - новичок и меня интересуют вопросы связанные с созданием сайта. Как получить,хороший сайт?

    lukoie
    @lukoie
    КАЖДЫЙ такой вопрос нужно решать по отдельности и пошагово.
    Нельзя вот так взять и выдать список ответов на все вопросы, которые у Вам могли бы возникнуть.
    Вопросы работы с БД это не совсем то же, что Вы делали до того, с хтмл.
    Это, как минимум, пхп нужно уметь. Гуглить по термину PDO
    А SEO это вообще отдельная область знаний. Но в общем и целом, забейте свой сайт на сайте web.dev и там получите ответы что Вам нужно исправлять.
    Ответ написан
    Комментировать
  • Как правильно верстать сайт с арабскими и хинди языком?

    @Flying
    Поскольку недавно пришлось добавлять в одном проекте арабский язык - поделюсь полученным опытом:

    Вёрстку как правило переделывать не нужно, обычно достаточно изменения стилей, но только в случае если сам сайт свёрстан с применением современных техник, в первую очередь flexbox. Если у вас там float'ы или таблицы - то ой, задача по сложности вырастет на пару порядков и почти наверняка не обойдётся без доработки html кода. Если же в этом аспекте всё в порядке и ваш проект построен на flexbox - то основная масса изменений сводится к одной строчке CSS:
    body {
        direction: rtl;
    }

    это "перевернёт" все горизонтальные flexbox'ы и по сути сделает за вас всю основную массу работы по адаптированию сайта к RTL языкам. Конечно, в зависимости от того как именно у вас будет подключаться стиль (отдельные стили для RTL или только патч или всё вместе) реальный селектор может быть, к примеру html[dir=rtl] + body, но это уже детали.

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

    1. Горизонтальные отступы. Это самая большая часть работы по адаптации т.к. вам необходимо будет "перевернуть" и их тоже, заменив, к примеру, margin-left на margin-right и наоборот, то же самое для padding'а
    2. Абсолютное / относительное позиционирование в горизонтальной плоскости. Речь идёт о свойствах left и right, их, как можно догадаться, тоже необходимо поменять местами
    3. Размеры шрифтов. Поскольку, к примеру, арабский шрифт, обычно выглядит меньше и тоньше чем, к примеру, английский - возможно возникнет потребность увеличить размеры шрифтов (font-size, line-height) и, возможно, подстроить стилизацию (font-weight)
    4. text-align - в ряде ситуаций может потребоваться изменить его на противоположный
    5. :first-child и :last-child, стоит быть внимательным и перепроверить корректность получаемого результата, к примеру если к этим псевдо-элементам добавляется дополнительный отступ - вам, возможно, придётся менять местами и селекторы
    6. Нужно адаптировать визуальные элементы содержащие направление, к примеру стрелки / уголки и т.п. В ряде случаев их можно повернуть, но где-то необходимо будет рисовать отдельную версию


    Если вы используете CSS препроцессоры - то я очень рекомендую написать mixin'ы для рендера этих свойств и адаптировать код таким образом чтобы изменяющиеся стили рендерились через них. Я выложил набор mixin'ов которые использовал в своём проекте, среди них нет mixin'ов для отступов и шрифтов т.к. у меня эти вопросы решаются по-другому, но думаю что там не будет ничего сложного.

    Общая схема адаптации которую я использовал в проекте:
    1. Добавление direction: rtl
    2. "Переворачивание" отступов, это самая большая часть работы т.к. они чаще всего встречаются
    3. Проверка вёрстки, для каждого выпавшего элемента добавление патчей с использованием mixin'ов, ссылку на которые я дал выше
    4. Подбор изменений для шрифтов, адаптация шрифтовых параметров


    Пример выдернутого наудачу из проекта куска для демонстрации патчей, это стиль добавления иконки к строке текста, для RTL языка её нужно было опускать ниже:
    &.with-icon {
        $icon-size: 1.85em;
        @include offset(h $icon-size 0);
    
        &:before {
            // Позиция иконки меняется на противоположную
            @include hpos($left: -1em, $auto: true);
            font-size: $icon-size;
            // Подстраивается высота иконки относительно текста
            @include ltr() {
                top: 45%;
            }
            @include rtl() {
                top: 65%;
                // Стоит обратить внимание что для RTL языков иконка дополнительно переворачивается, 
                // там стрелка, так что работает нормально, но в других местах это может быть по-другому
                transform: translateY(-50%) rotate(180deg);     
            }
        }
    }


    Надеюсь это описание будет полезным :)
    Ответ написан
    2 комментария
  • Как переместить в конец массива элементы имеющие определённое свойство?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Можно при помощи sort
    arr.sort((a, b) => !b.pos - !a.pos)
    UPD: лучше вот так
    arr.sort((a, b) => ('pos' in a) - ('pos' in b))
    чтобы не было проблем с значениями false, undefined, null и.т.д.
    Ответ написан
    1 комментарий
  • Когда нужно использовать асинхронные запросы а когда синхронные?

    Lynn
    @Lynn
    nginx, js, css
    Очень просто.
    Асинхронные всегда.
    Синхронные никогда.

    https://developer.mozilla.org/ru/docs/Web/API/XMLH...
    [...] В основном предпочтительно использовать асинхронные запросы вместо синхронных из-за соображений производительности.

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


    Новомодный fetch вообще не имеет синхронной версии и даже старый добрый XHR сильно ограничен.
    Ответ написан
    7 комментариев
  • Наговнокодил, на сколько все плачевно?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    select "valid" as a from personal WHERE '1'='1' or '1'='2' and '3'='4'
    вернет все записи.
    это я к чему,
    если есть в базе пользователь с емайлом или телефоном, то пароль в вашем варианте можно вводит любой.
    нужны скобки
    (email = or phone= ) and password=
    Ответ написан
    Комментировать
  • Запись больших xml в MYSQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Жжжуть. Делать выборку в цикле для каждой строки, да ещё и генерируя каждый раз запрос - это, наверно, худший из возможных вариантов.
    В таблицу `products` добавляете колонку `price`. Вешаете на эту таблицу триггеры на вставку и изменение строки, которые при добавлении или изменении цены заносят её в таблицу `prices`. Напрямую с таблицей `prices` из этого скрипта не работаете.
    В цикле формируете и накапливаете наборы данных для вставки. Как только накопится некоторое количество, вставляете их одним запросом. Используете ON DUPLICATE KEY UPDATE для перезаписи изменённых значений. По окончании цикла выгружаете оставшиеся наборы.
    Примерно так
    $data = [];
    while ($z->name === 'offer') {
      ...
      $data[] = '("'.$id.'","'.htmlspecialchars(urldecode($url)).'","'.$today.'",'.(int)$price.')';
      if (count($data) > 99) {
        $sql = 'INSERT INTO `products` (`id`,`url`,`date`,`price`) VALUES ' 
             . implode(',', $data)
             . 'ON DUPLICATE KEY UPDATE `url` = VALUES(`url`), `price` = VALUES(`price`)';
        mysqli_query($link6,$sql);
        $data = [];
      }
      ...
    }
    if (count($data) > 0) {
      $sql = 'INSERT INTO `products` (`id`,`url`,`date`,`price`) VALUES ' 
           . implode(',', $data)
           . 'ON DUPLICATE KEY UPDATE `url` = VALUES(`url`), `price` = VALUES(`price`)';
      mysqli_query($link6,$sql);
    }
    Ответ написан
  • Можно ли иметь "лишний" ID в URL REST API?

    @luna3956
    Даже если пользователи привязаны к магазинам, то раз Вы допускаете возможность использования /users/:userId, предполагаю, идентификаторы пользователей уникальны не только в пределах магазина, но и всей системы. В таком случае, уровень /shops/:shopId будет лишним в задаче изменения информации о пользователе, даже если у пользователя есть привязка к магазину в плоскости бизнес-логики. Поэтому, используйте /users/:userId.
    Ответ написан
    Комментировать