Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Почему исчезают русские символы в MySQL INSERT?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Во-первых, "слишком дорого" - это фантазии.
    Во-вторых, загружая данные в БД, надо ей говорить, в какой они кодировке.
    В-третьих, кодировка тут не при чём. При проблемах с кодировкой текст может либо выглядеть как знаки вопроса, либо как нечитаемые символы. Но не пропадать совсем.

    В общем, не зная никаких вообще деталей, сложно дать конкретные рекомендации, но если предположить, что используется запрос INSERT и mysql_query(), то после соединения с БД надо писать
    mysql_set_charset('кодировка');
    где кодировка - utf8 или cp1251 в зависимости от исходной кодировки файла.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Посмотрел на запрос повнимательнее.
    Сдается мне, тут основная проблема в сортировке основной таблицы по неиндексированному полю.
    Предлагаю для начала сделать индекс по полю прайс.
    ALTER TABLE tasks ADD INDEX (status,price);
    причем, поскольку нужна обратная сортировка, а mysql ее в индексах не поддерживает, то цену хранить в отрицательных величинах, а при извлечении брать её по модулю. Пока же для тестов просто убрать DESC из запроса.
    Ответ написан
    8 комментариев
  • Как сделать динамически субдомены на app engine либо openshift?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

    Судя по документации к GAE, там надо добавить субдомен с именем * в панели управления.
    После этого все запросы будут приходить на основной веб-сервер, при этом конкретный субдомен можно будет получить из $_SERVER['HTTP_HOST'].

    Ответ написан
    1 комментарий
  • Создание системы удаленной компиляции

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

    Если речь именно о компиляции, без запуска, то как-то так?

    <?
    $commands = [
        'ls'    => 'ls -la', 
        'basic' => '/path/to/basic param1 param2', 
        'java'  => '/path/to/java param param',
    ];
    
    if (isset($_FILES['file']) && !$_FILES['file']['error'] && isset($commands[$_POST['lang']]))
    {
        $comm = $commands[$_POST['lang']];
        $file = $_FILES['file']['tmp_name'];
    
        echo "<pre>";
        echo `$comm $file 2>&1`;
        echo "</pre>";
    }
    ?>
    <form enctype="multipart/form-data" method="POST">
      <select name="lang">
      <?php foreach ($commands as $key => $void):?>
        <option><?=$key?></option>
      <?php endforeach ?>
      </select><input name="file" type="file" /><input type="submit" /></form>
    
    

    Ответ написан
    Комментировать
  • Красивые URL и поиск по БД - как вы с этим работаете?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

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

    Для компьютера и число и строка - это набор байт. Что конкретно в эти байты записано - ему всё равно. Поиск по упорядоченному набору байт будет производиться одинаково.

    Не стоит заранее переживать за производительность. От этого одни проблемы.

    Ответ написан
    Комментировать
  • Оптимизация MySQL UPDATE

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

    Скорее всего тормоза из-за дефолтных настроек движка InnoDB. Надо либо завернуть все запросы в транзакцию, либо сделать одним запросом, например так:

    
    AND number = IN (....все номера...)
    

    Ответ написан
    Комментировать
  • Фильтрация пробела в параметре URL

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

    К "любознательности" этот вопрос не имеет отношения. А думать, что это каким-либо образом относится к SQL - прямая дорога к инъекции.

    А имеет - к валидации данных и, частично, к юзабилити и СЕО.

    Пробел - символ нерелевантный, его могут тримать автоматом. Так что буду говорить о "частично валидных" урлах в целом. Учитывая, что урлы руками сейчас никто не набирает, а поисковики могут плохо относиться к существованию одной и той же страницы с разными урлами - я бы не пропускал, отдавал 404.

    Ответ написан
    1 комментарий
  • Скорость вызова include

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР

    Скорость тут не играет никакой роли. В частности, операционная система умеет кэшировать часто используемые файлы, и скорость диска оказывается совсем не при чем.

    А вот подход с разделением на хидер и футер - неправильный и давно устарел.

    Делить страницу надо не на хидер и футер, а на код и отображение. Потому что:

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

    В итоге страница должна собираться из трех частей:

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

    При такой структуре не составит никакого труда вместо страницы вывести сообщение об ошибке (при ошибке) или поменять формат вывода с HTML на JSON. Не говоря уже о смене дизайна.

    Вариантов реализации может быть масса, пример самой простой, на чистом PHP, можно посмотреть здесь: http://www.phpfaq.ru/tpl#example

    Ответ написан
    Комментировать
  • Как вы организуете devel окружение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Мне сложно понять эту проблему, поскольку сам я сижу под осью того же семейства, что стоит на боевом.
    Так что, в моем понимании, девел-сервер — это не единственное место, где программист может запустить написанный на локальном компе код, а сервер, максимально приближенный к боевому, для окончательной обкатки и показа всем причастным к задаче лицам.

    Соответственно, разумная организация представляется мне такой
    1. Разработчик разрабатывает на своей локальной машине. Именно разрабатывает — пишет, запускает, отлаживает. Разработанное заливает в Git
    2. На devel-сервере реализовано динамическое создание поддоменов. Создал девел папку t12 в /opt/www/bob — автоматически появился сайт t12.bob.devel.mysite.com.
    3. Делаем в этой папке git clone (или pull) — и таким образом обновляем код.
    Ответ написан
  • Какие существуют способы оптимизации часто идуших MySQL запросов на выборку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сферический вопрос в вакууме, причём без возможности уточнения, поскольку «проект был».
    «медленные запросы» — насколько медленные?
    «сайт с посещаемостью» — с какой посещаемостью?
    «потому что запросы на поиск» — так может, это поиск вынести отдельно на Сфинкс?

    То есть, выяснить, что там — кривая настройка сервера mysql, кивые таблицы или кривые запросы — не представляется возможным.
    Но вопрос, как всегда, формируется в самом общем виде — «где тот волшебный гвоздь, по которому 1 раз ударить — и всё сразу залетает?»

    Ну ок. В самом общем виде оптимизация запросов (неважно — частых или нечастых) заключается в оптимизации запросов.
    Оптимизированный запрос выполняется (допустим) 0.001 секунды. То есть, БД может обслужить 60 тысяч одновременно сидящих пользователей.

    Берем EXPLAIN и смотрим. Если он говорит, что с запросом все окей, просматриваем ровно столько записей, сколько нужно — 5-10, но все равно запрос исполняется медленно (насколько конкретно медленно — в секундах?) то смотрим, SHOW ENGINE [engine] STATUS. Там уже надо опять же смотреть по месту, решать, чего серверу не хватает.

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

    То есть, действуем как программист — а именно, разбираемся с конкретной проблемой, и ищем решение конкретно для неё.
    А не придумываем от балды заплатку для лечения симптома, оставляя болезнь развиваться и дальше.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну, почему так происходит — как раз ничего удивительного, если точка входа настраивается как обработчик 404.
    А почему на втором… Ну, видимо, там не забыли favicon положить.

    Hint: вкладка «Network» должна открываться при «двойных запросах» в первую очередь.
    Ответ написан
    6 комментариев
  • Как ограничить область выполнения PHP скрипта include?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вообще-то есть такая штука, как open_basedir, которая делает именно это.
    Но как-то не кажется мне такая идея 100%-й защитой.
    Ответ написан
    4 комментария
  • MySQL<5.0 и SQL Injection

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очень часто люди путают само понятие инъекции и эксплуатацию уже совершённой инъекции. Эти два понятия как бы «склеиваются» в голове, но на самом деле между ними практически нет ничего общего:
    — атака типа «SQL инъекция» — это принципиальная возможность внедрить свой код в запрос.
    — эксплуатация — это уже то, какой конкретно код внедрять.

    И здесь сразу становится видно, что вопрос сформулирован некорректно: к атаке INFORMATION_SCHEMA отношения не имеет. А только к эксплуатации. Поэтому и парадокса никакого нет. От инъекций обе версии защищены одинаково — как правильно сказано в ответе выше — настолько, насколько защищено приложение.
    Ответ написан
    2 комментария
  • Your script possibly relies on a session side-effect!?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибка, действительно, древняя, как экскремент мамонта. Объясняется здесь.
    То есть, если есть переменная, допустим, $_SESSION['user'], имеющая значение NULL, и тут мы присваиваем какое-нибудь значение переменной $user — вот тут ошибка и вылезает.

    Легко отключается через
    ini_set('session.bug_compat_warn', 0);
    

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В первом варианте ничего «обычного» нет. Это вообще не вариант.
    Если у нас действительно key-value хранилище, без вложенности и древовидности, то вполне подойдет второй.
    Проблем с «контролем на чтение-запись» никаких не вижу. Уникальный ключ на юзер_айди-парам_айди должен решить все проблемы.

    А вот если система должна поддерживать иерархию — к примеру, категория «хобби», к которой могут относиться сотни различных занятий — то как раз предложенная выше Монга и объединяет в себе эти два, на первый взгляд, противоречивые требования — хранение в JSON плюс выборки и сортировки.

    Следует только учитывать особенности этой БД, являющиеся следствием её достоинств — поскольку у базы нет четкой структуры, то обязательно нужно хранить мета-информацию самостоятельно — поддерживать вручную список всех имеющихся в записях полей.
    Ответ написан
    Комментировать
  • Mysqli vs PDO — что выбрать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По-моему, там довольно ясно написано.
    Если планируем использовать или писать DBAL для работы с Mysql — то mysqli.
    Если от привычки обращаться напрямую к функциям API избавиться никак не получается — то только PDO, поскольку эта библиотека частично реализует функции DBAL, а большая часть тонкостей, реализованных в mysqli, разработчику никогда в жизни не понадобится.
    Ответ написан
    Комментировать
  • PHP: с чего начать, как учить и что в итоге знать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На первые несколько пунктов попробую написать рекомендации в свободной форме.


    Первое и самое главное — чтобы хорошо изучить программирование на РНР, надо хорошо изучить программирование. Это очень важная вещь. Большая часть людей, пишущих на РНР, не имеют ни малейшего представления о программировании. Даже о таких базовых вещах, как форматирование кода, отладка, профайлинг, обработка ошибок, файловые операции. Можно заметить, что я не говорю об ООП. Это совсем отдельная тема, ООП надо учить специально. К сожалению, из 100 человек, которые говорят, что знают ООП, 90 являются банальными копипастерами, выучившими синтаксис, но не понимающими смысла объектов. Но чтобы играть в шахматы, недостаточно знать, как ходят фигуры.


    Ещё неплохо бы ответить себе на вопрос — для чего ты хочешь выучить программирование на РНР? Вопрос совсем не праздный. Многие люди смешивают в нем кучу разных понятий. К примеру, здесь уже упоминали CMS. и действительно, если речь идёт о зарабатывании денег, то кастомизация Джюмлы и написание к ней говномодулей в финансовом плане куда более выгодны, чем умение писать что-либо с нуля. Для фриланса, во всяком случае.

    Вообще, РНР можно использовать очень по-разному. И для каждого случая это будет свой язык.
    • Можно склепать гостевую или сайт-визитку на «голом» РНР — и ничего плохого или позорного в этом нет. Наоборот — это плюс языка, который годится и для таких целей, не таща за собой пару миллионов строк кода ради сайта из пятисот.
    • Можно написать профессиональный портал, взяв за основу какой-то из существующих фреймворков, и заниматься его развитием.
    • Можно написать кастомный хайлоад проект, для которого нужно будет писать собственный фреймворк опять на голом РНР.
    • Можно, как уже говорилось, клепать сайты на основе какой-нибудь ЦМС.


    Вариантов масса! поэтому нужно определиться сначала, чего хочется.


    Там выше говорили про JS+CSS — не надо слушать, это полная ерунда. Фронтенд программирование — совсем отдельная вещь, куда больше визуальная, чем абстрактная. И, слава богу, все больше работодателей начинают понимать это. Хотя опять же — если фрилансишь и на все руки мастер — то без этого никуда.

    Но если работать хардкорным серверным программистом в команде, то об HTML/JS/CSS нужно иметь только общее представление (поскольку тексты на этих языках являются, вообще-то, практически единственным результатом работы РНР).


    А вот что обязательно нужно хорошо знать из сопутствующих технологий — это протокол НТТР, устройство файловой системы, работа c командной строкой в линуксе.


    Теперь по остальным

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

    Фреймворки — обязательно. Тут, правда, стоит проблема выбора, но принципиальной разницы между ними нет. Yii — неплохой выбор.

    Гитхаб тебе не нужен, знать его не обязательно. Знать надо git.
    А вот что является обязательным для веб-программиста — это умение пользоваться гуглем. Хотя бы на уровне умения скопипастить в поисковую форму сообщение об ошибке или написать вопрос «Что такое git» ;-)

    Потому что для работы в команде какую-либо систему контроля версий знать надо, а git является стандартом де-факто. Понимать принцип работы и базовые команды — чекаут, коммит, пуш.
    Ответ написан
    2 комментария
  • Что использовать при кешировании запросов MySQL в PHP

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вам не нужно никакое кэширование.
    Вам нужно оптимизировать свои запросы.
    «100 договоров и больше» — смешная цифра. По такому количеству любые выборки должны считаться предельно быстро, в сотые доли секунд.
    Даже если тупо выбирать все сто договоров в скрипт и считать руками.

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никогда не слышал ничего подобного про первый открывающий тег.
    Про «вываливание содержимого» при включенном short_open_tag — тоже. Скорее всего это была какая-то ошибка или опечатка.
    Для «On случая» никакие рекомендации не нужны, писать можно как угодно.

    Если хочется максимальной совместимости, то в короткой форме пишем только <?=, а в остальных случаях — в длинной.
    Ответ написан
    2 комментария
  • PDO - полный отладочный запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если не планируется использовать серверные плейсхолдеры, то тогда я вообще не вижу смысла использовать встроенный парсер ПДО.
    Пишем свой и имеем
    а) кучу дополнительных плейсхолдеров
    б) возможность подставлять плейсхолдер в кусок запроса, а не только в целый
    в) отладочный вывод.
    Ответ написан
    1 комментарий