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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сейчас я объясню тебе Самую Главную Вещь, которую должен знать любой пользователь пхп.

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

    Тебе надо твердо запомнить это правило. И пересмотреть свой вопрос с его учетом.

    И в итоге у тебя получится совсем другой вопрос.
    Во-первых, мы узнаем, что файл не подключаетсячерез require по осовершенно банальной причине - он не найден.
    Во-вторых - следуя вышеприведенному правилу - что файла такого на диске нет
    (тут важно понимать, что файл всегда включает в себя путь. Если тебя послали на кухню за чайником, а ты пошел за ним в туалет, то в туалете чайника нет. потому что важно, куда ты за ним пошел. то же и с файлами. у тебя может быть милилон файло в н диске, нодо тех пор пока ты будеш ьуказывать неправиьный путь, ни один не будет найден)
    И вот дальше у нас возникают совсем другие вопросы::
    По какому пути композер пытается зкгрузить файл?
    и почему композер пытается загрузить файл не из той папки, в которой файл на самом деле лежит?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    strtotime(date('Y-m-d')) - это глупость
    во-первых, есть time()
    во-вторых, оно тебе не нужно
    в-третьих, 'Y-m-d' - это не магическое заклинание, а один из форматов, которые понимает функция date(). Описание которых пожно почитать в документации. И найти там то что тебе нужно
    Ответ написан
    6 комментариев
  • Как подключить php файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    php файл нельзя подключить к html файлу
    Ответ написан
    Комментировать
  • Как вернуть только ключи после array_filter?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Во-первых, три условия$value == null && $value == false && $value == '' не имеют смысла, поскльк каждое из них проверяет одни и те же значения. Достаточно любого из них. или просто !$value

    Самое главное, при чем здесь вообще array_filter()? Если нам надо получить ключи массива, то какая разница, откуда он взялся?
    По запросу "как получить ключи массива РНР" гугль дает примерно миллион ответов, первый из которых - ссылка на функцию, которая возвращает ключи массива
    Ответ написан
    2 комментария
  • Как вывести записи которые не были выведены на это странице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если я правильно понял вопрос, то сортировать по advertising_target, rand()
    Ответ написан
    Комментировать
  • Исполнение скрипта php с аутентификацией в cron?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если запрос к тому же хосту, на котором кртится крон, такое "так поставленная задача" - это просто глупость.
    А вообще, стыдно уже в таком возрасте не уметь пользоваться интернетом.
    Ответ написан
  • Учу JavaScript, дальше - Vue.js, среднее знание PHP. На чем сделать CRUD-систему?

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

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

    РНР "умирает" именно потому что язык настолько простой, что "простенькую систему по (манам из Гугла)" может сделать даже обезьяна. И 99% кода на нем написано обезьянами. И люди судят язык не по его возможностям, а по коду написанному гамадрилами и по тем макакам, которые "ругают и кричат что умирает".

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

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

    Если глаза прямо не могут смотреть на 4 строчки - сделай функцию. Нормальную функцию, которая вызывается в 4 слова, а не через хитрую вложенную конструкцию с подвыподвертом, которую тебе уже тут советуют
    Ответ написан
    Комментировать
  • PHP PDO bindParam, второй параметр передается по ссылке. Зачем?

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

    То есть по сути никакой PDO::PARAM_CLOSURE для того чтобы изменить данные на лету не нужен - ты тупо меняешь значение приязанной переменной. Именно благодаря передаче по ссылке.
    $stmt = $pdo->prepare("SELECT ?");
    $stmt->bindParam(1, $var);
    $var = 1;
    $var = 2; // меняем на лету
    $stmt->execute();
    $var = 3;
    $stmt->execute();


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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тут, как обычно, не одна проблема, а три.

    Первая проблема - это, как всегда, неумение задавать вопросы.
    Вот и сейчас - вопрос "чем плохо ходить пешком?" Что можно ответить на этот вопрос?
    Но потом выясняется что вопрос на самом деле "Я живу в 20 километрах от работы. Чем плохо ходить на работу пешком?".

    То есть вопрос у нас на самом деле, "Чем плохо выносить повторяющиеся элементы HTML в отдельные файлы и подключать их потом с помощью include?". Этот вопрос уже будет более осмысленный, и на него даже можно дать ответ не выглядя при этом идиотом.

    Вторая проблема заключается в том, что подход с "хидером и футером" реально неудобен и устарел уже лет 20 как. И вместо него используются шаблонизаторы. Тупо редактировать хтмл удобнее когда он лежит в одном файле, а не в header.php. footer.php. menu.php, banners.php и еще 10 файлах.
    И это я даже не заикаюсь о случае, когда на разных страницах надо поключать разные файлы стилей и скриптов.

    И третья проблема заключается в том, что хотя в принципе и можно что-то несложное накалякать с хидером и футером, но поголовно все новички все равно клепают их неправильно - а именно вкрячивают хидер до того, как скрипт вообще начнет работу. И потом имеют все прелести невозможности вывести НТТР заголовок, поменять что-то в хидере в зависимости от выводимых данных, поменять формат вывода или аварийно завершить работу.
    Ответ написан
    Комментировать
  • Как запретить обращение(скачивание архива) по url?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как запретить обращение(скачивание архива) по url?

    поместить архив за пределы директорий сайта

    как тогда определенным пользователям выдавать данный файл?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не хранить никакой джейсон в БД
    Добавлять строку в таблицу обычным порядком, запросом INSERT
    Ответ написан
    2 комментария
  • Что лучше редиректы или цепочка обязанностей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Что лучше, ходить пешком или кеды? Как это согласуется с КПСС?

    Вопрос бессмысленный.
    Если нужен редирект, то надо делать редирект.
    Если редирект не нужен, то не делать.
    К ООП все эти страдания не имеют никакого отношения.
    Ответ написан
  • Как посчитать кол-во строк в бд MySQL PHP подготовленным запросом PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Здесь два вопроса в одном.

    1. Как посчитать кол-во строк в бд MySQL PHP подготовленным запросом PDO?

    Очень просто. Надо узнать, как в SQL считают строки, а потом выполнить подготовленный запрос. В SQL строки считают запросом count(*). А в РНР строки считают только обезьяны.

    Далее просто подготовить этот запрос и выполнить его

    $sql = "SELECT count(*) FROM `clients` WHERE `email` = ?";
    $pattern = [$data['email']];
    $sth = $connection->prepare($sql);
    $sth->execute($pattern);
    $result = $sth->fetchColumn();


    Просто как три копейки

    Вопрос номер два: Пачиму ничиво нинаходит?

    Ответ тоже простой - потому что в базе данных не находится совпадения с входящими данными.

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

    Потому что если ты воображаешь, будто "GET-параметр принимается правильно, пользователи с нужным E-mail есть", а база данных говорит обратное, то база данных права в 100% случаев. Её писали совсем не дураки.

    И если ничего не находит, то надо проверять. Что у тебя в базе, и что у тебя в во входящих параметрах. Там могут быть непечатные символы, ты можешь обраoаться к какой-то другой базе, у тебя может быть опечатка во входящих данных. Всё надо проверить. И ошибка обязательно найдётся.

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

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

    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 комментариев