Ответы пользователя по тегу PHP
  • Есть ли готовые либы для JS, PHP, C#, Java, ObjC/Swift для манипуляции с датой и временем, типа красиво писать "3 часа назад" и т.д.?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вы хотите одну библиотеку, в которой все языки? Так не бывает, библиотека связана с конкретным языком, но на некоторых языках есть порты. Языков несколько сотен (1, 2), вы хотите, чтобы автор эдакой убер-библиотеки сделал все языки?

    >Но может следует просто взять готовое?
    Конечно, готовое, если уже есть и если приличного качества.
    Stalker_RED показал библиотеки для js и php. Для c# есть https://github.com/Eonasdan/MomentSharp
    Ответ написан
    3 комментария
  • Как сделать мультиязычный сайт?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно все переводимые строки хранить в отдельном массиве. А в шаблоне использовать нужный массив.
    Пример с шаблоном на php и использованием глобальной переменной (для упрощения кода примера):
    $ru = array(
        'site.title' => "Мой сайт",
        'author.name' => "Иванов И.И.",
    );
    $en = array(
        'site.title' => "My site",
        'author.name' => "John Doe",
    );
    $LANG = $_GET['lang'] === 'ru' ? $ru : en;
    
    // где-то в шаблоне:
    <html>
    <head>
        <title><?=$LANG['site.title']?></title>
    </head>
    <body>
        <p><?=$LANG['author.name']?></p>
    </body>
    </html>


    Подобным образом делается на любом фреймворке и/или шаблонизаторе. Приличные фреймворки уже имеют готовые инструменты для создания таких словарей.
    Ответ написан
    5 комментариев
  • Как сгруппировать значения в массиве?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Наверное, вам нужно учитывать событие на всём протяжении длительности события, то есть учитывать его не только в день начала, но и в каждый день, когда оно длится.
    Тогда нужно для каждого события сделать цикл, и для каждого дня в интервале считать это событие:
    $dates = array();
    foreach ($events as $event) {
        $dateStart = \DateTime::createFromFormat('Y-m-d', $event['date_start']);
        $dateEnd = \DateTime::createFromFormat('Y-m-d', $event['date_end']);
        while ($dateStart <= $dateEnd) {
            $date = $dateStart->format('Y-m-d');
            if (!isset($dates[$date])) $dates[$date] = 0;
            $dates[$date]++;
            $dateStart->modify('+1 day');
        }
    }
    Ответ написан
    Комментировать
  • Как правильно обработать данные из mysql БД?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Если бы все данные были в одной записи, можно было бы просто вывести сумму в select:
    SELECT sm1_to+sm1_po1+sm1_po2 AS `hours` FROM full WHERE id_prepodavatel = 1

    Но у вас разные строки (я так понял, по одной колонке заполнены в каждой записи).
    Тогда нужно добавить GROUP BY disciplina и указать sum(sm1_to)+sum(sm1_po1) и т.д.
    Но основная проблема у вас не в этом - вам нужно переделать таблицу и не делать так много колонок. Каждый раз, когда у вас начинаются колонки со странными названиями, всегда возникает вопрос - а правильно ли спроектирована таблица?
    Можно сделать что-то типа такого:
    id int(11) NOT NULL AUTO_INCREMENT,
      disciplina varchar(255) DEFAULT NULL,
      nomer_gr varchar(255) DEFAULT NULL,
      type int(11) NOT NULL,
      hours int(11) NOT NULL DEFAULT 0,
      vakansiya int(11) DEFAULT NULL,
      id_prepodavatel int(11) DEFAULT NULL,
      PRIMARY KEY (id)

    То есть разбить одну длинную запись на множество маленьких, у каждой из которых указан тип.
    И тогда будет очень просто просуммировать через GROUP BY:
    SELECT id_prepodavatel, disciplina, sum(hours) AS `hours` FROM full WHERE id_prepodavatel = 1 GROUP BY disciplina

    Тип записи будет указывать, какие именно часы указаны в этой записи. Можно сделать числовым типом (как я указал выше), а можно сделать enum. В типе и будут все эти ваши sm1_to, sm1_po1, sm1_po2 и другие. Количество строк в таблице увеличится примерно в 20 раз (1500 * 20 = 30000), но в этом нет ничего страшного.
    Заодно, если добавится новая группа, то вам не надо будет менять структуру таблицы.
    Ответ написан
    4 комментария
  • Какую таблицу с юзерами использовать?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    customer - клиент, тот, кто будет покупать у вас на сайте.
    user - пользователь сайта с точки зрения администрирования, то есть тот, кто имеет доступ к админке, человек из вашей команды.
    При регистрации клиенты должны создаваться в таблице customer.
    Но что значит "Какую нужно использовать, когда юзер регистрируется и почему?" - разве они не сами там создаются?
    Ответ написан
    Комментировать
  • Как найти часть массива в массивах?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    так как искомый массив не совпадает с массивами в списке, то он и не находится.
    Вам нужно перебором вашего $arr напрямую проверять, не нашёлся ли нужный.
    foreach ($arr as $i => $a) {
      if ($needle['Alias']==$a['Alias'] && $needle['Parent']==$a['Parent']) {
        // $a - ваш искомый подмассив
        doSomething($a);
        break;
      }
    }

    Если в массиве-списке может быть несколько совпадений, то убрать команду break;
    Ответ написан
    Комментировать
  • Какой есть portable server, который можно использовать для одного конкретного проекта?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Denwer
    Работает даже с флэшки и cdrom.
    Не требует прав Администратора для запуска дефолтного сайта (localhost). С правами администратора поддерживает кучу сайтов, каждый в своём домене (http: //site1/, http: //site2/)
    Ответ написан
  • Как получить имя и директорию загруженного файла?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    А вам для чего это нужно сделать? просто чтобы понять, где оно лежит, или записать дополнительно в базу?
    Посмотрите вот этот раздел документации: Custom logic, и связанный с ним раздел Events.
    В этом документе описано, как создать обработчик события записи файла, этот обработчик будет автоматически вызываться при каждом сохранении файла, и там можно сделать что-то с этим файлом.
    Ответ написан
    Комментировать
  • При нескольких одновременых вызовах скрипта некоторые запросы выдают пустую страницу. Что не так?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    В ошибочном ответе нет ваших хедеров, которые задаются скриптом. Может быть, что-то вызывает ошибку, начинается отдача контента, и хедеры уже не отправляются.
    Я так понял, до указанного кода есть другой код?
    Это скрипт на простом php, вне yii?
    Сколько файлов в вашей папке с изображениями?
    Напишите первой строчкой скрипта (если ещё нет такой строчки):
    ob_start();
    И скажите, начнут ли появляться ваши хедеры в браузере в этих ошибочных загрузках.
    Перед fpassthru добавьте ещё
    ob_end_clean();
    Ответ написан
  • Чтение и запись файла, как заблокировать на время перезаписи?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам нужны семафоры. Заведите в каком-нибудь месте специальный флаг, что файл занят. Перед обработкой файла устанавливаете флаг, после обработки снимаете. Другие клиенты перед запросом файла проверяете флаг, и если установлен, то делаете то, что нужно.
    Флаг можно ставить в каком-нибудь быстром key-value хранилище - memcached, Redis, APC, MongoDB, обычную базу в спец.табличку. На крайний случай - в отдельный файл.

    А можете рассказать, зачем такой странный кейс - запрещать чтение? что будут делать другие клиенты, если читать нельзя? Ждать? А сколько времени происходит обработка данных?
    Пока данные не обновились, почти всегда вполне допускается отдавать предыдущую версию. Данные читаете, обрабатываете в памяти ил отдельном файле, и записываете. Зачем запрещать чтение в это время?
    Ответ написан
    Комментировать
  • Как сделать авторизацию в чате node.js + socket.io на сайте, использующем PHP?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    1) запрашивать из ноды скрипт на php, который будет говорить, авторизован ли пользователь. (лёгкий способ)
    2) хранить в общей базе данных сессии (токен сессии), так что из ноды легко узнать, авторизован ли пользователь (хороший способ)
    3) Реализовать в ноде тот же способ авторизации, что и в php. (плохой способ - придётся повторно запрашивать пароль для входа в чат)
    4) использовать Redis PubSub для обмена информацией между php и node. (плохой способ - в php придётся постоянно запрашивать данные, нет ли в канале нового запроса)
    Ответ написан
    2 комментария
  • Как сделать условие SWITCH в PHP, если не знаешь какое будет значение у переменной?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    switch здесь не подходит. Ну разве что у вас на 10000 разных значений 10000 разных обработчиков. Но в таком случае тем более не стоит использовать switch, нужно использовать какой-то класс (группу классов), иначе поддержка этого станет адом.
    if ($A < 100) {
      // делаем работу если 1<=A<100
    } elseif ($A < 200) {
      // делаем работу если 100<=A<200
    } elseif ($A < 500) {
      // делаем работу если 200<=A<500
    } elseif ($A < 1000) {
      // делаем работу если 500<=A<1000
    } else {
      // делаем работу если А>1000
    }
    Ответ написан
    Комментировать
  • Какую легкую IDE выбрать для php?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Netbeans - лёгкой её не назвать (достаточно ресурсоёмкая), но покажет вам ошибки, подсказки по функциям и их аргументам. Начать пользоваться достаточно пользоваться. Бесплатная.
    PhpStorm тоже хорош, но он платный.
    Если из очень простых программ - то Notepad++. Он умеет мало чего (подсветка синтаксиса, плюс кое-какие инструменты обработки текста), но очень простая и лёгкая - в смысле, запускается мгновенно, памяти не требует. Но советую сразу привыкать к нормальным инструментам - Netbeans.
    Ответ написан
    4 комментария
  • Как заменить пробелы на тире в htaccess?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам нужно использовать RewriteCond перед RewriteRule и проверять наличие пробела. Что-то типа этого. И тогда уже либо перенаправлять на свой скрипт, который будет редиректить на нужный урл, либо как-то переделать url в самом апаче (тут не подскажу, но наверное можно).
    RewriteCond %{REQUEST_URI} %20
    Ответ написан
    Комментировать
  • Как правильно писать php вставки в tpl файлах?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Код выше вполне нормальный. Последние две строчки можно объединить, на работе скрипта это не скажется. Но тут есть один момент. Шаблон - это обычно html-текст, и php-инструкции в нём чужеродные (с точки зрения html), и даже расширения таких файлов обычно делают не .php, а .phtml - чтобы подчеркнуть, что это не php-скрипт с кодом. Поэтому в таких случаях используют специальный формат записи php-инструкций, причём обычно пытаются одну команду расположить в одну строчку, и не смешивать php и html в одной строчке. С этой точки зрения лучше не объединять эти две строчки в одну инструкцию php.
    Я обычно не пишу скобки, как в коде выше, я использую второй вариант открытия и закрытия блоков, без фигурных скобок:
    <div id="container">
    <?php if ($count>0): ?>
        <?php foreach($items as $item): ?>
            <div class="item"><?=$item?></div>
        <?php endforeach ?>
    <?php endif ?>
    </div>

    Но лучше поиграйтесь с этим вариантом и переходите на внешний шаблонизатор, например Twig. (вот есть урок по его встраиванию в сайт без фреймворка)
    Ответ написан
    1 комментарий
  • Как с помощью php перебрать все сочетания слов из разных колонок csv?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    сначала помещаем всё в три массива, и потом в тройном вложенном цикле проходим все комбинации.
    $colors = array('желтые', 'зеленые','синие');
    $lengths= array('длинные','короткие','узкие');
    $types = array('штаны','шорты','трусы');
    $strings = array();
    for ($i=0; $i<count($colors); $i++) {
        for ($j=0; $j<count($lengths); $j++) {
            for ($k=0; $k<count($types); $k++) {
                $strings[] = "$colors[$i] $lengths[$j] $types[$k]";
            }
        }
    }
    echo implode('<br>', $strings);
    Ответ написан
    Комментировать
  • Как узнавать о новом в php до выхода версии?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно читать дайджесты по php компании ZFort на хабре. Обычно раз в две недели выходит очередной выпуск, и кроме новинок инструментов и библиотек они обычно рассказывают о предстоящих изменениях в самом php.
    Ответ написан
    Комментировать
  • Почему при парсинге страницы возвращается пустая страница?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    попробуйте вместо
    echo HtmlDomParser::file_get_html($url1);
    написать
    $dom = HtmlDomParser::file_get_html($url1);
    var_dump($dom);

    Так можно будет увидеть, что реально возвращает команда. Будет ли там объект класса simple_html_dom или нет.
    Ответ написан
    Комментировать
  • Что изучить перед написанием простой адресной книги?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вы правильно решили, что для развития вам необходимо написать готовый сайт. Вам это даст гораздо больше, чем просто чтение книг без практики. Но тогда доведите до победного конца - не только напишите сайт, но и заведите домен, арендуйте хостинг и выложите свой сайт туда.
    В начале разработки любого проекта правильно будет взять бумажку с ручкой и записать (зарисовать) схему будущего проекта.
    Чётко запишите на бумаге одним предложением цель проекта. Продумайте используемые технологии и также запишите их на бумагу (php, mysql, ?). Позже вы сможете проанализировать, насколько вы смогли предугадать конечную архитектуру, и поможет в дальнейшем правильнее продумывать эти вопросы.
    Отдельным списком запишите те функции проекта (фичи, features), которые вы хотите реализовать.
    Дальше хорошо бы прикинуть структуру базы данных - какие таблицы планируются и какие поля в них должны быть.
    Только после этого можно приступать к программированию.

    Для начала я посоветую написать этот сервис на чистом php, без использования любых фреймворков. Иначе вы будете завалены новой информацией, которую нужно будет освоить, не связанную с конкретно задачей.
    Вам нужно будет сделать несколько страниц:
    1) главная, также можно добавить страницы о проекте, о команде, и прочие служебные
    2) регистрация и логин (логин можно на главной), по хорошему, ещё и восстановление пароля
    3) список телефонов
    4) добавление телефона
    5) редактирование телефона
    6) удаление телефона (скорее всего, кнопка удаления будет на странице списка, но такую ответственную операцию нужно подтверждать, поэтому - отдельная страница)
    Страницы 3-6 можно реализовать в одном php-файле, используя параметры страницы, а можно сделать и в отдельных файлах.

    Когда сделаете, тогда нужно подумать о развитии получившегося сайта, и начать изменять его:
    1) добавить шаблоны, чтобы разделить html-код (шаблон) и php-код (контроллер)
    2) добавить ЧПУ, чтобы адреса страниц в браузере не содержали .php и ?

    Когда сделаете, тогда уже можно перейти к повторению того же сервиса на одном из фреймворков. Могу порекомендовать микрофреймворк Silex. Вы сможете увидеть, что многие моменты, которые вы раньше делали самостоятельно, уже реализованы в фреймворке. Но та работа была не напрасной, если не знать, как это работает внутри. то сложно понять, почему в фреймворке всё реализовано именно так.
    Ещё из популярных фреймворков можно рассмотреть Laravel и Symfony2. Последний достаточно сложный фреймворк для больших проектов, но он частично похож на Silex (потому что Silex основан на Symfony2). Laravel - новый мощный фреймворк, стремительно набирающий популярность. Он простой для старта, но обладает высокой мощностью, больше, чем Silex.
    Ответ написан
    Комментировать
  • Как добавить на уже работающий сайт контактную форму?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Похоже, у вас сайт самописный, не основан на одной из CMS. Тогда вам нужно добавить страницу с формой обратной связи (или на страницу контактов), и отправлять её на специальный скрипт, который будет обрабатывать эту форму. Делается это очень просто. Обрабатывать можно по разному - можно писать емейл ответственному лицу, можно добавлять в базу данных в отдельную таблицу, и тогда показывать полученные данные в админке (ежели такая у вас имеется).
    Вот вам две инструкции, как сделать простые формы: раз и два.
    Ответ написан