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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Логин - это самая дебильная вещь, какую похапе программисты смогли изобрести за все время своего существования. Хотя они в этом деле эксперты.

    Мучений потом не оберёшься. Пользователи пишут вместо логина емейл, потому путаются где у них что, потом регистрируют ещё один аккаунт в котором указывают уже зарегистрированный емейл в качестве логина, а потом рыдают в службу поддержки что сайт их не пускает
    Логин вообще надо выкинуть из базы данных, он никому не нужен. Есть емейл, под которым пользователь регистрируется - вот его и использовать для логина.

    В данном же случае логин еще и не подходит для имени файла. Проблем с валидацией не оберешься.
    При том, что есть гораздо более простое и надежное значение - автоикерементный id. То есть аватарки тупо сохраняются с именем совпадающим с шд пользователя. Даже расширение можно не делать. Ну или можно какое-то одно, png например. Браузеры все равно разберутся что показывать.

    То есть для аватарок отдельная колонка точно не нужна. В нее просто нечего писать
    Ответ написан
  • Как использовать PDO в других классах?

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

    Тут надо понимать одну очень простую, но очень неприятную вещь: ООП, в отличие от ПХП - это сложная тема. Явочным порядком, там подглядев, тут скопипастив - ООП изучить нельзя.
    Максимум что у тебя получится - это та же процедурщина, вид сбоку. Неподдерживаемый говнокод, просто по-обезьяньи обернутый в классы.

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

    Но и то что у тебя сейчас - это не ООП.
    Каждый раз создавать новое подключение можно и без всякого ООП. Вот только оно убьёт тебе сервер БД.
    Чтобы было ООП, надо передать уже созданный инстанс класса для работы с БД как параметр конструктора.

    Кроме того, класс qpdo - это какой-то анекдот, бессмыслица. Обезьяна увидела как человек носит очки, напялила на нос ложку и ходит с гордым видом. Внешне вроде то же самое, но смысла никакого.
    Ты можешь объяснить, ЗАЧЕМ тебе класс qpdo? Чтобы настройки прописать? А ты подумал что настройки бывают РАЗНЫЕ? Что дома у тебя логин рут и пароль пустота, а на хостинге это не прокатит. И что - будешь код переписывать, каждый раз заливая из дома на сервер? Серьёзно?
    Настройки должны всегда лежать отдельно. А больше ни для чего твой класс не нужен.

    Поэтому,

    1. qpdo выкинуть на помойку, по крайней мере до тех пор, пока не поймешь, для чего тебе свой класс, и как с ним обращаться.
    2. Создать один раз инстанс класса для работы с БД (в простейшем случае - PDO) и передавать в другие классы через констркутор
    3. в конструкторе присваивать его переменной класса, которую использовать для доступа к БД.

    В итоге возвращаемся к исходному вопросу, как передать соединение в другой класс:
    class somethingClass {
      function __construct($db) {
        $this->db = $db;
      }
    
      function somethingFunction(string $key) {
        $query = $this->db->prepare("SELECT `key` FROM `table` WHERE `key` = :key");
        $query->execute(array(':key' => $key));
        return $query->fetchColumn();
      }
    }


    Бонус
    echo 'Ошибка подключения к БД MySQL: ' . $error->getMessage() . ''; die;
    - это ад и говнокод.
    Да, в прошлом веке так писали. С тех про прошло уже 20 чертовых лет. 20, Карл! Тебя небось еще в проекте не было.
    Сайт, который вываливает вот это всё на всеобщее обозрение - это позор.
    Все ошибки сайт должен всегда держать при себе. И никому не показывать. И поэтому никогда не надо лезть руками в ту ошибку, которую выбрасывает РНР. Надо дать ей спокойно пойти туда, куда идут все остальные ошибки.
    Ответ написан
    Комментировать
  • Достаточно ли безопасен этот скрипт загрузки изображений на сервер?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    черный список всегда небезопасен.
    проверять надо только по белому

    Плюс желательно переменовывать файл целиком, потому что к примеру веб-сервер апач может принять за расширение файла то, что им не является.
    Ответ написан
  • Правильно ли я понял централизованную обработку исключений в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В целом правильно, неплохая проработка материала.
    У меня есть только пара замечаний, не относящихся напрямую к централизованному обработчику.

    • error_reporting(E_ALL & ~E_NOTICE); делать не стоит. Если только не приходится работать с адовым легаси, которое сыпет нотисами, лучше отлавливать все ошибки. Учитывая же что в 8-ке обращение к несуществующей переменной станет не нотисом а предупреждением, такая конструкция со временем станет бессмысленной. что означает - ошибки надо исправлять, а не замалчивать.
    • ini_set("error_log", __DIR__ . "/php-errors.log"); будет не очень хорошей идеей, если файл error-handler.php выше корня веб-сервера. Ошибки надо прятать подальше.
    • ini_set('display_startup_errors', 1); - это какая-то дичь, которая кочует из руководства в руководство. Никто никогда этих стартап еррорс не видел, но многие старательно пишут это заклинание у себя в коде. Это по-любому связано с настройкой сервера, и в отладке ошибок поможет примерно ничем.
    • само по себе задание настроек через ini-set ненадежно. Ошибка может случиться до того, как РНР прочитает эту команду. Задавать надо в конфигурации веб-сервера.
    • в теории можно добавить флаг или автоматическую проверку на джейсон запрос. и соответственно кодировать ответ в джейсон. Но это только для криовруких фронтендеров, которые не умеют читать НТТР статусы, а ждут что им все разжуют в джейсоне, и без error: true они не поймут, что была ошибка
    • стек вызовов может быть довольно длинным, и раздувать логи. Можно подумать о более укороченном варианте.


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

    Я только не понял, почему вопрос про error_handler. Что именно смущает?
    Ответ написан
    5 комментариев
  • Как вставить верстку посредством генерации в пхп?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Правильный ответ
    <?= '<option value="Berlin">Берлин</option>' ?>
    Ответ написан
    Комментировать
  • Марка, модель, категория, как лучше реализовать связку данных из 3таблиц?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я вообще ничего не понял из этого вопроса.
    Но категорию надо сразу привязывать к модели, в момент заведения, а не когда-то потом.
    Ответ написан
    4 комментария
  • Почему на хостинге не видит класс?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    The file name MUST match the case of the terminating class name.
    Ответ написан
    Комментировать
  • Как вывести json файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У тебя перевод строки добавляется только один раз, в самом конце.
    Но главная проблема в том, что у тебя двумерный массив, а ты пытаешься с ним работать как с одномерным.
    Если у тебя есть "элементы строки", это значит что строка - это массив.
    То есть ты пытаешься выводить строки, разделяя их пробелом.
    Как выводить элементы массива ты уже знаешь. То есть надо добавить этот код внутри уже существующего.

    Только ради бога, забудь ты про перебор массивов оператором for. Уже почти 20 чертовых лет в РНР есть нормальный оператор foreach, но какие-то недоумки все еще преподают студентам искомаемую версию языка.
    Ответ написан
    Комментировать
  • Как вывести определенную колонку csv?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала прочитать первую колонку.
    сделать полученному массиву array_flip()
    дальше при чтении остальных строк использовать этот массив для получения нужных колонок по их имени, например $data[$header['product']]

    если же выводить не по имени, а по номеру, то всё ещё проще - посчитать колонки и подставить нужный индекс вручную
    Ответ написан
  • Не понимаю, где ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибка тут везде, только в первой строчке её нет, во всех остальных есть, включая последнюю
    <?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $connection = mysqli_connect('localhost', 'root', 'root', 'bdwheelz');
    $connection->set_charset('utf8mb4');

    вот так будет правильно
    Ответ написан
    Комментировать
  • Как изменить чужую картинку с HTTP на HTTPS?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чужую - никак.

    Как вариант можно рассмотреть возможность не паразитировать на чужом контенте, а сделать что-то своё
    Ответ написан
  • При бекапе файл .htaccess не попадает в него, что можно сделать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вместо звёздочки надо поставить точку.
    Ответ написан
  • Все подключенные файлы будут запускаться при запуске одного PHP?

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

    Нет, не так.
    Сайт грузится долго из-за того что какой-то код написан через одно место.
    Тебе надо найти это место, и переписать нормально.
    А все эти инклюды перенклюды не при чем.
    Ответ написан
    Комментировать
  • Как использовать RedBeanPHP внутри namespace в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо обновить версию этой фасоли.
    Автор там что-то колупал в своем древнем коде, чтобы сделать поддержку неймспейсов. Не знаю насколько удачно.
    Ответ написан
    Комментировать
  • Как правильно импортировать расширение через Composer?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ох...
    php C:\ProgramData\ComposerSetup\bin\composer.phar require

    или добавить папку композера в PATH
    Ответ написан
  • Как сохранять промежуточные ответы чат-боту?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Поскольку ты вообще ни с одним инструментом не знаком, а все идеи, которые тебе пришли в голову - заведомо провальные, то делай через единственный инструмент, который тебе известен - mysql.

    Таким образом ты будешь решать одну задачу, а не десять, осваивая незнакомые тебе инструменты и не понимая основ протокола НТТР. Учитывая, что это твоё "из пушки по воробьям" потребует от тебя значительных усилий для реализации, следует сосредоточиться на решении основной проблемы, а не сопутствующих.

    Если же ты не вкрячишь это сохранение прямо внутри кода бота, а реализуешь как сервис, то в дальнейшем ты сможешь поменять хранилище, не меняя код бота.
    Ответ написан
    Комментировать
  • Как решить проблему с данным запросом pdo?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Выкинуть на помойку бессмысленный код "функции класса bd" и написать заново
    public function query($sql, $params = []) {
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }

    2. В конструкторе класса bd соединение PDO создавать правильно, чтобы база данных могла тебе сказать человеческим голосом, что не так в запросе
    3. осилить правильный синтаксис INSERT
    Ответ написан
  • Как разрешить проблему с тем что не записываются некоторые записи в базу данных?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Комментировать