• Почему после нажатие на кнопку 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
    Ответ написан
  • Как получить доступ к свойству массива объектов?

    @MadridianFox
    Web-программист, многостаночник
    Можно, конечно, пойти на изврат с фигурными скобками, но лучше просто добавьте alias в запрос и не парьтесь.
    SELECT COUNT(user_id) as `count` ...
    var_dump($results->count);
    Ответ написан
  • Xdebug remote server, phpstorm?

    @MadridianFox
    Web-программист, многостаночник
    Тут надо поиграться с настройками xdebug в php.ini. Надо:
    • Включить постоятнную отладку (не по триггеру)
    • Задать статический ip компьютера разработчика (а не connect_back)

    Ну и я думаю можно как-нибудь настроить phpStorm чтобы он игнорировал все отладочные подключения кроме нужного вам файла.
    Останется только ждать, когда кто-то зайдёт на нужную вам страницу.
    Но это будет странно, т.к. реальный пользователь столкнётся с тем, что сайт - хоп, и перестал грузиться т.к. шторм, поймав отладочное соединение пошлёт в него брейкпоинт.

    Однако. Это странно, причём вдвойне.
    Во-первых, сайт должен быть в двух экземплярах - один для разработки и один для пользователей. Тот, который для пользователей не должен иметь xdebug, т.к. он серьёзно влияет на производительность.
    Во-вторых, дебажить запросы от пользователей? Что? Зачем?
    Ответ написан
  • Как выучить/понять ООП паттерны?

    @MadridianFox
    Web-программист, многостаночник
    Не надо учить паттерны. Надо понимать ООП. Чтобы понимать ООП, надо знать зачем оно нужно. Методология/парадигма - это подход к решению проблемы.
    Значит ООП (а это парадигма) решает проблему.
    Эту проблему необходимо ощутить на себе. Для этого нужна практика.

    Мэт Задстра - отличный выбор для начала. Сам с него начинал.
    Однако перед этим надо набить шишки. Только тогда, то, что описано в книге, будет воспринято как полезная информация.
    Перед тем, как прочитать эту книгу я два года говнокодил.
    Прочитал - зашло, подумал что всё понял.
    Прочитал Фаулера. Ничего не понял.
    Через полгода снова прочитал Фаулера. Подумал что теперь то уж точно всё понял.
    Ан-нет.
    Сейчас придерживаюсь взглядов на ООП Егора Бугаенко. Думаю что теперь то уж точно всё знаю.
    Посмотрим что будет дальше.
    Ответ написан
    2 комментария
  • Как лучше сделать функцию Запомнить меня?

    @MadridianFox
    Web-программист, многостаночник
    Привязка текущей сессии с браузеру в PHP происходит как раз через куки. Т.е. это механизм, который по умолчанию используется на миллионах сайтов.
    Да, он не идеален. Любой, кто сможет перехватить то что браузер пользователя отправляет серверу, может взять эту куку, вставить себе и зайти на сайт от лица того пользователя.
    Спасает https, который шифрует передаваемые данные.

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

    @MadridianFox
    Web-программист, многостаночник
    Потому что рекурсия получается. Класс D в методе r() вызывает свой метод b() который унаследован от класса B и который в свою очередь вызывает метод r() и так по кругу.
    Ответ написан
    1 комментарий
  • Как задать JsDoc для анонимной функции?

    @MadridianFox
    Web-программист, многостаночник
    Попробуйте повесить док-коммент прямо на переменную
    angular.forEach(textures, function (texture) {
         /** @var texture ImageType */          
         .....
    })
    Ответ написан
    1 комментарий