Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Есть ли готовые скрипты защиты от парсеров для nginx?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И тут Грегор понял, что произошло. Эти существа не могли тушить лампы: галлюцинация не в силах воздействовать на неодушевленные предметы. Он вообразил, что в комнате становится темнее и… Он сам расстрелял свои лампы! Подсознание опять его надуло. Теперь Теневик смело шагнул вперед. Бластер был бессилен.
    Роберт Шекли, "Призрак-5"


    Прекрасный план, я считаю.
    Конкуренты за 5 минут поправят ботов, чтобы они не ловились, а вот честным посетителям и поисковикам тупой бот сильно осложнит жизнь. В итоге сайт загнется, а конкуренты будут процветать.
    Ответ написан
    5 комментариев
  • Почему я не могу печатать русские буквы в mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы сделать запрос с русскими буквами, надо заходить не под рутом, а под нормальной учетной записью.
    Под рутом в консоли будет применяться дефолтная кодировка, а до версии 8.0 это Latin1, в которой русских букв нету.

    При заходе под нормальным юзером консоль mysql автоматически подхватит текущую кодировку клиента командной строки.
    Ответ написан
    Комментировать
  • Как сверить пароли с базой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Правильный ответ
    // Достанем юзера по мылу
    $sql = 'SELECT * FROM `user` WHERE `email` = ?';
    $result = $db->prepare($sql);
    $result->execute([$email]);
    $user = $result->fetch();
    
    // потом сверим его хеш пароля с паролем из формы
    if ($user && password_verify($_POST['password'], $user['password'])) {
     echo "it's ok";
    }

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

    По поводу остальных вопросов. Есть такая штука, поисковая машина. Она помогает находить ответы на вопросы самостоятельно. Самыми популярными являются google.com и yandex.ru. И это реально работает. Просто попробуй:
    Что дают обратные апострофы в именах таблиц и полей?
    password_hash и PDO
    Ответ написан
    1 комментарий
  • Как меня вычисляет магазин?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю что fingerprint - это слишком притянуто за уши. Во-первых - ненадёжно, во-вторых - кук более чем достаточно. Зачем делать какие-то слепки, если можно просто поставить куку, а потом её прочитать?

    Но присылка на основную почту, при том что вводилась одноразовая - это сильное нарушение privacy. Фактически, это 100% спам. И в наше время почти не случается. Я бы сказал, что объяснение должно быть сильно проще.

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

    Так что никаких "слепков" и "баз данных" - все гораздо проще.
    Ответ написан
  • Почему возникает ошибка 'SQLSTATE[HY000] [2002] No such file or directory'?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Поменять localhost в конфиге на 127.0.0.1

    А лучше поменять "новый хостинг" на нормальный, с пряморукими админами.
    Ответ написан
    Комментировать
  • Как переделать запрос под Prepared Statement?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    сначала пишем волшебную функцию
    function pdo($db, $sql, $params = null) {
            if (!$params)
            {
                 return $db->query($sql);
            }
            $stmt = $db->prepare($sql);
            $stmt->execute($params);
            return $stmt;
    }


    И после этого пишем почти такой же код, как и был
    $md5_hash = md5_file($_FILES["fail"]["tmp_name"], true);
    $res_double = pdo($db, 'SELECT * FROM `download__files` WHERE `md5hash`=?', [$md5_hash])->fetch();
    Ответ написан
    Комментировать
  • Присвоить id в обратном порядке?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никаким.

    Если шаловливые ручки тянутся потрогать id, то это может означать только две вещи
    - либо надо надавать по ручкам линейкой и объяснить владельцу, что уникальный идентификатор - это не цыферька для красоты, а идентификатор, намертво привязанный к строке в БД, который никогда не меняется, и умирает вместе с ней.
    - либо уникальный идентификатор для этой таблицы вообще не нужен, и его надо убрать
    Ответ написан
    4 комментария
  • Как выполнить большой insert?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как можно узнать из недавно заданного вопроса, Доктрина не поддерживает подобный синтаксис.

    Удивляет здесь другое.
    Ничто не мешает, но придётся создавать соединение mysqli, и прочее лишняя работа, я думал может можно штатными средствами

    Чтобы "создать соединение mysqli" и выполнить запрос нужно меньше времени, чем писать вопрос на тостер.

    Не говоря уже о том, что для одноразовой вставки ни "mysqli", ни РНР вообще не нужен - все делается через консоль mysql.
    Если же запроса кактакового нету, а есть только текстовый файл с данными, то они вставляются через LOAD DATA INFILE, опять же без малейшего участия Симфони, Доктрины и РНР
    Ответ написан
    2 комментария
  • Как правильно создать связь между сущностями и форму для этой связи?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    Третью таблицу Доктрина сделает за тебя сама.

    И, да - "плодить" придется. Со временем ты поймешь, какое это счастье, когда все связи явно прописаны в сущности, и не надо метаться бешеной собакой по коду, чтобы отыскать, как у тебя сущности относятся друг к другу.
    Ответ написан
    Комментировать
  • Как упростить создание доменов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > скопировать файл, переписать домен, переписать hosts, перезапустить сервер.

    Шелл скрипт, в котором несколько строчек с echo

    > Ищу популярное решение в котором все продумано.

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

    В то время как написание шкелл скрипта займет полчаса (с учетом гугления) и будет делать не "всё", а только то, что надо конкретно тебе.
    Ответ написан
    Комментировать
  • Стоит ли писать оболочку для PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, не стоит.

    С такой мотивацией ("а не написать ли мне враппер?...") писать вообще ничего не нужно. Потому что ничего хорошего не выйдет.

    Я даже могу точно предсказать, что выйдет: монстр, который многотрудно и многословно дублирует 10% функционала PDO, не добавляя при этом никаких улучшений, и при этом делает невозможным использование остальных 90%.

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. разрешить для своего ip адреса загрузку через app_dev.php
    2. работать через app_dev.php
    3. При задержках просто открыть дебаг-консоль, там все будет расписано в подробностях.
    Ответ написан
    Комментировать
  • Как делать createQueryBuilder в коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это не надо делать в "произвольном" классе. Это надо делать в сервисе. В который все необходимые компоненты передаются через dependency injection.
    При конфигурировании сервиса в services.yml все необходимые ему компоненты прописываются в аргументы конструктора

    foo.service:
            class: AppBundle\Helper\Foo
            arguments:
                $entityManager: "@doctrine.orm.entity_manager"


    и потом в самом классе в конструкторе переданный аргумент присваивается переменной класса
    use Doctrine\ORM\EntityManager;
    
    class Foo
    {   
        /**
         * @Var EntityManager
         */
        protected $em;
    
        public function __construct(EntityManager $em)
        {
          $this->em = $em;
        }


    Смысл в том, что в Симфони не должно быть "произвольных классов". Все классы должны укладываться в четкую стркутуру. Репозитории - для работы с БД. Контроллеры обрабатывают НТТР запросы. "произвольный код" пишется в сервисы. То есть это должен быть не просто класс, сам по себе, а сервис, описанный в конфигурации.
    Ответ написан
    4 комментария
  • Какой дистрибутив Linux поставить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Непонятно, зачем для этого менять систему на домашнем компьютере.
    Если мощность позволяет (хотя бы 6 ядер в процессоре и 12 гигов памяти), то в таком случае можно развернуть полноценную виртуалку для разработки, с гуем, редактором и браузерами.
    Если ресурсов меньше - то стандартный сетап с докером, по запросу windows docker laravel находится куча руководств, на любой вкус и язык. В итоге получается линукс сервер на котором крутятся только демоны, а редактор и браузеры запускаются на основной системе
    Ответ написан
  • Какую выбрать технологию для хранения и выборки больших данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никакую. К big data указанные объемы отношения не имеют.
    Подойдет любая СУБД, так что можно выибарть ту, которая больше знакома.

    Тем более, что
    Строки могут повторяться между юзерами.

    Т.е. в нормализованном виде это будет занимать еще меньше места.

    Лично мне куда интереснее другой вопрос. Что будет делать система с миллионом строк после запроса
    "выбрать все строки, принадлежащие юзеру Х"
    .
    Ответ написан
  • Затыки с PDOStatement::execute и MySQL - куда копать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все верно объснили, но никто не написал, как сделать правильно.
    Единственным правильным вариантом использования такой функции будет что-то вроде
    function getСolumn( $db, $sql, $params = null) {
        $stmnt = $db->prepare( $sql );
        $stmnt->execute($params);
        return $stmnt->fetchAll( PDO::FETCH_COLUMN);
    }
    print_r( getColumn( $db, 'SELECT category_name FROM categories') );

    Или, в еще более генерализованном варианте,
    function query( $db, $sql, $params = null) {
        $stmt = $db->prepare( $sql );
        $stmt->execute($params);
        return $stmt;
    }
    print_r( query( $db, 'SELECT category_name FROM categories')->fetchAll( PDO::FETCH_COLUMN) );


    Я настоятельно не рекомендую заниматься экономией на спичках и пытаться скостить себе написание двух SQL операторов. Мало того, что надпись вида getNames( $db, 'categories', 'category_name' ) сторонний человек не поймет без того чтобы заглянуть в описание функции, мало того, что такое написание вызывает ложное чувство безопасности. Но, главное, запрос без параметров очень редко когда бывает нужен, и такая функция большую часть времени просто не будет использоваться.

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

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

    Не нужно вообще ловить исключения PDO. Они прекрасно могут сообщить о себе сами.
    function dbConnect($dsn, $user, $password) {
        return new PDO( $dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] );
    }
    Ответ написан
    1 комментарий
  • Как выбрать родителя и всех детей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хотелось бы обьединить всех детей в один элемент.


    Это вопрос не выборки, а обработки результатов.
    База данных не отвечает за формат вывода запрашиваемых данных.

    В PHP с использованием PDO для такого простого запроса можно получить группировку с помощью комбинирования режимов FETCH_GROUP и PDO::FETCH_COLUMN

    Но при большем уровне вложенности или при необходимости получать какие-либо еще данные кроме имени, нужно будет писать обработчик руками.
    Ответ написан
    Комментировать
  • Актуально ли изучать nodejs для бекенда или лучше оставаться на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Изучать надо программирование.
    Все эти вопросы, "Какую машину лучше учиться водить - Рено или Фольксваген?" - это детский сад, честное слово.
    Если для вас потолок - это несколько десятков встроенных функций одного языка, то всё равно что учить - ковыряться помаленьку можно на любом.
    Программист же мыслит не инструкциями, а алгоритмами, паттернами, потоками данных, структурами объектов, шинами сообщений. На каком языке это все реализуется - не принципиально.
    Ответ написан
    2 комментария
  • Почему apache2 не отображает ошибки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что apache2 к ошибкам пхп не имеет вообще никакого отношения.
    А все установленные в php.ini значения могут быть переписаны в коде.

    Судя по кастомной странице ошибки, программное обеспечение, которое вы водрузили на сайт, блокирует вывод ошибок на экран. И правильно делает. На боевом сервере ошибки должны идти в лог. Вот там их и надо смотреть.

    А для домашнего компьютера, который никто кроме вас не видит, надо посмотреть, как настраивать ваше программное обеспечение для режима разработки. Наверняка есть опция настройки, которая за это отвечает.
    Ответ написан
    Комментировать
  • PDO добавление записи в БД. Что делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не могу понять что ему не хватает)

    Наверное, вызова connect() перед началом использованием класса?

    Кроме того, странно, что РНР не ругается вот на эту строчку
    $arr = array('$login', '$email', '$pass', 'admin', '1', '$time', INET_ATON('$ip'));

    Я уж не говорю о том, что в ДБ пойдут значения буквально $login, $email - а не их содержимое, но в РНР нет функции INET_ATON. Это функция mysql, и писать ее поэтому надо в запросе.

    Вообще, с таким уровнем владения РНР (писать переменные в кавычках, да еще и в одинарных) я бы подождал пока с написанием собственных классов. Учитывая, что метод prep() и так бесполезен для большинства запросов, а connect() бесполезен полностью (его код должен быть в конструкторе), я бы настоятельно прекомендовал отложить класс DB в сторонку, поработать пока с чистым ПДО, набить руку, и только потом пробовать писать свои классы. Ну или по крайней мере воспользоваться готовым.
    Ответ написан
    Комментировать