Задать вопрос
  • Что конкретно делает эта функция 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.
    Ответ написан
    Комментировать
  • Можно ли в классе-потомке переопределить метод с новыми параметрами?

    Это противоречит LSP.

    Вот представьте, вам дали такую возможность и вы переопределили метод с новыми параметрами. Теперь у нас есть метод, который принимает Layer или даже ICreatable. Допустим так:

    void DoSomething (ICreatable layer) {
      layer.Create();
    }


    Но мы ведь можем передать потомка в этот метод! Делаем следующее и ломаем наш код:
    DoSomething(new PerlinNoiseLayer())

    Потому именно в таком виде - нет, нельзя.

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

    Это слой? - Да. - Ок, тогда посмотрим его высоты.
    Если есть такая необходимость - почему бы не ввести отдельный интерфейс для высот?

    void DoSomething (IHasHeights layer) {
      layer.Heights; // <== тут есть высоты
    }


    Почему бы не воспользоваться фабрикой или билдером? Или даже заставить передавать все эти параметры в конструктор?

    public abstract class Layer: ICreatable
    {
        float[,] Heights { get; set; }
        public abstract void Create();
    }
    
    public class PerlinNoiseLayer : Layer
    {
        private float[,] _heights;
        readonly int _resolution ;
    
        public PerlinNoiseLayer (int resolution) {
            _resolution = resolution;
        }
    
        public override void Create()
        {
            // тут расширение уже есть
        }
    }
    Ответ написан
    6 комментариев
  • Почему при парсинге сайта, не могу достать некоторые текстовые данные?

    @marxxt
    понравился ответ - поставь ✔
    Интересная задачка

    Смотрите,

    вас интересует блок

    <span data-rim="nI41sNGXnsbfvdqY"></span>

    Информация уже здесь, но сначала закодирована в base64, а потом замаскирована

    Снимаем маскировку:
    nI41sNGXnsbfvdqY -> Ni41SngxNSBFVDQy==

    Декодируем:
    base64_decode("Ni41SngxNSBFVDQy==");

    Получаем:
    6.5Jx15 ET42䀀

    Ну вот и все :)
    Ответ написан
    7 комментариев
  • Можно ли писать код на php и использовать встроенный в него шаблонизатор?

    @dimoff66
    Кратко о себе: Я есть
    Придумайте какой-нибудь проект. Напишите как-нибудь - неважно как - правильно неправильно, лишь бы работало. Сделайте свой шаблонизатор в конце концов. Потом почитайте что говорят одни и другие, примерьте на свой проект и поймете, как легче проще и удобнее. Пока весь ваш текст одна сплошная размытая абстракция.
    Ответ написан
    1 комментарий
  • Как правильно организовать работу склада?

    Jump
    @Jump
    Системный администратор со стажем.
    Хотелось бы автоматизировать весь процесс (допустим как в экзисте/емех)
    Есть очень простой базовый принцип - Если автоматизировать бардак, получиться автоматизированный бардак.

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

    И делать это должно руководство
    В смысле инициатива должна исходить именно от руководства, и под их контролем.
    Если руководству это нужно - оно это сделает.
    Если не нужно - вы ничего не сделаете.
    Просто никто ничего не будет маркировать и будет продавать без всяких штрихкодов, потому что так удобнее.
    Без учета можно без проблем себе на авто запчастями затариваться, а будет учет - уже не прокатит.
    Ответ написан
    3 комментария
  • Chart js кэширует сайт - что делать?

    lamer350
    @lamer350
    กำลังสูงสุด
    Проблема у явно в чем то другом, Chart JS тут точно ни при чем. Ищите проблему на сервере.
    Ответ написан
    Комментировать