• Как правильно написать метод модели с динамическими полями?

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

    Начнем с того, что это никакая не модель.
    Модель - это вся бизнес-логика приложения.
    А это примитивный класс для манипуляции одной таблицей в базе данных. Подходит под паттерн TableGateway

    Причем никакие преимущества ООП в нем не используются.
    Этот класс - тупо набор функций. Причем для следующей таблицы придется писать точно такой же.

    Соответственно, сначала надо сделать код универсальным, и вынести в абстрактный класс.
    Заодно исправив в нём одну критическую ошибку (с безопасностью) и одну логическую.
    Что будет, если значения двух последних элементов массива совпадут? Тогда уж надо ключи сравнивать, а не значения.
    И зачем вообще такие ухищрения с поиском последнего элемента, если у тебя есть переменная $fields? Если она пустая - значит это первый оборот цикла. Всё, этого достаточно

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

    abstract class AbstractTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(DB $db)
        {
            $this->db = $db;
        }
        public function update(array $params): void
        {
            $this->validate($params);
    
            $set = "";
            foreach($params as $key => $value)
            {
                if ($key !== $this->primary)
                    $set .= ($set ? "," : "") . "`$key` = :$key";
                }
            }
            $sql = "UPDATE `$this->table` SET $set WHERE `$this->primary`=:$this->primary";
            $this->db->query($sql, $params);
        }
        protected function validate($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode(",",$diff));
            }
        }
    }


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

    После этого уже можно создавать класс юзер (и не повторять, как попугай, user user по 10 раз)

    class UserGateway extends AbstractTableGateway {
        protected $table = 'users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
        protected $primary = 'user_id';
    }


    И спокойно к нему обращаться в коде

    $user = new UserGateway();
    $user->update($params);
    Ответ написан
  • Как сделать автозапуск функции при создании нового экземпляра класса?

    @Che603000
    c 2011 javascript
    class User{
       constructor(){
            this.autoRun();
       }
       autoRun(){
              // запустится при создании класса 
       }
    }
    Ответ написан
    Комментировать
  • Как обновить Joomla 3.3.6?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Вчера буквально обновлял с 2.5.28 до 2.9.22. Пакеты (Full) можно устанавливать как расширения. Джумла понимает это и обновляется. Сначала 3.2, потом 3.6.5, затем уже штатным способом она должна увидеть 3.9.22. Если не помогает, после 3.6.5 можно промежуточную 3.8. найти и поставить.
    Ответ написан
    Комментировать
  • Платежная система для сайта?

    Юзайте прямой эквайринг у банка, где у вас есть счет
    Ответ написан
    Комментировать
  • Как изменить БД на innodb?

    @starbart Автор вопроса
    Прогер без стажа
    Может быть кому пригодится !
    В консоли mysql выполнять эти шаги не удобно, поскольку результаты Вы получите строки с "пайпами" (символ "|" ) в начале и конце строки. Для баз данных с 100+ таблиц это очень не удобно.

    Выполните следующий запрос в PhpMyAdmin:
    SET @DATABASE_NAME = 'имя_бд';
    
    
    SELECT  CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') AS sql_statements
    FROM    information_schema.tables AS tb
    WHERE   table_schema = @DATABASE_NAME
    AND     `ENGINE` = 'MyISAM'
    AND     `TABLE_TYPE` = 'BASE TABLE'
    ORDER BY table_name DESC;


    Результат копируем и вставляем в новый запрос, желательно между тэгами:
    begin transaction;
    результат вставить сюда
    commit transaction;


    Единственно, я поменял begin transaction на BEGIN и соответственно COMMIT
    Ответ написан
    Комментировать
  • Какой модуль личного кабинета есть на Joomla?

    Serhioromano
    @Serhioromano
    Web Developer
    www.joomlaplus.ru

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

    Еще одни недостаток счета, это занимает больше времени и кликов, что по дороге теряет клиентов. Ведь передумать так глегк.

    Так же ни кто не хочет что бы его деньги валялись без дела гед то на балансе чегото. А если ты положил и сразу все еспользовал, то зачем баланс и усложнять все, не лучше ли сразу просто оплатить что надо?

    Так что я рекомендую использовать связку Cobalt - Emerald и без личного счета. Просто если что то надо пошел и купил.
    Ответ написан
    Комментировать
  • Как сделать whitelist PHP функций в eval()?

    @bkosun
    Никак, это невозможно.

    Вам нужна песочница, или виртуальная машина.

    $options = array(
      'safe_mode'=>true,
      'open_basedir'=>'/var/www/users/jdoe/',
      'allow_url_fopen'=>'false',
      'disable_functions'=>'exec,shell_exec,passthru,system',
      'disable_classes'=>'myAppClass');
    $sandbox = new Runkit_Sandbox($options);
    
    $sandbox->ini_set('html_errors',true);
    
    // ...
    
    $sandbox->eval('var_dump(isset($foo));');


    https://php.net/manual/ru/runkit.sandbox.php
    Ответ написан
    2 комментария
  • Content builder Yootheme для Joomla перекрывает content плагины, как быть?

    @Ilyaploskov
    Привет. Тоже с этой проблемой сталкивался. Последние обновления было это "Add content events to builder pages for plugin compatibility (Joomla)" , но по моему не все плагины обрабатываются пока что. Какой конкретно плагин надо вывести?
    Ответ написан
    1 комментарий
  • Чем логгировать нагрузку на процессор?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    nagios, zabbix
    Ответ написан
    Комментировать
  • Какое расширение каталога/магазина для Joomla отвечает современным стандартам верстки?

    Royamov
    @Royamov
    seoportal.net
    Для интернет-магазина на Joomla лучшим решением считаю JoomShopping: благодаря понятной админке и качественной русской локализации с ним приятно работать. Верстка страниц в шаблоне по умолчанию оставляет желать лучшего, но есть парочка бесплатных и значительно больше платных шаблонов с качественной версткой.
    Ответ написан
    Комментировать
  • Как сгруппировать сумму отрицательных и положительных чисел в одном запросе?

    idShura
    @idShura
    Можно

    select adate, 
           sum(case when val > 0 then val else 0 end) psum,
           sum(case when val < 0 then val else 0 end) msum,
     from mytable group by adate
    Ответ написан
    Комментировать
  • Как найти расхождения в сортировке массивов?

    sgjurano
    @sgjurano
    Разработчик
    Число транспозиций должно подойти.
    Ответ написан
    Комментировать
  • Как найти расхождения в сортировке массивов?

    LaRN
    @LaRN
    Senior Developer
    Можно попробовать вычислить разницу между индексами одного и того же элемента в двух массивах и найти сумму этих разниц для всех элементов. Разницу брать по модулю, чтобы плюсы/минусы не влияли на результат.
    Если в массивах некоторые элементы дублируются, то нужно запоминать индексы уже проверенных элементов чтобы не сравнивать их повторно.
    Ответ написан
    Комментировать
  • Как найти расхождения в сортировке массивов?

    Stalker_RED
    @Stalker_RED
    Если содержимое массивов одинаковое, и отличается только перестановками, то можно применить алгоритм Вагнера-Фишера, или Хишберга если всем операциям кроме транспозиции цену задрать.
    Ответ написан
    1 комментарий
  • Есть ли шанс раскрутить web-проект с нуля?

    @boss_lexa
    Вот появилось у вас идея.
    1. Первое что нужно сделать посмотреть есть ли реализация вашей идеи и кто конкуренты.
    2. Затем оценить что размер рынка большой. (вордстат, публичный статистические отчеты и тд)
    3. Вам нужно понять что проблема действительно массовая и на ее решение есть спрос
    4. Оцениваете продукт конкурентов
    5. Придумываете как ваш продукт может лучше решить проблему чем другие реализации. Тут часто рекомендуют делать интервью/опрос с потенциальными клиентами
    6. Делаете MVP
    7. Запускаете тестовую рекламную компания (Директ, Adwords) или телефонные продажи
    8. Выясняете в правильном направлении вы двигаетесь и что клиенты готовы платить за ваш продукт
    9. Настраиваете аналитику для анализа юнит-экономики
    10. Корректируете рекламную компанию,скрипт продаж, лендинг и тд
    11. Вам нужно получить чтобы привлечение клиента (CAC) стоило дешевле чем доход с него за все время работы (LTV). Как правило пишут что LTV должен быть минимум в 3 раза выше CAC
    12. Если ваша юнит-эконимика сходится и рынок большой, то смело идете к инвестору за деньгами на масштабирование.


    Сделать первые продажи и протестировать юнит-экномику можно и с небольшим бюджетом в одном городе например.

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

    KorniloFF
    @KorniloFF
    Работаю по font-end / JS
    Александр, я понимаю о чём речь. Точно также лет 10 назад начал проект по созданию бесплатных инженерных калькуляторов для строительных расчётов. Они у меня сейчас на сайте как действующие образцы работ - https://js-master.ru/?Калькуляторы
    Не вложил, кроме своего труда, ни копейки. И представляете, почти никого не заинтересовало. Потому что у сытых инженеров давно платный софт стоит, чем они и гордятся. А у студентов - учебные лицензии. Но тут речь была о другом. Когда нужно быстро балку на изгиб расчитать, или плиту на продавливание прикинуть, Лиру со Скадом запускать не будешь. Да и ключа лицензионного может с собой не быть.
    Одним словом, проект заглох, хотя и на сегодняшний день калькуляторы вполне себе рабочие, хоть и считают уже по устаревшим СНиПам.

    Так что ответ - НЕТ, без денег и маркетинга - не получится, 90%.
    Ответ написан
    1 комментарий
  • Есть ли шанс раскрутить web-проект с нуля?

    VELIK505
    @VELIK505
    Руководитель департамента profitcentr.com
    У кого не упираются в толстый кошелёк можно конечно раскрутить но каких то больших сумм дохода ждать не стоит конечно.
    А если не упирается то конечно можно говорить уже и о 6-7 значных суммах.
    Ведь на самом деле в наше время проекты которые раскручены до заоблачных доходов якобы без денег это в 99% случаях враньё. Как правило возможно да у создателя не было денег особо и он запустился но идея(сервис) была настолько лютая и востребованная что сразу подключились инвесторы, возможно под этот же проект бежал и сам брал кредит и тд и тп. ИМХО
    Ответ написан
    Комментировать
  • Как обезопасить сайт работающий с API?

    petermzg
    @petermzg
    Самый лучший программист
    Вы не указали, для каких целей пишете API, а от этого многое зависит.

    API используется как правило, для взаимодействия сервер-сервер. И тогда у вас нет view уровня.
    Капча это view уровень, он не должен иметь отношения к API сервису.
    При таком взаимодействии сразу исчезают проблемы с CRSF и iFrame.

    CRSF - это только безопастность уровня браузер.
    Ответ написан
    Комментировать
  • Где найти честного программиста на почасовую оплату?

    @13hero
    Во первых опытные, хорошие программисты почти не работают на почасовке. Во вторых, перефразируя Ваш вопрос: Где найти честного доктора, который будет делать на почасовке то что Вы ему скажете, а не то что велят ему его знания и клятва Гиппократа. В третьих, "стояние над душой" оно только ухудшает результат, если задача не простая.

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