Ответы пользователя по тегу PHP
  • В чем разница object и array в json_decode()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Массив - это массив, объект - это объект. Объект, в отличие от массива, может содержать не только данные, но и методы для работы с ними.
    Если использовать функцию json_decode(), то никаких методов не будет, только данные. То есть разницы никакой, чисто эстетическая.
    Ответ написан
    Комментировать
  • Как исправить проблему с созданием регистрации пользователей?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это всё просто ужасно. Начиная прямо с первой строчки, class Register extends Database
    Делать отдельный класс для регистрации глупо. Если уж делать класс, то для манипуляции юзером в целом, а не одной только регистрации. Плюс, регистрация пользователя - это не база данных. И не должна наследовать классу Database.
    По сути, вы хотите натянуть ООП на обычное процедурное программирование. Не надо этого делать, получится самолёт из соломы. Сделайте простую функцию.

    Но это ещё цветочки. Остальных проблем тут выше крыши:
    1. Никогда не используйте сокращённый синтаксис INSERT. Всегда надо явно перечислять поля. Это, скорее всего, и является причиной ошибки. Но даже если нет, то проблемы всё равно вылезут в будущем
    2. Собственно сообщение об ошибке нам и надо получить от базы данных, чтобы понять в чем проблема. для этого к коду соединения с БД надо добавить строчку
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      и после этого смотреть сообщение об ошибке
    3. Самое главное - SQL инъекция. Какой смысл делать регистрацию вообще, если любой дурак узнает пароли всех остальных пользователей или сможет авторизоваться вообще без пароля? Запросы надо выполнять только через подготовленные выражения
    4. И по поводу паролей. Пароли надо хранить в фаршированном виде, обработанными функцией password_hash()
    Ответ написан
    Комментировать
  • Как в PHP быстрее и с меньшей нагрузкой на сервер вывести случайное значение сроки с 500000 шт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Способ с инклюде - это ад кромешный. Память процесса РНР- она как бы не бесплатная. И даже если в моменте ничего не упадёт, то может потом не хватить на какую-то другую операцию. Но главное - это просто варварство, каждый раз тягать в память пол-ляма строк ради того чтобы вывести одну.
    Способ с файлами в принципе эффективен, но многие ос начинают тупить при большом количестве файлов в каталоге, придется разбивать по 500 подкаталогам. В целом гемор.
    spoiler
    И непонятно, зачем так сложно писать
    echo file_get_contents("/str/" . mt_rand (1,500000) . ".txt");

    Самый простой способ - это действительно сделать таблицу в БД, где будет два поля, число по возрастанию (первичный индекс) и собственно значение строки.
    и выбирать по первому полю через то же mt_rand (1,500000)

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    5 июня вы уже задавали этот вопрос.
    Если за три месяца вы так и не освоили базовые приёмы работы с БД в РНР, то может ну его совсем?
    Тем более что при таких-то дырищах всё равно это будет не баланс, а решето.
    Ответ написан
    Комментировать
  • Как исправить ошибку Implicit conversion from float (int) to int loses precision?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот код какой-то эстет писал.
    Для получения количества полных дней вместо битовых выкрутасов надо просто использовать floor()
    Хотя в данном случае надо использовать ceil, ну или round. Потому что эти 5 сотых дня происходят явно от прехода на летнее время. И с конверсией в int теряется 1 день.
    Ответ написан
    Комментировать
  • Как по очереди проверять и по очереди убирать лишнее?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    А зачем if-ы вкладывать друг в друга?
    Как $tegi[1] может быть одновременно равен $id['TIP_TOVARA'] и $id['AFFILIATION']?
    Ответ написан
  • Как кастомизировать ексепшены в общем методе?

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

    В общем случае, как правильно написал sl0 в комментарии, кидать надо ОДИН тип исключения, но с разными сообщениями.

    В данном конкретном случае, поскольку речь идёт о валидации, то никакое исключение в принципе кидаться не должно. Исключение кидается в случае, если функция не может выполнить свою работу. Но для функции checkParam() невалидный параметр НЕ ЯВЛЯЕТСЯ исключительной ситуацией. Потому что роль этой функции - как раз и определить валидность переданного параметра. В случае неверных данных функция должна записать сообщение об ошибке во внутренний массив ошибок класса-валидатора и вернуть false.
    spoiler

    Исключение в случае неверных параметров может кидать например функция сохранения в БД. Потому что её задача - сохранить переданные данные, а не валидировать их. И в случае, если функция не может сохранить данные - она должна кинуть исключение, в том числе из-за невалидности данных.
    Ответ написан
    9 комментариев
  • Как массив из обьектов сделать уникальным?

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

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Пройти в цикле по обоим массивам и проверять, есть ли индекс в первом. Если нету - удалять элемент с таким индексом
    Важно: удалять надо по полному адресу, $array['DESCRIPTION'][$key]
    Ответ написан
  • Как настроить кодировку?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос сложный, это издержки разработки под виндоуз.
    Весь мир давно уже работает с кодировкой utf-8, а эта допотопная система всё ещё выдаёт свои ошибки в 1251.

    Я бы не стал делать никаких специальных телодвижений по перекодированию ошибок виндоус. На боевом сервере эта проблема будет неактуальной, а пару раз при разработке можно и потерпеть.
    Как вариант - сделать запись ошибок в лог, и смотреть их каким-нибудь Блокнотом - он покажет нормально.
    Ещё как вариант - не использовать опенсервер или чем вы там пользуетесь, а использовать встроенный сервер РНР - он перекодирует выводимые на экран ошибки в utf-8.
    Ответ написан
    1 комментарий
  • Почему не работает if(isset()) в woocomerce wordpress?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если не работает условие
    if(isset($_POST['woocommerce_checkout_place_order']))
    то это значит, что либо запрос был не методом POST, либо в нём нет поля woocommerce_checkout_place_order
    Ответ написан
  • Есть ли разница между памятью в PHP и C#?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    РНР работает как консольная утилита. Запустился, поработал долю секунды, завершился.
    Поэтому вопросы управления памятью в 99% случаев РНР разработчиков не волнуют. Как и её очистка
    Чисто технически подробности управления памятью также полностью скрыты от разработчика.
    Всё что надо знать о работе РНР с памятью - "РНР работает с памятью за тебя"
    Так что в целом, единственное что вас должно интересовать - это не работать с большими объёмами данных в скрипте. Но это и так очевидная рекомендация.

    Если хочется прям вдаваться в детали (хотя совершенно непонятно, зачем это джуну), то PHP insernals Memory management
    Ответ написан
  • Как приветси GET-ответ в удобочитаемый вид?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется не "GET ответ", а JSON
    Ответ написан
    Комментировать
  • Как перенести длинную строку в коде?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $send .= "sudo screen -dmS screen_name docker run $user_container $memory_container -d -it --cpus '1' --memory=" . $mem."m $v1 $v2 $v3 $v4 $v5 -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 $v6 $v7 $v8 $v9 $v10 $v11 $v12 $v13;";

    но как же я задолбался все эти кавычечки выковыривать
    Ответ написан
    2 комментария
  • Возможно ли в PHP по заголовкам точно определить устройство и Браузер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Весь вопрос в требуемой точности.
    Я могу написать в юзер-агенте что у меня FireChrome Opera версии 100500 для межгалактических планшетов.
    А на самом деле это будет Brave для PC XT.

    Однако для любых осмысленных применений точности определение вполне достаточно. Существует 100500 либ, которые выдают все требуемые характеристики по юзер-агенту.
    Собственно, все сайты в интернете так и работают, в частности определяя мобильность клиента.
    Ответ написан
    Комментировать
  • Хорошо ли использовать в PHP неявное приведение типов int bool?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Технически равноценны, но второй при сравнении с нулём выглядит глупо.
    Хорошо или не хорошо - вопрос философский. РНР до сих пор язык со слабой типизацией, и никаких подвохов или расходов тут нет.
    Я бы сказал, что неявное приведение к булеву типу до сих пор используется повсеместно, что в if, что в while. Особенно в последнем. Писать while (($row = $stmt->fetch()) !=== false) вместо while ($row = $stmt->fetch()) пока ещё народ отказывается.
    Ответ написан
  • Почему не номер телефона не проходит соответствие шаблону в БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    С каких пор LIKE стала работать с регулярками?
    select 9998887766 REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    Ответ написан
    1 комментарий
  • MemcacheD: как хранятся ключи "под капотом" у него?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Понятное дело что ни к посетителям, ни к сессиям мемкеш никакого отношения не имеет, как и РНР. HTTP - это stateless протокол, и все клиенты в РНР на одно лицо.
    Мемкеш - это демон, который обслуживает входящие соединения, которые для него тоже все на одно лицо. Причём это лицо - РНР, а не какой-то там НТТР клиент.
    РНР конечно может создать ключ в мемкеше на основе куки, полученной от пользователя, но для мемкеша это будет совершенно обычный ключ, не привязанный ни к какому "клиенту". А всё привязка - это чисто интерпретации на уровне пользовательского РНР кода.

    А вот почему тормоза и дубли - тут я ответить не могу, потому что с мемкешем сталкивался лет 10 назад по касательной. Это к вопросу о том, что искать часы надо там, где потерял, а не не под фонарём потому что светлее. И задавать вопрос надо про исходную проблему, а не про свои догадки по её поводу.

    По идее никаких дублей в мемкеше быть не должно - это key-value хранилище и ключи должны быть уникальными.
    Возможно, выгрузка показывает уже просраченные ключи.
    А тормоза, возможно, из-за того, что ключи постоянно перезаписываются, вместо того, чтобы записываться только тогда, когда надо обновить данные.

    В целом мемкеш уже давно вышел из употребления, и его заменил редис
    Ответ написан
  • Почему не нужно заранее объявлять массив?

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


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

    Значит то что пишут $result = [] Это я удобства?


    Не для "удобства", а для того, чтобы волосы на голове сохранились подольше.
    В данном случае нужды в явном присвоении нет.
    Но любой код со временем изменяется. И функция tower_builder() может разрастись. Там появится ещё один цикл, который работает с массивом $result. Который получит какое-то значение до начала нашего цикла, и в итоге конечный результат будет неправильным. Поэтому $result = [] перед началом работы с массивом - это не каприз или удобство, а необходимость
    Ответ написан
    Комментировать
  • Почему не подгружаются стили?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что ./css/style.min.css - это бессмыслица и карго культ.
    Ссылки на локальные ресурсы должны быть абсолютными путями от корня сайта. А не вот это вот.
    То есть в данном случае надо убрать точечку.

    Ну ведь всё просто же.
    В отличие от файловой системы, где никогда заранее не знаешь, где у неё корень, с веб сайтом всё просто и понятно, корень всегда один - /
    / - корень сайта
    /css - папочка css в корне сайта
    /css/style.min.css - файл style.min.css в папочке css которая лежит в корне сайта
    Всё просто, понятно, очевидно

    Зачем вообще было писать эти точечки?
    Они начинаются, когда ты только учишься склыдывать а и б в HTML. И нет у тебя никакого веб-сервера, а есть файлик на диске. В этом случае да - без относительных путей никак не обойтись
    Но как только начинается РНР, который без веб сервера уже не работает, про все точечки в локальных ресурсах надо забыть, и писать всегда абсолютные пути от корня сайта.
    Ответ написан
    2 комментария