• Как спроектировать базу данных сайта знакомств на MySQL?

    valerium
    @valerium
    Изобретая велосипед
    1. Если Вы точно уверены, что количество стран не выйдет за десятку, то можно и ENUM, но всё же лучше нормализовать и сделать отдельную таблицу с индексом. Ведь для выборки текстового представления ENUM СУБД полезет в файл и будет там искать его простым перебором. На десятке стран это не критично, но при росте вызовет лаги. Кстати, это один из тех немногих случаев, когда в primary key можно спокойно выбирать тип данных TINYINT :-)
    2. Большинство систем хранения MySQL умеют только B+-tree индексы, так что заморачиваться с выбором между B- и B+-деревьями не стоит, надо просто решить, нужен ли индекс вообще. Для этого нужно знать архитектуру всего приложения. В общих чертах можно описать так, что если по полю будет производиться поиск, то индекс нужен. Не думаю, что кого-то на сайте знакомств будут искать по фамилии (разве что по имени в целях "совместимости"). По дате, скорее всего, тоже будет просто сортировка
    3. Прямо совсем и всегда избегать NULL не стоит. Многие советуют обходиться без него, поскольку для его обработки MySQL использует лишний байт памяти и несколько лишних тактов процессорного времени. Определиться довольно просто: если предполагается, что поле может быть пустым, то NULL лучше оставить и не городить костыли. Если же поле обязано быть заполненным, то лучше написать NOT NULL и задать значение по умолчанию. То есть, например, поле "имя" можно смело писать NOT NULL, а вот для поля "любимая книга" можно и оставить NULL, далеко не все посетители сайтов знакомств дружат с литературой.
    4. Вопрос странный. Нормализация - это приём построения баз данных, позволяющий избавиться от дублирования данных, избежать ошибок. Это промышленный стандарт, можно сказать. Какую подсистему хранения выбрать - зависит уже от свойств хранимых данных. Вообще удобнее InnoDB, так как она поддерживает внешние ключи. Но можно использовать и Memory для чего-то чувствительного к скорости, но нечувствительного к потере.
    Ответ написан
    Комментировать
  • В каком редакторе написана Joomla?

    valerium
    @valerium
    Изобретая велосипед
    Определить по коду, что кодер использовал автоподстановку? Да Вы хиромант, батенька! :-)

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

    valerium
    @valerium
    Изобретая велосипед
    Во-первых, откажитесь от видео-уроков и возьмитесь за учебники. Ни один видео-урок не даст столько знаний и навыков, как хорошая книга. Одно дело - растянутое на полтора часа объяснение того, как написать элементарный "Hello, world!", а другое - хороший учебник, где каждое предложение содержит крупицу новой информации. Плюс видео делает Вас пассивным наблюдателем, а книгу в любой момент можно отложить и попробовать описанное на практике. Плюс, её можно читать на диване ;-) Но это так, к слову.

    Если лень учить, значит, не хватает мотивации. Тут два варианта.

    Первый уже предлагали здесь: найти интересную задачу и изучать технологии под неё. Например, я хочу написать скрипт, который составит список всех возможных шахматных партий хотя бы на 23 хода, изучаю для этого возможности SQL вообще и PostgreSQL в частности, далее в очереди MongoDB. Хотя мне проще, мне в принципе интересно читать тематические учебники.

    Второй вариант - забить. Если вопрос не интересен и к нему не лежит душа, зачем мучить себя? Себя-то ладно, а представьте, сколько мучений испытают те, кто вынужден будет читать Ваш код, написанный без любви?
    Ответ написан
    Комментировать
  • Отображение переменной в одном файле, но отключение в другом?

    valerium
    @valerium
    Изобретая велосипед
    Объявите в первом файле переменную или константу. Из второго файла проверьте, объявлена ли эта переменная или константа. В зависимости от этого, выводите или не выводите текст. Можно ничего специально не объявлять, а проверить существование функции/переменной/константы, гарантированно имеющейся в первом файле.

    Примерно так модули движков убеждаются, что они именно включены движком, а не запущены как отдельный скрипт.
    Ответ написан
  • В какой директории лучше размещать файлы на сервере (php, node)?

    valerium
    @valerium
    Изобретая велосипед
    В принципе можно засунуть куда угодно, UNIX-way и всё такое :-) Но вообще принято класть в /var/www/domain.

    Причём, если позволяют используемые приложения, желательно скрипты положить так, чтобы они лежали отдельно от статики и не могли быть никак доступны извне. Например, скрипты прямо в /var/www, а статика в /var/www/static и в DocRoot сервера прописан именно /var/www/static.
    Ответ написан
    Комментировать
  • Знаете ли Вы PHP скрипт для записи идей?

    valerium
    @valerium
    Изобретая велосипед
    Я для этих целей использую DokuWiki, размещённый на домашнем сервере. Очень простой синтаксис (причём, удобный для русского языка), минимум требований, шустрая работа. Есть множество вариантов авторизации. Правда, нет встроенного механизма для расстановки приоритетов и статусов, но это при желании можно сымитировать.

    Кроме того, не использует БД (только файлы), то есть бэкап делается элементарно.
    Ответ написан
    1 комментарий
  • Как сделать редирект в .htaccess с GET параметрами?

    valerium
    @valerium
    Изобретая велосипед
    У вас фронт-эндом стоит nginx, значит редирект нужно делать его силами. Правила rewrite почти идентичны, подробности в документации. Но, с другой стороны, не уверен, что он умеет обрабатывать переменные из GET, так может быть придётся писать скрипт.
    Ответ написан
  • Как кириллический xsl в mysql через django вставить?

    valerium
    @valerium
    Изобретая велосипед
    Если не ошибаюсь, XLSX хранит данные в цивильном UTF-8. Проверить легко - выведите значение ячейки на печать.

    Upd. Более того, XLSX - это сжатый набор XML-файлов, каждый из которых несёт метку кодировки. И судя по всему, она именно UTF-8, хотя никто не мешает каждый раз проверять её ручками.
    Ответ написан
    1 комментарий
  • Как убрать вывод фатальной ошибки в php?

    valerium
    @valerium
    Изобретая велосипед
    Ряд ошибок невозможно отловить изнутри скрипта, например, E_PARSE (ошибка парсинга) и E_ERROR (ошибка времени исполнения), плюс ошибки самого PHP.

    Однако их и не надо ловить внутри скрипта, для них существуют модульные и интеграционные тесты, а так же стабильные сборки PHP.
    Ответ написан
  • Как спроектировать покупку абонемента?

    valerium
    @valerium
    Изобретая велосипед
    На мой взгляд, лучше организовать схему хранения так.

    В таблице с клиентами есть поле abonement_expiration, в котором хранится дата истечения абонемента. При регистрации туда пишется дата регистрации и проверка абонемента проводится сравнением с текущей датой. Кроме того, здесь же содержится ссылка на реферера.
    CLIENT (
        id_client,
        name,
        email,
        abonement_expiration,
        referer )


    Таблица со списком заказов. Нужна в первую очередь для бухгалтерии, история заказов и всё такое.
    ORDER (
        id_order,
        id_abonament,
        id_client,
        amount,
        status,
        date_order)


    Покупка абонемента оформляется транзакцией, которая состоит из (лень писать код :-)
    1. занесения заказа в таблицу с заказами,
    2. извлечения текущей даты истечения из таблицы с клиентами,
    3. подсчёта новой даты с учётом стоимости абонемента,
    4. занесения новой даты истечения в таблицу с клиентами.

    Операции 2-4 можно оформит одним запросом, но всё четыре в любом случае должны быть одной транзакцией.

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

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

    valerium
    @valerium
    Изобретая велосипед
    Можно сделать небольшой финт ушами и посылать в тексте письма не точное время, а «N минут назад», и в заголовке передавать дату и время отправки с часовым поясом сервера.

    Почтовый клиент получателя, используя данные локальной оси, правильно покажет получателю время отправки, а дальше он уже сам в уме сообразит, в котором часу в действительности произошло событие.
    Ответ написан
    Комментировать
  • 403. Права 777, в .htaccess всё в порядке. Куда копать?

    valerium
    @valerium
    Изобретая велосипед
    Внезапно - это после какого действия? Новая тема? Новый плагин?

    Помимо .htaccess в корне сайта, ещё один .htaccess может лежать по пути к изображениям. Плюс настройки доступа прописываются в разделе VirtualHost главного конфига Apache (если у Вас есть туда доступ). И да, следуя заветам AlexLIn, посмотрите в логи, там может быть стоящая инфа, хотя при 403 ошибке вряд ли.

    P. S. Права 777 - это порочная практика. Когда разберётесь, верните на 644 для файлов и 755 для папок.
    Ответ написан
  • Занесение данных из файла .xml в MySQL?

    valerium
    @valerium
    Изобретая велосипед
    Учитывая, что именно по статусу Вы будете искать очень часто, то имеет смысл их вынести в отдельную таблицу, чтобы поиск по основной таблице был по целому числу.

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

    valerium
    @valerium
    Изобретая велосипед
    Все директивы PHP, которые касаются загрузки файлов, описаны здесь. Если увеличение ни одной из них не помогло, значит, проблема не в PHP.

    Какие ошибки возникают в процессе загрузки?
    Ответ написан
    Комментировать
  • Как отправить файл POST из скрипта?

    valerium
    @valerium
    Изобретая велосипед
    Судя по всему, принимающий скрипт находится вне вашей власти или вам как минимум неьзя его править. Я угадал? :-)

    В документации PHP написано, что он "способен получать загруженные файлы из любого браузера, совместимого со стандартом RFC-1867". В стандарте RFC-1867, в свою очередь, введён тип кодирования "multipart/form-data". Следовательно, чтобы PHP понял, что ему передают не просто переменную в POST, а файл (и пометил его в массив $_FILES), нужно, чтобы клиент передал ему соответствующий тип. Так что можно либо внимательно изучить документ и организовать передачу самому, используя сокеты, либо внимательно изучить документацию в PHP к cURL.

    В PHP 5.5 изменились правила использования cURL, таким образом, чтобы передать файл, нужно использовать объект CURLFile (кстати, в русской версии документации этой страницы нет). В коде это будет выглядеть как-то так (не проверял).

    $ch = curl_init();
    $curlfile = new CURLFile('/home/user/we-are-champions.mp3', 'audio/mp3', 'best-song.mp3')
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlfile);
    $content = curl_exec($ch);
    curl_close ($ch);


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

    valerium
    @valerium
    Изобретая велосипед
    Если предположить, что разделитель заранее неизвестен, то задача становится гораздо интереснее :-) Для конкретности добавим ещё условие: строка состоит из двух чисел и разделителя.

    $input = '46/120';
    
    $i = 0;
    while ($input[$i] >= '0' && $input[$i] <= '9') {
        $i++;
    }
    
    $a = substr($input, 0, $i-1);
    $b = substr($input, $i+1);
    $delimiter = $input[$i];
    Ответ написан
    3 комментария
  • Какой запрос составить для выборки изображений из базы по заданым фильтрам?

    valerium
    @valerium
    Изобретая велосипед
    По сути, что цвет, что ключевое слово - это всё тэги, то есть вполне уместно использовать связь многие-ко-многим. То есть отдельная таблица с изображениями, отдельная таблица с цветами, отдельная с ключевыми словами. И две таблицы для связей, одна связывает цвета с изображениями, другая ключевые слова с изображениями. Таким образом можно делать очень сложные выборки.

    SELECT * FROM `images` WHERE
        `images`.`id` = `keyword-to-image`.`image_id` AND
        `images`.`id` = `colors-to-image`.`image_id` AND
        `keyword-to-image`.`keyword_id` = 234 AND
        `colors-to-image`.`color_id` = 345 AND
        `colors-to-image`.`color_id` <> 543;


    То есть мы получим все изображения, к которым привязано ключевое слово с id 234 и цвет с id 345, но при этом не привязан цвет с id 543. Количество этих AND можно легко менять в скрипте. Кроме того, сравнение целых чисел намного быстрее сравнения строк.

    Правда, это потребует перестройки всей базы данных, но только один раз, достаточно написать скрипт.
    Ответ написан
    1 комментарий
  • Поздний старт в ИТ - есть ли шансы?

    valerium
    @valerium
    Изобретая велосипед
    У меня похожая ситуация, правда я просрал не 5, а в сумме все 6 лет. Сейчас мне 25, я работаю дежурным админом. Успел поработать в техподдержке, потом младшим админом, сейчас дежурным.

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

    Тут правильно bobrovskyserg написал, надо показать себя, сообразить "портфолио". У Вас есть свой проект? Отлично, на гитхаб его! Дружите с русским языком? Катайте статью в песочницу Хабра о своём проекте, ждите инвайт. Есть IT-шная эрудиция? Тостер всегда рад Вам.

    Ах да, если хотите расти профессионально, не советую идти работать офисным админом. Лучше в техподдержку небольшого интернет-провайдера или хостера. Они всегда рады растить кадры самим себе и всегда с радостью делятся опытом.

    Успехов!
    Ответ написан
    Комментировать
  • Как оптимизировать sql запрос?

    valerium
    @valerium
    Изобретая велосипед
    Напишите триггер, который при вставке будет будет текущий weight вставлять в таблицу типа Memory. Соответственно, оттуда же вставка его будет брать. Правда, при этом потребуется однократная "инициализация" при запуске БД.

    Можно триггером и в простую MyISAM таблицу писать, это будет чуть дольше, зато без проблем с перезагрузкой.

    И да, поясните, зачем оно вообще надо. Любопытно :-)
    Ответ написан
    4 комментария
  • Перебрать правильно массив php?

    valerium
    @valerium
    Изобретая велосипед
    foreach $array['response']['items'] as $item {
        var_dump($item);
    }
    Ответ написан