• В чем проблема добавления в BD?

    @MadridianFox
    Web-программист, многостаночник
    А вот и буду кидаться палками, ловите сразу 4 =)
    1) Вы хотите отправить ajax запрос, но вы делаете форму и работающую (button type="submit") кнопку отправки. Не надо так. Либо форма, либо ajax.
    2) JS код, который вешает обработчик на кнопку располагается выше самой кнопки и не обёрнут в $(document).ready. Т.е. в тот момент когда исполняется этот код, самой кнопки ещё нет, и обработчик нажатия не вешается.
    3) обработчик отправки формы реагирует на isset($_POST['button-reg']), однако когда вы делаете ajax запрос, вы не передаёте параметр "button-reg".
    4) расширение php, которое позволяет вызывать функции mysql_*** устарело. Используйте mysqli или PDO
    Ответ написан
    8 комментариев
  • Возможно ли автоматически парсить информацию не через cron?

    @MadridianFox
    Web-программист, многостаночник
    Ну если вы можете модифицировать сайт, то надо дописать код, так чтобы при публикации статьи она ещё и публиковалась вконтакте.

    Если не можете изменить код сайта - то никак. Остаётся только периодически обращаться к сайту и если там что-то появляется то парсить.
    Ответ написан
    Комментировать
  • Как реализована лента событий в популярных сервисах?

    @MadridianFox
    Web-программист, многостаночник
    Чем вас не устраивает первый вариант и в чём плюсы второго?
    Логика подсказывает, что дублировать пост для каждого юзера, который на него подписан это абсурд.
    Хотите сказать, что если я делаю пост в группу в которой 100к подписчиков, то я сразу создаю 100к записей в базе?
    Количество постов в таблице постов будет больше чем в первом варианте на несколько порядков и это только замедлит выборку.

    Однако, и первый способ гиганты вряд-ли используют прямо так. Постов в соцсетях и так миллиарды. Не могут они храниться в одной таблице так чтобы простой
    select * from posts join subscribe sub on(...) where sub.user_id=123
    выдавал результат за адекватное время.
    Скорее всего там какие-то архисложные индексы строятся, какие-то умные кэши используются, база распределена так, чтобы сотня машин одновременно искала, но каждая машина в своём куске таблицы...

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

    @MadridianFox
    Web-программист, многостаночник
    Т.к. вы вызываете команду из консоли, то очевидно что файл уже должен лежать на сервере.
    Вызывая команду мы можем просто передать ей путь до файла, и далее, имея этот путь мы можем открыть файл и что-то с ним делать с помощью стандартных функций (ну или завернуть в какой-нибудь удобный объект).
    public function actionIndex($filepath){
       $filename = end(explode('/',$filepath));
    
       $file_handler = fopen($filepath); // далее используем дескриптор файла для чтения/записи
       // или
       $file_content_string = file_get_contents($filepath); // сразу читаем содержимое в строку
    }

    Вызывать это дело надо так: php yii MyCommand /path/to/file
    Ответ написан
    Комментировать
  • Как сделать регулярку более сторогой?

    @MadridianFox
    Web-программист, многостаночник
    Надо добавить маркеры начала и окончания строки. Вот так:
    preg_match("/^update\/[0-9]+\/[a-z]+$/", $input_line, $output_array);

    Иначе выражение будет срабатывать на любые строки в которых (в середине длинного текста, например) есть искомый шаблон.
    Ну и слэши явно указать надо.
    Ответ написан
    Комментировать
  • Как правильно составить тест для phpunit и json_encode()?

    @MadridianFox
    Web-программист, многостаночник
    Всё просто - не надо в функции проверки прав печатать ответ.
    Более того, функция проверки прав не должна ничего знать про то - под аяксом она запускается или нет. Она должна просто проверять и возвращать результат (bool, текст ошибки, код ошибки, что угодно), а уже где-то в контроллере (это такое место, где вы получаете данные http запроса, решаете что делать и формируете http ответ) вы должны превращать результат в ответ.
    Ответ написан
  • Namespace в php - как использовать?

    @MadridianFox
    Web-программист, многостаночник
    Сами по себе неймспейсы для подключения файлов не предназначены. Это только способ называть классы короткими именами и разрешать конфликты, если два разных класса имеют одинаковое название.
    Но очень распространён (на уровне стандарта языка) подход, когда функция автозагрузки использует неймспейс как путь до файла с классом.
    Так что смотрите в сторону PSR-4 и функции spl_autoload_register.
    Ответ написан
    Комментировать
  • Знакомый говорит что неправильно. Правильно ли?

    @MadridianFox
    Web-программист, многостаночник
    Первое что бросается в глаза - это то как вы работаете с элементами массивов. Мало того, что вы ключи массива пишете не как строки, а как неинициализированные константы, так ещё и полученное значение в кавычки берёте. Зачем?
    А вообще вопрос очень странный. Надо давать некоторое пояснение - что именно в этом коде, для вас или вашего знакомого, является неправильным.
    Ответ написан
    Комментировать
  • Как "активировать" часть php кода, если пользователь видит блок, в котором находится содержимое этого кода?

    @MadridianFox
    Web-программист, многостаночник
    Важно понимать, что сначала отрабатывает PHP, который формирует и отдаёт html, а уже потом. Браузер, приняв этот html, рендерит его, ну и если у чего-то там display:none, то не показывает этого.
    Вам надо сразу не генерировать этот div. Как это сделать зависит от того кода который у вас уже есть.
    Ответ написан
  • Как разбить запись в cvs из mySQL на столбики в Excel'e?

    @MadridianFox
    Web-программист, многостаночник
    Нади использовать не запятые, а точки с запятой.
    Ответ написан
    3 комментария
  • Как реализовать свойства для разных товаров в интернет магазине?

    @MadridianFox
    Web-программист, многостаночник
    Посмотрите в сторону EAV. Это подход, когда у вас в таблице товаров только самые базовые характеристики, такие как наличие, цена, а специфические хранятся в отдельной таблице, где каждая строка это одно свойство. Ну и ещё одна таблица для названий характеристик. Примерно вот так:
    goods{id, name, price}
    attribute{id, name}
    attribute_value{id, id_attr, id_good, value}

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

    @MadridianFox
    Web-программист, многостаночник
    Сделайте перенаправление не с любого адреса на coming-soon.php, а только с адресов, заканчивающихся на .php
    Ответ написан
  • На каком хостинге делать большой проект?

    @MadridianFox
    Web-программист, многостаночник
    Делайте сразу в контейнерах и размещайте там где они могут запускаться. Если проект взлетит, то без проблем перенесёте в облако. Более того, грамотная работа с контейнерами сразу заставит вас организовать масштабируемую архитектуру.
    В случае с быстрым выжиранием диска, лучше сразу идти в облако. Всякие там S3 с одной стороны могут дать вам условно неограниченное, а главное сразу масштабируемое хранилище. Ну и так же заставят вас использовать чуть более грамотный подход, чем "сразу в лоб" класть файлы на диск, а потом мучиться с масштабированием.
    Ответ написан
    Комментировать
  • Как вывести информацию о Raspberry pi на сайт?

    @MadridianFox
    Web-программист, многостаночник
    Надо чтобы малина отправляла телеметрию на сайт.
    Т.е. на сайте есть специальный эндпоинт, который, ну допустим, принимает json/xml/etc... и пишет значения из него в базу.
    Надо просто периодически делать http запрос, и передавать туда температуру полученную с малины.
    Это можно сделать как самой малиной, если с неё есть выход инет, либо можно держать малину подцепленную к ПК, и пусть ПК уже получает данные с малины и делает тот же запрос на сайт.

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

    Ну и да, было бы неплохо хоть какую-нибудь аутентификацию прикрутить, ато любой вася пупкин сможет передать фейковые данные на ваш эндпоинт =)
    Ответ написан
    Комментировать
  • Как реализовать массив подстановок для запроса в MySQL?

    @MadridianFox
    Web-программист, многостаночник
    Используя ...$arr вы не получите ключи в массиве. Поэтому почему бы не сделать третий агрумент обычным агрументом, и не передавать туда массив, который без изменений будет передаваться в execute?
    public function query($sql, $class, $params){ // $params = [":age"=>20]
            $sth = $this->dbh->prepare($sql);
            $res = $sth->execute($params); // <----
            if (false !== $res) {
                return $sth->fetchAll(\PDO::FETCH_CLASS, $class);
            }
            return [];
        }
    Ответ написан
    Комментировать
  • Как получить количество заказов за сегодня?

    @MadridianFox
    Web-программист, многостаночник
    $day_orders = $db->query("SELECT COUNT(*) as cnt FROM 'oc_order' WHERE 'date_add' >= CURDATE() ");
    echo $day_orders['cnt'];
    Ответ написан
    7 комментариев
  • Как подгружать новости не в хронологическом порядке?

    @MadridianFox
    Web-программист, многостаночник
    Просто используйте постраничную навигацию:
    SELECT *, something FROM `news`
    WHERE (некое условие для фильтрации по категориям) AND  date < "time of page hit"
    ORDER BY `something` ASC
    LIMIT 20, 20

    Я добавил в этот запрос всего два маленьких изменения. Первое - задал смещение для LIMIT, его надо высчитывать на PHP и вставлять в запрос. Первая цифра это просто номер страницы минус один, умноженное на количество постов на странице (page_num-1)*page_size. Вторая цифра - как обычно, количество постов на странице.
    Второе измененеие - добавил в where дополнительное условие: выбирать только те новости, которые уже были в базе, пользователь открыл страницу. Это необходимо, т.к. если в процессе подгрузки новостей добавится ещё одна, то страницы поедут (вы могли замечать это, когда листаете хабр и на следующей странице первым виден последний пост с предыдущей) и какая-то новость задублируется в общем списке на клиенте. Time of page hit должно храниться на клиенте и передаваться на сервер при подгрузке каждой следующей порции данных.

    Этот метод не зависит от того как вы сортируете новости - по дате, рейтингу, любому другому полю... главное чтобы первая подргузка и все последующие сортировались одинаково.
    Ответ написан
    5 комментариев
  • Правильный ли подход к построению архитектуры?

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

    У меня на работе мы создали унифицированную систему (и да, там ключевую роль играют статусы) по работе с разного рода заявками/тикетами/уведомлениями, но этому предшествовало пара лет работы с этим же функционалом, реализованным отдельно.
    Ответ написан
    3 комментария
  • Как узнать какие файлы php сейчас исполняются?

    @MadridianFox
    Web-программист, многостаночник
    В списке процессов должно быть видно что выполняется скрипт.
    Кроме того, вы можете добавить в свой скрипт разного рода вывод в консоль (или сразу в файл), а при запуске скрипта через крон перенаправить вывод в файл. Далее уже этот файл открываете с помощью tail с опцией непрерывного чтения (насколько помню tail что-то такое умеет), ну и в реалтайме наблюдать что выводит скрипт запущенный через крон.
    Ответ написан
    Комментировать
  • Вынесение в трэйты работы с API платёжных систем, можно ли?

    @MadridianFox
    Web-программист, многостаночник
    Платёжные системы потому и можно назвать общим понятием "платёжные системы" потому что они предназначены для выполнения каких-то сходных операций. Если вы хотите иметь возможность подменять их или соединять друг с другом в разных комбинациях - вам необходимо привести их к общему интерфейсу, а все отличия инкапсулировать.
    Только так.. и это бигмак)
    Ответ написан
    Комментировать