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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Открою маленький секрет.
    Все 100% современных приложений работают именно таким образом - сначала они инициализируют начальные константы, а потом запускают приложение.

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

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

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

    Да, всё верно, Симфони приучает к правильной структуре кода. Так что самым лучшим вариантом будет устроиться на работу в компанию, где используется Симфони - и учиться на практике.

    Если же решать проблему с нуля - то есть из теории - то чтением книжек отцов-основателей - Мартина, Фаулера - вот это вот всё. Новичкам редко подходит, так что я бы рекомендовал совмещать теорию с практикой.
    Ответ написан
    4 комментария
  • Как загрузить картинку в папку на php и записать путь в базу mysql?

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

    1. проверять $_FILES['uploadfile']['error']
    2. Проверять расширение файла на соответствие разрешенным по списку
    3. Переименовывать файл, поскольку оригинальные имена - это адище и беспорядок плюс небезопасно.
    Ответ написан
    7 комментариев
  • Что означает $this-> -> в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Закопать Fuel обратно в его могилу и больше не беспокоить прах этого умершего в далекой древности старца.
    2. Вместо него учить Laravel
    3. Открыть для себя документацию РНР и в непонятных случаях обращаться к ней. В это трудно, конечно, поверить, но там всё написаною Эта ссылка находится в двух кликах по запросу "РНР ООП"

    Честно говоря, я и сам себя часто ловлю на такой "лености мозга". Когда ты 100% можешь сам найти ответ, но спросить у знающего человека проще. но тут важно не поддаваться, и сначала пытаться самостоятельно. Для этого в любом вопросе должна быть фраза - "я искал такм-то", но не нашёл. В процессе написания этой фразы ответ сам и сыщется. В итоге в будет сэкономлено время, приобретён опыт и в интернете будет будет меньше мусора.
    Ответ написан
    4 комментария
  • Как экранировать строку в REGEXP (mysql) средствами PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю, что preg_quote() должна подойти.
    Ответ написан
    1 комментарий
  • Как исправить ошибку Invalid parameter number?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как можно решить эту проблему?


    Такие проблемы решаются довольно просто. Нужно прочитать сообщение об ошибке. Если совсем не понимаешь по-английски - есть онлайн переводчики. Если все равно непонятно - берем сообщение об ошибке и ищем гуглем и смотрим по найденным ссылкам.
    Ответ написан
  • Почему приоритет операторов не соответствует оф. таблице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Не знаю. Скорее всего, все так, как написал xtress. То, как операторы выполняются, и в каком порядке из результаты используются - это разные вещи.
    2. На самом деле написано, что "Рекомендуется избегать "нагромождения" тернарных выражений. Поведение PHP неочевидно при использовании нескольких тернарных операторов в одном выражении"
    3. Таблица не при чем, поскольку "эта оптимизация" не относится к приоритетам. https://phpdelusions.net/articles/or_die
    Ответ написан
    Комментировать
  • Какие курсы по php выбрать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Единственные качественные курсы, которые готовят современного разработчика, а не ремесленника для 1990-х - это https://otus.ru/lessons/razrabotchik-php/
    Но как я вижу, прием там закрыт :(
    Ответ написан
    Комментировать
  • Как сверить пароли с базой?

    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 комментарий
  • Почему возникает ошибка '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();
    Ответ написан
    Комментировать
  • Стоит ли писать оболочку для PDO?

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

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

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

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

    Поэтому место написания враппера санчала надо научиться использовать оригинальный ПДО, разобраться с тем, как его правильно использовать, изучить его сильные и слабые стороны, понять, чего вам в нем не хватает, и только потом садиться писать враппер, который добавляет недостающую функциональность, но не урезает при этом существуюущую.
    Ответ написан
    Комментировать
  • Затыки с 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 комментарий
  • Почему 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 в сторонку, поработать пока с чистым ПДО, набить руку, и только потом пробовать писать свои классы. Ну или по крайней мере воспользоваться готовым.
    Ответ написан
    Комментировать
  • Как сделать много страниц на одном шаблоне без $_GET?

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

    В папку videos положить .htaccess
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php

    Это заставит апач запросы ко всем несуществующим файлам перенаправлять на index.php

    И потом в index.php смотреть на REQUEST_URI
    Ответ написан
    Комментировать
  • PDO данные для подключения из стороннего файла?

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

    То есть если ты собираешься передать в функцию какое-то значение, которое потом будет использовано внутри, его надо описать при определении функции:
    function foo($bar) {
        echo $bar;
    }

    А если этого не сделать, то функция не будет знать, откуда у нее вдруг должна взяться переменная $bar.

    Соответственно, чтобы твой код заработал, надо сказать конструктору, что в нем будет переменная $config
    public function __construct(Config $config)
    И вызывать эту функцию в соответствии с данным определением. Это значит, что при определении функции указан 1 параметр, то при вызове надо писать тоже 1 параметр, а не 10.
    То есть вместо
    $db = new db($config->host, $config->user, $config->pass, $config->base, $config->charset);

    должно быть
    $db = new db($config);
    Ответ написан
    Комментировать
  • Php не видит и не подключает существующие файлы, почему?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По какой-то загадочной причине пользователи похапе en masse не читают подробное объяснение ошибки, предоставленное интерпретатором РНР, предпочитая гадание на кофейной гуще.

    Казалось бы, объяснение прямо под носом: ищем файл в папке local
    /home/bitrix/www/local/modules/custom.module/lib/exception.php

    в то время как в реальности файлы приложения лежат в папке bitrix
    /home/bitrix/www/bitrix/modules/main/lib/loader.php

    То есть можно предположить банально неверную конфигурацию приложения.
    Ответ написан
  • Как отобразить комментарий под статьёй, под которой его написали, через PDO PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $stmt = $db->prepare('SELECT * FROM comments WHERE article_id = ?');
    $stmt->execute([$_GET['post_id']]);
    $comments = $stmt->fetchAll(PDO::FETCH_OBJ)


    И дальше уже выводишь из массива $comments в разметке. Самый простой пример: phpfaq.ru/tpl
    Ответ написан