Задать вопрос
  • Не получается с кодом php для бота Telegram?

    @MadridianFox
    Web-программист, многостаночник
    Если вы хотите сделать по настоящему разговаривающего бота, то простым кодированием условий тут не обойтись. Необходимо использовать методы машинного обучения, которые в большинстве своём подразумевают преобразование текста в более машинно-понятный язык, например, N-граммы или тот же soundex..

    Если же это обычный бот - то почему бы не делать как все - команды на латинице со слешем в начале.

    По поводу тех проблем с которыми вы столкнулись: с кирилицей надо работать используя mb_*** функции (можно, конечно, mb_func_overload включить и не париться, но лучше явно использовать мультибайтовые функции).
    Выбор случайного элемента из массива - ну блин, есть функция array_rand(), но и без неё можно было догадаться взять случайное число от нуля и до размера массива и использовать в качестве ключа.
    Ответ написан
    Комментировать
  • Корректно ли реализована DI?

    @MadridianFox
    Web-программист, многостаночник
    В вашем коде нет DI.
    Задача DI - избавиться от жёсткой связи между классами. Т.е. если вы заходите вместо класса DB в классе NeedDB использовать другой класс (ну там тесты гонять или задача такая), то вам придётся редактировать код класса NeedDB. DI - это техника, когда вы "снаружи" определяете какой класс будет использоваться.
    Обычно для этого выделяется какой-нибудь ServiceLocator - объект у которого можно попросить объект нужного класса, и он отдаст его. Более радикальный способ - всегда передавать зависимости через конструктор. Этот способ идеологически более чистый, но и более навязчивый, т.к. вам надо всегда протаскивать зависимости через конструктор.
    Ответ написан
  • Как обратиться к единственному элементу массива не зная его ключа?

    @MadridianFox
    Web-программист, многостаночник
    current($arr) или end($arr)
    Ответ написан
    Комментировать
  • Yii2 Как сделать правильный запрос?

    @MadridianFox
    Web-программист, многостаночник
    объедините оба where() метода в один andWhere()
    Ответ написан
    Комментировать
  • Как правильно поступить при сохранении batchInsert?

    @MadridianFox
    Web-программист, многостаночник
    Ну так они и не будут удаляться. Вы же их не удаляете, только дописываете.
    Я для себя выделил два подхода для таких случаев:

    1) Чисто но сложно. Берём список категорий товара из базы и с помощью array_diff дважды сравниваем его с тем что пришло из формы. Один раз array_diff($cats_from_form, $cats_from_db), второй раз аргументы меняем местами. Эта функция возвращает элементы второго массива, которых нет в первом или как-то так, точно не помню. Таким образом мы получаем список категорий которые пользователь добавил и их надо записать в базу, и список категорий которые пользователь убрал - и их надо удалить. Дальше просто делаем бачИнсерт по одному массиву и делит по другому.

    2) Грязно но быстро. Просто удаляем все категории товара и заново инсертим все категории что пришли из формы.

    На самом деле первый способ имеет смысл применять только если запись связи товара с категорией "ценная" и хранит что-то кроме внешних ключей на эти две таблицы.
    Ответ написан
  • PHP: Почемгу round некорректно округляет до двух знаков?

    @MadridianFox
    Web-программист, многостаночник
    Округляет он правильно. Числа хранит "неправильно". Это связано с тем, как float хранится в памяти. Во многих языках программирования есть такая проблема, что якобы ровное число, будучи float становится больше или меньше целого на один бит.
    Как этого избежать не знаю. Когда сам с этим столкнулся, сделал костыль в виде конвертирования числа в строку, почему-то некоторые строковые функции умеют обходить эту проблему.
    Ответ написан
    Комментировать
  • Почему после нажатие на кнопку license возвращается в форму email и не выводит email?

    @MadridianFox
    Web-программист, многостаночник
    Очевидно - отправляя license форму вы методом post отправляете поля license и licensebutton. Вы не отправляете email.
    При этом как-то меняете вывод только если передано поле loginbutton.
    Не передано loginbutton - вывод не меняется. По умолчанию у вас показывается email-форма.

    Кстати вы не показали как вы работаете с объектами классов Email и LicenseKey. Совершенно непонятно зачем вы делаете это классами, зачем вы в этих классах код пишете в устаревших конструкторах, зачекм вы наследуете классы друг от друга.
    Ответ написан
    Комментировать
  • Как ускорить обработку запроса к бд?

    @MadridianFox
    Web-программист, многостаночник
    Что касается производительности, то вы столкнулись с проблемой N+1 запроса.
    Это когда вам надо получить список записей и для каждой из них вы делаете дополнительный запрос к БД. 900 записей? Ок, будет первый запрос + ещё 900, по одному на каждую запись.
    Быстрее может быть выполнить всего два запроса. Первый берёт записи, а второй берёт все дополнительные данные сразу для всех записей и потом уже на стороне php вы в цикле засовываете данные в каждую запись.
    Вот абстрактный пример:
    $shops = query("Select * from shop where city='Moscow'");
    $shops = indexBy("id",$shops);
    $employes = query("Select * from employe join shop on(shop.id = employe.id_shop) where shop.city='Moscow'");
    foreach($employes as $eml){
        $shops[$emp["id_shop"]]["employes"][] = $emp;
    }
    Ответ написан
    1 комментарий
  • Как можно после нажатие на кнопку поевилась другой дизайн, примрр как у gmail, сначала нада подтвердить емейл а потоп появляетца пароль?

    @MadridianFox
    Web-программист, многостаночник
    А зачем вам $count, если вы можете решать что показывать сразу глядя на $_POST["email"].
    Т.е.
    if(isset($_POST["email"])){
       //....
    }else{
      //...
    }

    А вопрос требует уточнения. Многошаговую форму можно делать по-разному. Гугл так вообще может делать всё на JS и AJAX.
    Ну а концептуально, если хотите на перезагрузке страниц делать - да, либо форма каждый раз отправляется на текущую страницу и каждый раз добавляются новые данные, либо у вас есть несколько страниц, на каждой форма и они последовательно друг на друга отправляются. Данные между формами либо через скрытые поля передаются, либо собираются в сессию.
    Ответ написан
    Комментировать
  • Как передать данные с PHP сервера устройствам?

    @MadridianFox
    Web-программист, многостаночник
    Очень сильно зависит от того что вы хотите передать. На php можно сделать сервер, куда все три телефона шлют Http запрос, и один из них делает запрос, который кладёт в БД какие-то данные, а другие два - читают.
    Если вы хотите, чтобы сервер инициировал передачу данных другим телефонам, то нужно socket соединение. На php это, конечно, сделать можно, но преимуществ у php относительно других языков в этой области нет. Есть даже стереотип, что соккеты на php хуже чем на других языках.
    В любом случае, сначала надо определить какие данные вы хотите передавать и как концептуально эта передача будет осуществляться.
    Ответ написан
  • Почему apache на ubuntu не показывает php ошибки?

    @MadridianFox
    Web-программист, многостаночник
    Надо в php.ini включить вывод ошибок. Смотрите в сторону display_errors и display_startup_errors
    Ответ написан
    Комментировать
  • Как подключать классы в рантайме в PHP?

    @MadridianFox
    Web-программист, многостаночник
    Как уже написал Stalker_RED, класс не обязательно юзать. Можно просто обратиться к нему по полному имени. Полное имя класса - это неймспейс + имя класса.
    Т.к. вы будете создавать объект класса на основании каких-то данных, то рано или поздно всё сведётся к тому, что вы запишете полное имя класса как строку в переменную и потом используете эту переменную для создания объекта.
    function makeObject($class_name){
        $full_class_name = "\\app\\some_strategy\\" . $class_name;
        return new $full_class_name();
    }

    Кроме того, Melkij упомянул паттерн проектирования, который используется как раз для инкапсуляции логики создания объекта на основании каких-то данных. В зависимости от предметной области, и того, как создание таких объектов в неё укладывается, есть смысл рассмотреть такие паттерны как Factory Method и Abstract Factory.
    Ответ написан
    Комментировать
  • Как вытащить значения из статичной функции?

    @MadridianFox
    Web-программист, многостаночник
    Что касается передачи функции с предзаполненными аргументами, то это похоже на каррирование, которое можно сделать через замыкание.
    Вызов статического метода ClassName::funcName() вернёт функцию, которую можно будет вызвать.
    class ClassName
    {
      
      function static funcName($param1, $param2)
      {
        return function() use($param1, $param2){
              mysqli_query("SELECT * FROM tablename WHERE name = $param1 AND id = $param2");
        }
      }
      function funcNameSecond()
      {
        $parametrizrd_func = ClassName::funcName("John", 1);
        $res = blablabla->cache($parametrizrd_func); 
      }
    }
    Ответ написан
    Комментировать
  • Php compressor namespace api?

    @MadridianFox
    Web-программист, многостаночник
    Попробуйте в конце неймспейса обратный слеш поставить. Экранированный, конечно же.
    Ответ написан
  • Как отладить header в php?

    @MadridianFox
    Web-программист, многостаночник
    Да. в консоли браузера вкладка Network обычно.
    Но тут и так видно что что-то не так. Какой именно заголовок вы хотите установить?
    Например редирект делается вот так
    header("Location: http://banana.com");
    У каждого заголовка есть название, а у вас его нет.
    Ответ написан
    Комментировать
  • Насколько внешние ключи любят ресурсы?

    @MadridianFox
    Web-программист, многостаночник
    Смотря какие ресурсы. Внешний ключ, а точнее индекс по полю внешнего ключа ускоряет поиск по таблице. Т.е. когда вы делает запрос
    select * from my_table where creator = 123456
    полного перебора таблицы не происходит. СУБД по индексу этой таблицы сразу берёт нужные строки.
    Отсюда - меньшее потребление процессорного времени, но большее потребление диска, т.к. индекс это тоже файл.
    Ответ написан
  • Проблемы с сайтом после переноса в digital ocean?

    @MadridianFox
    Web-программист, многостаночник
    В конфиге php. Раньше у вас просто уровень вывода ошибок был не таким строгим, и попытки получить доступ к несуществующим элементам массива не отображались.
    Ответ написан
    Комментировать
  • Не могу передать $test1 с класса Test1 в Test2, «помогите» пожалуйста?

    @MadridianFox
    Web-программист, многостаночник
    Нельзя называть метод класса так же как класс, т.к. это устаревший синтаксис создания конструктора класса. Вместо этого надо конструктор всегда называть __construct.
    К приватным и защищённым полям класса нельзя обращаться снаружи. Либо делайте поле публичным, либо делайте т.н. геттер (getter) - метод, который отдаёт значение из этого поля.
    Во втором классе вы пытаетесь в поле этого класса положить значение из другого поля этого же класса, но в этом классе нет поля test1, это поле определено в первом классе.
    Объект класса - это коробка. Внутри коробки вы можете оперировать только тем что в ней лежит - полями класса, или же тем, что было в эту коробку засунуто - через аргументы методов.
    // файл Test1.php
    class Test1
    {
        private $test1; // приватное поле. к нему нельзя просто так обратиться
        public function __construct()
        {
            $this->test1 = 5;
        }
    
        public fucntion getTest1()
        {
            return $this->test1;
        }
    }
    // файл Test2.php
    require "Test1.php";
    
    class Test2 extends Test1
    {
        private $test2;
        public function __construct(Test1 $test1)
        {
           $this->test2 = $test1->getTest1();
           // echo $this->test2; // сайд-эффекты в конструкторе крайне нежелательны
        }
    
        public fucntion doIt()
        {
            echo $this->test2;
        }
    }
    $test1 = new Test1()
    $test2 = new Test2($test1);
    $test2->doIt();
    Ответ написан
    Комментировать
  • Как подключить функцию PHP foreach в отдельный файл?

    @MadridianFox
    Web-программист, многостаночник
    function getDeliveryArr(){
        return explode(",", $product['delivery']);
    }
    
    $items = getDeliveryArr();
    ?>
    <?if(count($items)):?>
        <label>Доставка:</label>
        <?foreach($items as $item):?>
            <span> Значение <?=$item?> </span>
        <?endforeach?>
    <?else:?>
        <b>Список пуст</b>
    <?endif?>
    Ответ написан
  • Не работает контроллер yii2?

    @MadridianFox
    Web-программист, многостаночник
    Если вы в конфиге не указали другой паттерн, то заходить надо на localhost/user/login
    Ответ написан