• Почему возникает ошибка в PHP?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    1) установить вывод ошибок в индексном файле/единой точке входа:
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    2) читать ошибки во вкладке нетворк.
    Ответ написан
    1 комментарий
  • Как параллельно вывести из 2х баз данные?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    1) Не надо называть контроллером то, что им не является.
    2) Если у вас 2 дб - не надо в одном объекте их инициализировать, нужно создать 2 объекта (по 1 на дб) со своими настройками.
    3) WHERE id - просто шикарное условие.
    4) $_POST, $_GET и вообще сырые данные приходящие с фронтенда в запросы вставлять категорически нельзя. Во первых их надо хотя бы базово валидировать, во вторых для этого есть prepared statements.
    5) Чем вообще обусловлено разделение данных на 2 базы? Похоже что вы что-то не так делаете изначально, на уровне проектирования структуры данных.
    Ответ написан
    5 комментариев
  • Один плохой комментарий — смерть хабраюзеру

    ixSci
    @ixSci
    Карма должна быть сделан как на SO или наподобие. Пока этого не будет многие не будут писать сюда статьи. Какой смысл? Если написать нормальную непопсовую статью, то максимум, что ты будешь иметь это 5-10 плюсов в карму. Один неосторожный комментарий и ты потеряешь 10-15 кармы. Да и фиг бы с ней, да вот ты не можешь писать статьи при низкой карме. Не можешь использовать теги в комментариях и прочее. Система кармы на хабре просто ущербна. Она поощряет попсовые статьи и задвигает нормальные. Более того, писал ты себе писал, а потом взбрело в голову модератору и тебя забанили. Всё, твоих статей больше не существует. Замечательная система! Ну и неугодные сообществу статьи уезжают в черновики очень быстро. А может кто-то их прочитать хотел?
    Вывод: на хабре нет смысла постить нормальные статьи, лучше постить их себе в блог.
    Ответ написан
    5 комментариев
  • Оцените резюме

    ixSci
    @ixSci
    Я бы убрал фотографию, не понимаю зачем её лепить в резюме? А может кому-то просто не понравится Ваш анфас и он просто откинет резюме?

    Потом: большой, богатый, хороший — великолепные эпитеты которые говорят ровно ничего о вашем опыте. Либо будьте более конкретны, либо более лаконичны. Эти эпитеты явно лишние.
    Могу похвастаться
    аккаунтом на StackOverflow

    Похвастайтесь, к чему завлекалово то? Ссылку на профиль сразу и всё.

    основные бла бла
    ещё знаю бла бла

    Что это значит? Знаете хорошо — пишите, что «стандарт знаю наизусть». Чуть чуть касались? так и пишите. Что за «основные» и «еще умею»?

    Русский В совершенстве :)

    Скромнее надо быть, батенька. И смайлы убрать, что за детский сад?

    И, как мне кажется, если не хотите в наукоемкую область решать научные задачи, то и не стоит писать о своих научных достижения в резюме. Кому оно надо?
    Ответ написан
    4 комментария
  • Для чего идеальна MongoDb? Примеры приложений, где монга будет лучше mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Я расскажу Вам про личный опыт, без претензий на истину в последней инстанции...

    Для чего идеальна MongoDb? Примеры приложений, где монга будет лучше mysql?
    Для человека который привык работать с реляционными БД, смириться с логикой и вообще с подобными БД - довольно сложно. Для тех, кто работает с реляционными БД профессионально - сделать это ещё сложнее...

    Если сравнивать с реляционными БД и с оглядкой на конкретно MySQL - монга идеально вписывается там, где структура данных заранее неизвестна. Тут я хотел привести пример, но не смог придумать ни одного дельного примера, после того как начал плотно работать с PostgreSQL... Давайте попробую из практики. Мы один раз применяли монгу в проекте где есть десятки и сотни тысяч товарных позиций и у каждой из них свой уникальный набор различных свойств. На основе уже имеющихся свойств, "соседних" товаров, контентщику предлагался наиболее вероятный набор параметров, которые нужно заполнить, но в любой момент он мог удалить или добавить любое поле и/или множество значений одного из них, например, "Цвет: черный, серый, фиолетовый". Всё это дело попадало под разные динамические фильтры и далее по цепочке... В то время, насколько я помню ещё не было поддержки JSONB-формата у PostgreSQL, по этому мы остановились на MongoDB. Ну и конечно же, желание "воткнуть ультра новую и модную БД в проект" сыграло свою роль...

    Что в монге определённо не нравится (и это не моя "идея", об этом пишут даже в учебниках под монге) - это тотальная денормализация данных. Которая в некоторых случаях может сыграть злую шутку. Например, все комментарии "поста" обычно хранятся прямо в самой сущности поста. Это очень удобно и довольно быстро работает, но... иногда это приводит к полному коллапсу. Особенно, когда у Вас перекрестная ссылочность.

    Безусловно, не редко можно встретить проекты в которых даже в реляционных БД не прописаны, например, внешние ключи и контроля целостности данных как такового нет, но обычно это происходит по следующим причинам:
    1. Очень низкая квалификация администратора БД проекта
    2. В попытке выжать из базы больше производительности, не найдя других методов оптимизации
    3. Данных настолько много, что БД/ключи - начинают "сыпаться", не редко это связано с п.1

    Так же, последние тесты показывают, что PostgreSQL почти не уступает MongoDB даже в её родной среде (на уровне данных в формате JSON). А в некоторых аспектах даже превосходит её... Подробности Вы можете увидеть на некоторых конференциях по Postgres (да, на конференциях по MongoDB, Вы вряд ли увидите, как кто-то будет рассказывать, что [их любимая] монга "хуже" некоторых других движков...). Кстати, поддержку формата JSON стандартизировали (наконец-то) на уровне SQL-стандарта (если я не ошибаюсь) и в самом ближайшем будущем, думаю стоит ожидать полноценную поддержку оного в SQL-базах, в т.ч. поддержку в бинарном виде с возможностью индексации данных (кстати, некоторые SQL-базы уже такое умеют).

    Моё понимание, ответа на вопрос, "когда действительно стоит использовать MogoDB?" звучит примерно так: Исключительно в тех случаях, когда Вы понимаете, что она станет действительно хорошим решением для поставленной задачи и сейчас и в будущем. В моей практике, таких проектов можно было бы насчитать ничтожно мало, а точнее около нуля, особенно с учётом развития некоторых современных SQL-БД и вообще направления "JSON в SQL" в целом. Но, безусловно такие проекты могут быть и есть (в данном случае, не у меня). Но, тут стоит обратить внимание на крайне важный факт - когда всплывает такой проект, что бы адекватно оценить наиболее оптимальную БД под него - нужно знать как минимум пару-тройку SQL-БД, со всеми их особенностями, достоинствами и недостатками... причем не просто "знать", а хорошо знать, "изнутри". А так же знать все характерные черты монги, а так же её особенности, достоинства и т.д. То есть, если Вы задаётесь вопросом, "а хорошо ли впишется монга в проект N?" и не можете найти на него однозначного ответа, вероятнее всего, что в долгосрочной перспективе, в "проект N" она впишется плохо.

    P.S. В заключение, хочу ещё раз напомнить, что "JSON в SQL" - активно развивается... Со всеми вытекающими.
    Ответ написан
    7 комментариев
  • Как заинтересовать человека(студента) в IT?

    edli007
    @edli007
    full stack, team lead
    Сам не захочет, не начнет. Программирование это ад для обычного человека.
    Ответ написан
    Комментировать
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Как понять докер, если ничего не понятно?

    neuotq
    @neuotq
    Прокрастинация
    С Докером все просто, нужно только немного повернуть устоявшуюся логику в мозгах.
    Основная суть и идея это запуск каждого приложения (php, mysql и тд) в своем контейнере. При этом сам php будет думать что запущен как всегда в обычной полноценной ОС. Поэтому контейнер собирают так, чтобы удовлетворить минимальные требования программы которую он будет содержать.
    Вот так ты и запускаешь кучу контенейров и у тебя выходит сухогруз(у докера там кит) с контейнерами. Зачем это все? Для облегчения администрирования и обновления ПО, а так же для минимизации издержек при глюках/падения какой-либо программы.
    Все контейнеры максимально независимы друг от друга, при этом есть механизм когда контейнер завист от другого. Например контейнер phpmyadmin, нет смысл запускать без контейнера mysql или mariadb, работать он не будет.
    Общение происходит в основном через сеть, поднимается внутренняя сеть. Так же конечно через диск, все предусмотрено.
    Когда все сделано как нужно, с системного администратора снимается гигантский труд по отслеживанию обновлений, совместимости этих обновлений и тд.
    Нужна тебе версия php5.6, запустил коннтейнер с ней, нужна php7.1, запустил его, при этом не нужно никаких приключений с обновлением кучи пакетов, возможных конфликтов с другими нужными программами и тд.
    Так же удобно решаются вопросы масштабирования, появляются мелкие удобные бонусы по дополнительной автоматизации , уменьшаются риски падения ОС в целом, падает если что только контейнер и тд и тп, в результате есть реальная возможность даже небольшим проектам добиться у себя около нулевого даунтайма.
    Вот еще послушай Кирилл Мокевнин из Hexlet пытается понятным языком рассказать что это и зачем. И кстати он делает упор на понимания зачем понадобилось думать и какие проблемы решали когда пришли к Докеру, это ключ к пониманию всего другого.
    PS кстати и сам Hexlet крайне советую, они наверное лучшие в рунете для начинающих программистов
    Ответ написан
    1 комментарий
  • Как решить проблему задвоения аккаунтов при регистрации и входе через соц. сети?

    neuotq
    @neuotq
    Прокрастинация
    Если регистрация с email адресом, то по возможности вытаскивать email из соц сетей и автоматически привязывать у пользователя эту соц сеть. Если соц сеть не дает email, то при первом входе насильно требовать завершения регистрации через указания email, далее проверяется есть ли этот пользователь уже в базе - тогда говорим нужно авторизоваться и после логина привязываем соц сеть, если такого email нет, то регистрируем нового пользователя с записью этого email в качестве основного + привязка соц сети + пароль(уже по желанию).
    Ответ написан
    2 комментария
  • Как в MySQL 8 ограничить значение поля в зависимости от значения другого поля?

    Adamos
    @Adamos
    А на февраль у вас, интересно, какие ограничения?
    Не проще хранить реальную дату, а уже из нее брать MONTH() и DAYOFMONTH()?
    Ответ написан
    6 комментариев
  • С помощью функции array_splice в php добавить элемент в конце массива не реально?

    @StockholmSyndrome
    array_splice($password, count($password), 0, 'e');
    Ответ написан
    Комментировать
  • Есть готовый сайт на HTML, CSS, JS, но только на моем ПК, что делать дальше?

    @xonar
    А смысл?
    У вас как я понял только свёрстанный макет сайта. Вы его конечно же можете загрузить себе на хостинг, но что вам именно нужно? Можете натянуть эту вёрстку на вордпресс, чтобы дальше наполнять свой сайт новостями или ещё чем-нибудь. Если же хотите разместить сайт в сети, как портфолио, то есть github pages. У вас странно поставлен вопрос.
    Ответ написан
    6 комментариев
  • Почему php выводит из базы что то одно?

    erge
    @erge
    Примус починяю
    Подозреваю что на выходе , после цикла
    while($row = mysqli_fetch_array($res))
    Result set - $res становится ПУСТЫМ! поэтому второй while его не отрабывает.
    и либо
    - его необходимо наполнить заново, повторно выполнив запрос
    $res = mysqli_query($dbc, $query);

    либо, что более корректно:

    1) заполнить из result set некий массив, далее по коду уже работать с массивом.

    2) на каждом номере класса выполнять запрос
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class

    и далее делать вывод анологично.

    3) что еще более правильное:
    получить из базы список классов, например
    SELECT DISTINCT class FROM `pupils` -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <div class="cl">
          <h3>НОМЕРКЛАССА</h3>


    делаем запрос вида
    SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class


    далее цикл по резалтсету
    выводим
    <h4>ФИО</h4>
    конец вложенного цикла

    выводим закрывающий тэг </div>

    конец первого цикла.

    как-то так... ну код сами напишете ;)
    Ответ написан
    4 комментария
  • Стоит ли идти после 9 класса искать работу php веба вместо учёбы в колледже?

    @Kostik_1993
    Web Developer
    Детский лепет. Идите учиться. Я никак не хочу вас оскорбить, но ваш уровень как человека на данный момент очень низок, это не ваша особенность, а особенность всех подростков вашего возраста.
    Таких как вы в мире разработчиков полным полно, а вот разработчиков с мозгами не много. Эти мозги даются не опытом одного лишь программирования, эти мозги годами закладываются в ходе общего развития (школа, колледж, вуз, у кого-то армия). Если вы откажетесь сейчас от дальнейшего развития то потом его уже не вернуть и не так-то просто нагнать. Я учился в вузе на заочном после колледжа при этом работая программистом и получая неплохую запрлату. Были моменты когда были трудности в учебе и я думал что зачем мне оно все нужно если я и так крутой. Но сейчас я понимаю что то время когда я учился было вовсе неплохим, да мое образование мне не пригодилось, но я получил развитие, понял что я и как могу, научился общаться с разными людьми разных чинов. Обо всем этом я не жалею, а даже наоборот я понимаю что многие вещи мне понадобились в жизни
    Ответ написан
    7 комментариев
  • Обработка изображений товаров для сайта, как правильно реализовать?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Сочетайте все три способа вместе!

    1. На подстраховку задайте в css размеры изображений и чтобы он их обрезал.
    2. Сохраняйте оригинал файла. А уже от этого оригинала генерируйте обрезанные копии для разных частей сайта:

    - Для корзины надо 50х50px
    - Для админки 100х100px
    - Для списка товаров 300х400px
    - Для просмотра товара 1000х1000px и ещё с водяным знаком.

    В таком случае вы папки изображений разделяете на две:
    - original (оригинальные фалы)
    - cache (сгенерированные из оригинала под нужные размеры).

    В дальнейшем можно удалить просто папку cache и сгенерировать новые по нужным размерам из оригиналов папки original без опаски удаление оригинала и опаски потерять оригинал совершив ошибку при обрезке.

    Сохранение оригинала ещё поможет в будущем... Например, если изменится вёрстка и нужно будет пересоздать файлы под другие размеры.

    На Yii для этого есть замечательная библиотека, которая реализует такой подход

    Пример настройки:
    public function behaviors(): array
        {
            return [
                [
                    'class' => ImageUploadBehavior::className(),
                    'attribute' => 'photo',
                    'createThumbsOnRequest' => true, //Создавать при запросе (если файлы из cache удалить, то они снова сгенерируются под новым размерам указаных ниже)
                    'filePath' => '@staticRoot/origin/posts/[[id]].[[extension]]',
                    'fileUrl' => '@static/origin/posts/[[id]].[[extension]]',
                    'thumbPath' => '@staticRoot/cache/posts/[[profile]]_[[id]].[[extension]]',
                    'thumbUrl' => '@static/cache/posts/[[profile]]_[[id]].[[extension]]',
                    'thumbs' => [
                        'admin' => ['width' => 100, 'height' => 70],
                        'thumb' => ['width' => 640, 'height' => 480],
                        'blog_list' => ['width' => 1000, 'height' => 150],
                        'widget_list' => ['width' => 228, 'height' => 228],
                        'origin' => ['processor' => [new WaterMarker(1024, 768, '@frontend/web/image/logo.png'), 'process']],
                    ],
                ],
            ];
        }


    Вы так же можете сделать такой подход со своей написанной библиотекой. Но подход такой достаточно хороший и логичный. На него я бы делал больше упор, чем на остальные пункты.

    3. Лучше не предупреждать что будет обрезано, а в момент загрузке на js показать как будет выглядеть изображение на всех видах верстки. Но можно и просто написать.

    Вообще это идеальный вариант. Вы можете использовать самый простой вариант и работать с простой и удобной библиотекой. Или любой другой популярной написанной на чистом php. Решать вам)
    Ответ написан
    6 комментариев
  • Как быстро развернуть админку и работу с БД на PHP?

    Sanes
    @Sanes
    Напишите на любом php фреймворке. Нет такой админки, которая бы всем угодила.
    Laravel работает на любом хостинге. Нет там ничего тяжелого.
    Ответ написан
    3 комментария
  • Как вывести уведомление после отправки формы?

    ssenj
    @ssenj
    HTML, CSS, PHP, WordPress, Bitrix
    С использованием ajax и jquery это выглядит симпатичнее. Нет перезагрузки страницы и не надо морочиться с куками.
    Ответ написан
    2 комментария
  • Как вывести уведомление после отправки формы?

    @MrFeaf
    PHP-developer
    Например в Symfony для таких задач существуют Flash сообщения, они живут всего один запрос и можно при обновлении страницы (обработки формы) можно выводить любые сообщения во время следующего запроса.

    Есть отдельные библиотеки для создания таких сообщений, например: https://mikeeverhart.net/php-flash-messages/

    Также, можно формы отправлять используя AJAX, тогда вообще не придётся страницу обновлять :)
    Ответ написан
    Комментировать
  • Что за функции вида "???_op@X" в результатах xhprof?

    Если вдруг кому-нибудь будет актуален этот вопрос, xhprof не самым лучшим образом работает с php 5.5. Существует форк uprofiler, в котором этот недочет исправлен.
    Единственное, при использовании переименованного модуля, нужно все вызовы функций xhprof_* заменить на аналогичные uprofiler_*, а константы XHPROF_*, соответственно, на UPROFILER_*
    Ответ написан
    Комментировать
  • Как правильно организовать бандлы в Symfony2?

    alex_dm
    @alex_dm
    Никакой выгоды от разнесения проектов по бандлам вы в данном случае не получите. Поэтому удобней будет положить все три раздела в один бандл, но разнести контроллеры и шаблоны по разным каталогам.

    что-то вроде:

    CompanyName\YourBundle\Controller\Admin\UsersController;
    CompanyName\YourBundle\Controller\Admin\NewsController;

    (для админки)

    CompanyName\YourBundle\Controller\Public\UsersController;
    CompanyName\YourBundle\Controller\Public\NewsController;

    (для публичного раздела)
    Ответ написан
    2 комментария