Задать вопрос
  • Как понять что я готов к ООП?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если спрашиваете, то не готовы.

    В этом вопросе важно понимать, что изучив всего лишь объектный синтаксис, вы столь же готовы писать ООП, сколь готовы профессионально играть в шахматы, изучив как ходят фигуры.
    Главное в ООП - не синтаксис. А взаимодействие объектов. Композиция, наследование, инкапсуляция. Связность, связанность. Это все довольно сложно, и по усилиям, которые требуется затратить на обучение, запредельно отличается от изучения основ процедурного программирования.

    Так что просто запаситесь терпением, набирайтесь опыта в программировании, и постепенно разбирайтесь с ООП - сначала на примере чужих классов и книжек. Мартин, Фаулер - вот это вот всё.
    Ответ написан
    Комментировать
  • Почему PHP не исполняется построчно, хотя он интерпретируемый?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Изначально интерпретируемые языки преобразовывались в машинный код построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство интерпретируемых языков предварительно транслируются в промежуточное представление. Оно представляет собой байт-код. Это набор инструкций по вызову небольших фрагментов более низкоуровневого кода, эквивалентный нескольким командам ассемблера или командам виртуальной машины соответственно. Уже этот код исполняется интерпретатором или виртуальной машиной.
    Ответ написан
    5 комментариев
  • Почему не работает запись в базу данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В целом, я считаю что основная причина здесь - это отборный говнокод в переменной $Functions. Я прямо на 100% уверен что каждую строчку оттуда можно помещать в палату мер и весов с пометками "вредные советы" и "дети, никогда так не делайте, за это вам нехороший дядя сделает а-та-та!" Уже за одно только наличие функций redirect() и getString() в одном классе надо автора возить лицом по клавиатуре, желательно механической.

    Но если говорить о записи в БД, то причин может быть две.
    1. Код вставки вообще не вызывается. Например, $Functions->redirect(); вызывается в случае, если $openid->validate() возвращает false. Хотя понять это можно, только скопировав это адово форматирование в нормальный редактор.
    2. Если при выполнении запроса произошла ошибка. Чтобы видеть ошибки mysqli в устаревших версиях РНР, надо добавлять при коннекте строчку
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    и, чтобы два раза не вставать, заодно убрать бессмысленный говнокод try{ }catch(ErrorException $e){ echo $e->getMessage(); }

    Ах да, еще третий вариант. Запись о таком пользователе уже есть, и следуя логике кода, в этом случае в БД ничего и не должно добавляться
    Ответ написан
  • Как распарсить JSON в котором несколько блоков?

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

    Использованный вами код подходит только для файла, в котором на каждой строке лежит неформатированный JSON.
    Поэтому надо или писать в файл JSON, не форматируя его,

    {"NumberStat":[{"ManNumDetection":[{"AreaID":1,"Channel":0,"EndTime":"2023-04-14 10:59:59","EnteredSubtotal":0,"ExitedSubtotal":0,"StartTime":"2023-04-14 10:00:00"}],"SN":"6M0D6EFPAG24E66","Uploading Time":"2023-04-14 11:00:49"}]}
    {"NumberStat":[{"ManNumDetection":[{"AreaID":1,"Channel":0,"EndTime":"2023-04-14 11:59:59","EnteredSubtotal":0,"ExitedSubtotal":0,"StartTime":"2023-04-14 11:00:00"}],"SN":"6M0D6EFPAG24E66","Uploading Time":"2023-04-14 12:00:49"}]}

    или, как рекомендуют в других ответах, переформатировать эту стену текста как единый JSON массив
    Ответ написан
  • Зачем нужны объявления типов php?

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

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

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

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

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

    Какая проблема, чтобы Client сходил в Order, получил идентификатор созданного заказа и дернул Billing?
    Зачем во всех этих трех сервисах делать тройное дублирование сущностей?
    Ответ написан
    5 комментариев
  • Возможно ли сделать общий футер на всех страницах?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. У страницы делаем расширение .php вместо .html
    2. Внизу пишем <?php include 'footer.php'; ?>

    Всех дел на 30 секунд.
    Ответ написан
    Комментировать
  • Как оптимизировать пагинацию отсортированных по времени создания записей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну, вариант "в лоб" это
    select * from table where date >= n and id not in (...) order by date limit 1000

    где n - это последняя дата с предыдущей страницы, а ... - это список id на ту же дату с той же страницы.

    Но как правильно пишут в комментариях, если пагинация начинает тормозить, то надо что-то в консерватории менять. И например разбивать не по 1000 строк, а по дате.
    Ответ написан
  • Как сокращенно записать условие в случае если значение не пустое?

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

    Поэтому для приведенного кода ничего сокращать не нужно. Это приведет только к потере читабельности. Которая всегда важнее, чем экономия на строчках.
    И вариант с тернарным оператором, и предложенный в комментариях трюк с логическим оператором && только ухудшат читабельность.

    Использование конструкции if - это совершенно нормальная практика. И думать, что так пишут только "по-старинке" - это какая-то дурацкая фантазия.

    В принципе варианты сократить код всегда есть. Но для этого надо приводить конкретный пример.
    А для вот такого общего случая и ответ будет общий - все оставить как есть.
    Ответ написан
    Комментировать
  • Нужно ли ставить на VPS php-fpm?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Здесь, как всегда, набежала куча народу, которая слышала звон, да не знает где он. И думает, что php-fpm - это, видимо, такой типа модуль для nginx.

    php-fpm, на данный момент - это единственный (ок, ок, из широко распространенных) вариант использовать РНР на веб-сервере. С любым сервером НТТР. И нет, php-fpm не имеет никакого отношения к Nginx, это совершенно отдельный менеджер процессов, который работает с любым веб-сервером.

    Поэтому надо уточнить, не стоит ли он уже. Потому что устареший вариант конфигурации Апач + mod_php был объявлен нежелательным уже лет 5 тому назад. И хотя работать будет, но во-первых, говорит о квалификации установителя, а во-вторых, под большой нагрузкой будет ложиться. Поэтому желательно использовать именно php-fpm, а уж с Апачем или Энжинэксом - это скорее вопрос вкуса в данном случае.

    Если же ожидается 10 пользователей в день, то без разницы, можно оставить как есть.
    Ответ написан
    Комментировать
  • Как правильно соединить при выдаче 2-3+ разных таблиц с одинаковой структурой в единую выборку?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сделать вместо этого зоопарка ОДНУ таблицу.
    Ответ написан
    2 комментария
  • Как синхронизировать данные о подписки между своей базой и apple?

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

    Вот у цветочков с пчелками все точно также (с)
    Ответ написан
  • Как передать переменную из html в sql запрос python?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам надо на время оставить программирование и изучить две гораздо более важные вещи:
    Во-первых, надо научиться структурно мыслить. В частности, разобраться, что ваш вопрос состоит из двух совершенно разных, никак не связанных между собой частей:
    1. как в Flask получить данные формы
    2. как передать переменные в sql запрос

    А во-вторых, научиться пользоваться интернетом. Потому что ответов на оба эти вопроса, в том числе и на данном сайте, просто миллионы.
    На первый (ссылка из ответа на qna.hab.com): https://flask.palletsprojects.com/en/1.1.x/quickst...
    На второй: https://qna.habr.com/q/1002781
    Ответ написан
    Комментировать
  • Как передать в функцию с sqlite запросом, название переменной?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Во-первых вам надо научиться не путать имена колонок в SQL с переменными в Python.
    А во-вторых послушать Сергей Горностаев
    И сделать примерно так.
    def test(user_id):
       cur.execute("UPDATE users SET sqlid = sqlid - 10 WHERE user_id = ?", (user_id))
       conn.commit()
    test(345723)


    А если вдруг вы решили, что sqlid надо обязательно передавать через переменную, то внятно объяснить, почему вы так считаете.
    Ответ написан
    Комментировать
  • Где правильно выполнять проверку try/catch для внешних api в Laravel?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как вам правильно написали в комментариях, в общем случае ловить исключение надо конечно в сервисе.
    Иначе у ваших компонентов будет высокая связанность (copuling) компонентов, а надо чтобы она была наоборот - низкая. "Все, что случилось в Вегасе, осталось в Вегасе".

    Если ловить в контроллере, то вы увязываете вместе уже 4 разные сущности:
    - внешний сервис
    - Газл
    - сервис
    - ещё и контроллер
    Не многовато?
    Получается, что контроллер должен что-то там знать про всех троих предыдущих. А он по идее должен знать только про непосредственного собеседника - сервис.
    Так что ответ тут в общем случае очевиден.

    Также в комментариях вы пишете, что контроллер у вас общается с несколькими сервисами. Это понижает его связность (cohesion). А она наоборот, должна быть высокой. В смысле он должен делать что-то одно.
    Поэтому решение, опять же, очевидно - все эти пертурбации с передачей горячей картофелины из сервиса в сервис должны производиться еще одном сервисе. Потому что это безнис-логика. А в конроллере не должно быть бизнес-логики. Контроллер - это чисто брокер НТТР запросов. Принять данные, проверить их, и передать в модель. То есть туда, где пишется бизнес-логика - все эти "сходить в тот сервис, передать в другой и сообщить третьему".
    Ответ написан
    1 комментарий
  • Не работает бд в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если вы считаете, что данные не заносятся в БД, то на это может быть две причины
    1. Ошибка при занесении.
    2. Все заносится, но вы просто не там смотрите.

    Чтобы исключить первый пункт, надо убедиться в том, что вы можете видеть все ошибки. Для этого на локальном сервере надо включить отображение ошибок на экран. Плюс настроить РНР, чтобы он не скрывал никакие ошибки
    <?php
    # Ошибки
    # Для локального сервера
    ini_set('display_errors', 1);
    # Всегда
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
    # дальше пишем сам код
    $login = trim(filter_input(INPUT_POST, 'login'));
    $password = filter_input(INPUT_POST, 'password');
    
    if (mb_strlen($login) < 4 || mb_strlen($login) > 15) {
      exit("Логин не должен быть короче 4 символов и больше 15");
    } else if (mb_strlen($password) < 8 || mb_strlen($password) > 100) {
      exit("Пароль не может быть короче 8 символов и больше 100");
    }
    $password = password_hash($password, PASSWORD_DEFAULT);
    
    $mysql = new mysqli('176.107.160.36', 'limbo', 'Fear333M', 'vanilla');
    
    $stmt = $mysql->prepare("INSERT INTO `sait` (`login`, `password`) VALUES (?, ?)");
    $stmt->bind_param("ss", $login, $password);
    $stmt->execute();

    Кроме настройки ошибок я еще выкинул бессмысленный код и поправил кривой, в том числе в плане безопасности.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам же пишут, с двумя восклицательными знаками: InnoDB buffer pool / data size: 128.0M/5.1G
    128 метров - это значение по умолчанию. А должно быть 90% памяти, выделенного для БД
    И этой памяти должно хватать для всех индексов

    Собственно, вот же оно написано вам прямым текстом:
    Variables to adjust:
        join_buffer_size (> 256.0K, or always use indexes with JOINs)
        performance_schema = ON enable PFS
        innodb_buffer_pool_size (>= 5.1G) if possible.
        innodb_log_file_size should be (=16M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.


    Только если памяти действительно 4 гига, то не надо делать 5.1. 3.5 будет достаточно
    Ответ написан
    5 комментариев
  • Проверка на пустой файл в пост форме?

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

    При этом надо определиться - зачем загружается несколько файлов. Если речь об одном файле, то зачем делать 4 поля ввода? Если нужно несколько файлов, то почему проверяется только один? Проверять тогда надо все, в цикле.

    Вообще всегда полезно читать инструкцию перед тем как садиться что-то делать. Или хотя бы после того как ничего не заработало.
    Ответ написан
    2 комментария
  • Что лучше сейчас использовать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вообще-то ПМА - это самый отстойный клиент для работы с БД
    Я не понимаю, как люди вообще им могут пользоваться.

    Берете любой локальный клиент (в идеале PHPStorm, но можно хоть Workbench) и настраиваете доступ к удалённой БД серез SSH.

    Вот только NGINX тут совершенно не при чем. К базам данных эта программа не имеет ни малейшего отношения
    Ответ написан
    Комментировать