• Builder: нужна ли фабрика, или можно в билдере оставить метод?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    1) создать класс-обертку для этого логгера, сконфигурировать его внутри (в методе init, метод init засунуть в конструктор)
    2) изучить реализацию service container в текущем фреймворке/приложении и передавать уже сконфигурированный логгер через dependency injection в нужные классы
    Ответ написан
    Комментировать
  • Как реализовать проверку и подгрузку файлов между серверами?

    Stalker_RED
    @Stalker_RED
    git и системы деплоя не рассматривали?

    Если нужно именно на уровне файлов, то есть rsync, syncthing, и прочее, вплоть до дропбокса, прости господи.
    Ответ написан
    Комментировать
  • Как связать новость на одной странице с ее развернутой формой на другой?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Поднимаем глаза наверх. Только не к Небу, а чуть ниже. К адресной строке своего браузера (пока она ещё там есть, и её не отменили улучшаторы из компании альфабет).
    И - о чудо! - видим там ссылку вида qna.habr.com/q/1077518
    Казалось бы, что могут означать эти загадочные цифры?.. ;-)
    spoiler

    Для "моего первого скрипта на пхп" правда там будет не /q/1077518, а news.php?id=1077518.
    После чего в скрипте news.php вожделенное число будет доступно в переменной $_GET['id']
    Содержимое которой можно будет использовать для запроса строки из БД.
    Только не так как это показано во всех видео на ютубе, а нормально:

    $query = "SELECT * FROM news WHERE id=?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $_GET['id']);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    в переменной $row будет содержимое нужной строки из БД


    А так-то вопрос, конечно, про SQL ;-)
    Ответ написан
    Комментировать
  • Как корректно реализовать автовход пользователя на сайт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Очень правильный вопрос. Разумеется, с таким подходом зайдет кто угодно.

    поэтому надо в таблицу users добавить поле autoenter, и если пользователь выбирает автологин, то в него записывать значение bin2hex(random_bytes(16)); и его же записывать в куку.
    Ответ написан
  • Почему интерпретатор php не воспринимает кириллицу?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Перед тем, как писать веб-серверы на C#, надо учиться описывать проблемы не языком домохозяек.

    Не существует такой кодировки - "кириллица". Есть конкретная кодировка, которую необходимо указать в вопросе.
    Нет такой команды в C# -"послать интерпретатору". Есть конкретная команда или действие, которое надо описать в вопросе.
    Нет такой команды - "сказать, что находится по пути". Есть конкретный код, который надо привести в вопросе.
    РНР - не посетитель в ресторане, чтобы "отказываться". Это программа. Которая либо работает, либо выдаёт сообщение об ошибке. Которое программист должен прочитать. Или по крайней мере, если не понял в нем ни одного слова, то аккуратно скопировать в свой вопрос.

    В целом РНР прекрасно работает с любыми кодировками, которые используются для отображения русских букв, даже с теми адовыми костылями, которые используются в Микрософт Виндоус с середины конца прошлого века по сей день.

    Для того чтобы убедиться в том, что РНР прекрасно работает с русскими буквами, надо создать скрипт test.php
    <?php
    header('Content-Type: text/html; charset=utf-8');
    echo hex2bin('d0bfd180d0b8d0b2d0b5d182'); 
    // текст UTF закодировн в hex чтобы избежать влияния кривых ручек тестировщика/выкрутасов Виндоус


    перейти в папку с ним
    запустить встроенный веб-сервер
    php -S localhost:8081
    и открыть в браузере адрес localhost:8081/test.php

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

    Судя по классической картинке, https://habr.com/en/post/147843/ где-то происходит перекодирование utf-8 -> 866(!)
    Ответ написан
    1 комментарий
  • Как можно ускорить работу Exception?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Если вас беспокоит скорость работы исключений, вы что-то делаете неправильно"

    Ускорить нельзя.
    В данном случае все проблемы не из-за исключений, а из-за говнокода.

    Ошибка валидации при валидации - это не исключительная ситуация, а совершенно нормальная. Часть бизнес-логики. То есть в процессе валидации всего массива данных исключения кидаться не должны.
    Если исключения используются для управления ходом выполнения программы - это УЖЕ ошибка.

    По результатам валидации исключение может кидаться ОДНО. В самом конце. По результатам валидации всего набора данных. Или не кидаться - зависит от конкретной бизнес-логики. Но если и кидать, то только одно, по результатам.
    Это будет правильное использование исключений, которое вообще никак не скажется на скорости работы кода.
    Ответ написан
  • Фриланс: какие специальности не оккупировали "индусы"?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    С таким уровнем я бы рекомендовал набраться опыта в офисе или где-то в работе по найму.
    Лезть во фриланс с нуля - это крест на своей карьере.

    Нормальные опытные люди вообще не конкурируют с индусами.
    Ответ написан
    Комментировать
  • Как улучшить код?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Для начала можно удалить весь DocBlock. Во-первых, он не добавляет ровным счётом никакой информации, а во-вторых, ещё и не все параметры содержит.

    Название returnFullOrderInfo можно переименовать в makeFullOrderInfoResponse - в названиях функций слово return не несёт ценности.

    Метод fullInfo тоже можно переименовать в (to|make|get)FullInfo для того, чтобы по названию было понятно, что метод делает.

    Метод responseSuccess тоже криво назван.

    Почему у параметра $warning не указан тип?

    Если $warning связан непосредственно с заказом, то его имеет смысл передавать в качестве аргумента в fullInfo, чтобы инкапсулировать и не менять объект снаружи. Если же не связан, то формат ответа лучше поменять на ['data' => $orderInfo, 'warning' => $warning].
    Ответ написан
    Комментировать
  • Как лучше реализовать корзину для магазина?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На все эти вопросы легко ответить самостоятельно, если просто немного подумать.
    Никакое знание РНР тут не требуется - только здравый смысл и минимальное понимание принципа работы веб-сайта.

    Обычно для анрегов корзина делается в сессии, а для регов - в базе.
    При логине и наличии корзины в сессии, содержимое мержится с корзиной в базе. То есть такого вопроса "как сделать идентификацию" в принципе не возникает - все делается само собой. Когда юзер авторизовался, у нас есть и его ид, и сессиия. Что тут может быть не ясно?
    Ответ написан
    Комментировать
  • Как отправить post запрос из html формы?

    Eridani
    @Eridani
    Мимо проходил
    Вас отсутствие name'ов у инпутов не смущает?
    Ответ написан
    Комментировать
  • Какие существуют события для фиксации выхода пользователя сайта?

    Adamos
    @Adamos
    Дурь это все. Максимум, что вы можете контролировать - это пребывание пользователя на сайте.
    А когда айфон спит, но вкладка открыта, или когда юзер просто сбросил браузер (например, зависший от нехватки памяти) - ни хрена вы не зафиксируете.
    Ответ написан
    Комментировать
  • Как получить список из массива без дублей?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    CREATE TABLE categories (
    	id int auto_increment primary key,
      	name varchar(64)
    );


    <?php
    function getRightCategories($db)
    {
    	$result = $db->query('SELECT id, name FROM categories');
    	return $result->fetchAll(PDO::FETCH_KEY_PAIR);
    }
    
    $categories = getRightCategories($pdo);
    
    print_r($categories);


    Test PDO fetch online
    Ответ написан
    Комментировать
  • 7 жил из 8, должна ли работать сеть?

    Если 1, 2, 3, или 6 в обрыве - работать не будет совсем. 1 и 2 - это одна пара, 3 и 6 - вторая пара. При обрыве любого из этих проводков линка не будет.
    Решать как - переобжать оба конца и проверить. Если то же самое - значит обрыв где-то в кабеле. Тогда можно либо найти место обрыва и там "бочку" поставить или кабель переложить... Ну или взять коричневую или синюю пару вместо зелёной (соответственно, 1ГБит/с сделать не получится, только 100МБит/с).
    Ответ написан
    9 комментариев
  • Как реализовать не могу понять как убрать фон?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Формат jpeg в который вы сохраняете картинку в конце imageJpeg($image); не поддерживает прозрачность
    Используйте для сохранения формат поддерживающий прозрачность, например: png, webp, gif
    Ответ написан
    1 комментарий
  • Почему в парсере перестают работать куки или как изменить чтобы работало?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    1. используй CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE
    2. у кикис заканчивается срок жизни и поэтому они становятся не действительными т.ч. лучше перелогиниваться при каждом сеансе, а потом отправлять остальные запросы с тем же дескриптором $curl
    Ответ написан
    1 комментарий
  • Как создать ссылку в базе данных?

    @alexalexes
    Общий ответ с точки зрения любой СУБД по отношению к любому способу вывода (выкатить что-то на веб-страницу) - никак. База данных ничего не знает, что такое ссылка в веб-документе. Она оперирует такими понятиями, которые позволяет хранить данные, как таблица, столбец, строка, значение атрибута. Из таблиц и связующих атрибутов таблиц - внешних и внутренних ключей строится структура данных для вашей предметной области.
    С другой стороны, у вас имеется ссылка в веб документе, которая имеет некоторые атрибуты, пригодные для хранения в базе данных: href - адрес ссылки, title - подсказка на ссылки, и возможно, какой-то текст, который обрамляет эта ссылка.
    Попробуйте значения этих атрибутов поместить в таблицу базы данных links, со столбцами:
    link_id, -- идентификатор записи в таблице ссылок
    link_href, -- ссылка
    link_title, --подсказка ссылки
    link_text -- текст ссылки
    И с помощью запроса к СУБД, а также с помощью PHP сделайте форматированный построчный вывод данных:
    // тут опущены действия связанные с формированием запроса,
    // на этом этапе вы каким-то способом получили выборку данных из таблицы links
    foreach($rows as $row)
    {
      echo '<a href="'.$row['link_href'].'" title="'.$row['link_title'].'">'.$row['link_text'].'</a><br/>';
    }

    Это и будет самый примитивный пример, как хранить сведения о ссылки и как их выводить.
    В реальном проекте будет несколько сложнее выглядеть таблица, где хранятся подобные сведения.
    Ответ написан
    Комментировать
  • Клиент подаёт в Арбитраж Upwork, с меня вывернут 291$?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, American Arbitration Association - не представители закона, это просто организация помогающая улаживать разбирательства в досудебном порядке. Во-вторых, вам стоит поинтересоваться в поддержке UpWork где в их правилах зафиксирована возможность вмешательства в арбитраж дополнительных сторон. Наконец, клиенту вы можете сообщить, что не работаете в юрисдикции US, а потому арбитраж они могут привлечь только для разбирательства с UpWork.
    Ответ написан
  • Как правильно ставить куки для авторизации?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как всегда, здесь подводит логика.
    Если в базе есть что красть, то при "угоне базы" возможность авторизоваться будет самой меньшей из проблем.
    Если в базе кроме логина и взять нечего, то и возможность авторизоваться не поможет. Ну угнал ты скажем аккаунт пользователя интернет-магазина - и какой с этого навар?

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

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

    Если же нет уверенности в собственных силах, что удастся защитить базу от слива, то можно использовать JWT токены.
    Ответ написан
    Комментировать
  • Насколько целесообразно разбиение на функции и классы?

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

    Рекомендую найти видео "Как писать код, который понравится вашим тестам" с первой PHPRussia. Там очень доходчиво рассказывается про то, почему надо делать простые методы. Не только для тестов. А ещё и для повторного использования и для упрощения поддержки кода. Когда надо прочитать основную логику модуля, то даже сокращение в два раза (по одному методу вместо двух строк кода) уже сильно облегчает задачу.
    А если уж даже тест понял, что делает ваш код, то человек поймёт и подавно :)

    Как вам написали выше - все дело в именах методов. Если они информативные, то есть если конструкция
    if ($this->function_7($a) && $this->function_8($b))
    читается как связный английскй текст, то mission accomplished! Функции выполняют свою роль: легче всего читать код, которого нет. Вместо того, чтобы разбирать, что делает тот или иной код, можно просто прочитать небольшой текст на английском.
    Ответ написан
    4 комментария