• Как структурировать данные категорий при парсинге?

    @rPman
    Сначала нужно задаться очень важным вопросом, а как именно у вас будут использоваться категории? А то наворотите многоуровневую систему, а потом поверх этого будете реализовывать почти поиск по ключевым словам и не больше (т.е. только по названию категории без учета ее уровня вложенности).

    Базу данных необходимо в первую очередь строить исходя не из того что там хранится, а как это будет использоваться!

    К примеру мне нравится система, когда категория - это всего навсего метка/тег/ключевое слово, которое приписывается объекту, т.е. :
    справочник категорий (id,name,level,..)
    == 1-M ==
        V
    категории объектов(id_категория,id_объекта)
        ^
    == M-1 ==
    объекты (id,...)

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

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

    @generate
    ...
    $arr =  array(
        '/category0/subcat1/subcat2',
        '/category0/subcat1/subcat4',
        '/category0/subcat5/subcat6',
        '/category2/subcat7/subcat8',
        '/category2/subcat9/subcat10',
        '/category2/subcat11/subcat12'
    );
    
    foreach ($arr as $key => $value) {
    preg_match_all('#/category(\d+)/subcat(\d+)/subcat(\d+)#', $value, $newmatch);
    $cats[] = array('category' => $newmatch[1][0], 'subcat' => $newmatch[2][0],  'subcat_' => $newmatch[3][0]);
    unset($newmatch);
    }
    
    print_r($cats);

    Результат
    Array
    (
        [0] => Array
            (
                [category] => 0
                [subcat] => 1
                [subcat_] => 2
            )
    
        [1] => Array
            (
                [category] => 0
                [subcat] => 1
                [subcat_] => 4
            )
    
        [2] => Array
            (
                [category] => 0
                [subcat] => 5
                [subcat_] => 6
            )
    
        [3] => Array
            (
                [category] => 2
                [subcat] => 7
                [subcat_] => 8
            )
    
        [4] => Array
            (
                [category] => 2
                [subcat] => 9
                [subcat_] => 10
            )
    
        [5] => Array
            (
                [category] => 2
                [subcat] => 11
                [subcat_] => 12
            )
    
    )
    Ответ написан
    Комментировать
  • Как структурировать данные категорий при парсинге?

    @rapidum_alder
    Решение Неандертальца::

    $arr = [
        '/category0/subcat1/subcat2',
        '/category0/subcat1/subcat4',
        '/category0/subcat5/subcat6',
        '/category2/subcat7/subcat8',
        '/category2/subcat9/subcat10',
        '/category2/subcat11/subcat12',
    ];
    
    $t = [];
    foreach ($arr as $item) {
        $s = explode('/', $item);
        $i = $s[1];
        unset ($s[1], $s[0]);
        if (!$t[$i] ){
            $t[$i] = [];
        }
        foreach ($s as $item){
            array_push ( $t[$i],$item);
        }
    }
    foreach ($t as &$item){
        $item = array_unique($item);
    }
    echo('<pre>');
    var_dump($t);
    var_dump(json_encode($t));
    echo('<pre>');
    Ответ написан
    Комментировать
  • Чем куки отличаются от сессии в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нууу давайте разбираться.

    Для начала почитайте про HTTP на той же вики. Досканально знать не нужно, но стоит минимально понимать структуру запросов/ответов, понимать что у запроса и ответа есть заголовки и тело (тела может и не быть, зависит от типа запроса/ответа).

    Так вот. Куки. Куки живут на стороне браузера. Они передаются HTTP заголовком на каждый запрос на сервер (даже если вы за картинками полезли). Есть просто куки, есть http-only куки. Куки могут быть разграничены по хосту и пути. Все это дает нам гибкость и помогает с секьюрностью. В PHP содержимое $_COOKIE предоставляет нам SAPI. Когда PHP получает на обработку запрос, SAPI используемое (php-fpm, cgi, mod_php имеют свои реализации SAPI) в данный момент берет заголовки и тело запроса, парсит их и заполняет все эти суперглобальные массивы типа $_SERVER, $_GET и в том числе и $_COOKIE. Все что прислал нам клиент (что-то что делает запросы это клиент, что-то что их обрабатывает - сервер), а куки шлет нам браузер только те что можно исходя из того куда шлется запрос. Устанавливаются куки заголовком Set-Cookie в ответе, то есть тут больше нужно читать в принципе про HTTP а не про PHP. PHP просто позволяет вам работать с этим добром. Вы можете сэтить куки напрямую работая с заголовками ответа при помощи функции header. Более того, если выставить время жизни куки в 0, то как раз таки они а не сессия будет сбрасываться при закрытии браузера так как тот будет забывать все такие куки.

    Вот... сессии... В PHP сессия обычно это файл. Просто какой-то файл с рандомным именем. Если скажем в php.ini указано session.autostart или делается вызов session_start то создается файл под сессию пользователя (можно переместить в рэдис или мемкэш, свое хранилище и т.д в зависимости от нужд. Так же данные можно шифровать, что по умолчанию и происходит). Этот файл имеет ID, просто какая-то рандомная строка. И если при обработке запроса не нашлась сессия с предыдущего запроса - создается новая.

    И вот мы подошли к самому интересному - как PHP связывает сессию с предыдущего запроса с текущей. И тут все довольно просто - куки. Когда пользователю присваивается сессия, автоматически сэтится http-only (что бы нехорошие люди не могли из js увести нашу сессию) кука, в которую записан идентификатор сессии. В дебагере браузера можете посмотреть есть ли у вас кука PHPSESSID (название можно менять в настройках, да и вообще сессии можно не только через куки связывать, но это уже загоны по секьюрности) когда будете эксперементировать с сессиями.

    Когда запрос обрабатывается SAPI, при наличии session.autostart, перед тем как начинать создавать новую сессию, пых все же смотрит а есть ли у нас кука с идентификатором сессии, проверяет есть ли у него такая, и если есть успокаивается и не создает новую. Поскольку сессия привязывается через куки, то можно выставить время жизни этой самой куки (в php.ini) и таким образом регулировать время жизни сессии.

    Вот... когда использовать куки а когда сессии? Желательно понимать, что чем больше данных в куках (а у них есть лимит к слову) - тем больше данных мы передаем на каждый запрос. То есть это не круто когда что бы получить 1 килобайт данных мы должны в заголовках передать пару килобайт кук. Люди, повернутые на оптимизации, даже картинки хранят на отдельных cookie-less доменах что бы уменьшить количество трафика и пакетов (обычно простенький HTTP запрос влазит в размеры одного TCP пакета). Если вам нужно работать с этими данными из JS на любой странице, например локаль выбранноую пользователем для того что бы применять переводы еще и в JS, то стоит использовать куки. Для всео остального лучше конечно же использовать сессии. Во всяком случае на начальных этапах когда что-то сильно сложное вам делать не придется.
    Ответ написан
    2 комментария
  • Как перенеаправить запрос на index.php?

    netrox
    @netrox
    <IfModule mod_rewrite.c>
      Options -Multiviews
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
    </IfModule>

    В index.php строку запроса извлекать через $_GET['url'].
    Ответ написан
    1 комментарий
  • Как настрроить .onion сайт?

    @loonny
    Уже задавали подобный вопрос.
    Как создать сайт в сети Tor?

    Просто мою жизнь описали одним предложением
    Я бы не сказал что в линуке я уверенный пользователь, скорее новичок, который делает все гугля статьи
    Ответ написан
    Комментировать