Ответы пользователя по тегу PHP
  • Почему при переходе на другую страницу, она не загружается до тех пор, пока не будут завершены ajax запросы на текущей странице?

    65536
    @65536
    сессии лочат. если в с крипте есть session_start, то он открывает файл сессии, и пока не закроет, другой экземпляр этого скрипта или другой скрипт не сможет его открыть, поэтому запросы встают в очередь. добро пожаловать в организацию сессий своими руками. не рекомендую связываться с session_set_save_handler. самый нормальный вариант выдавать браузеру куку с ключем и по нему хранить отдельные независимые части данных сессии в базе, обязательно так чтоб при асинхронщине они не разрушились, это уже ваша радача. стандартные сессии как раз от этого и защищают своим тупняком
    Ответ написан
    Комментировать
  • Как спроектировать связь в бд раздел категории?

    65536
    @65536
    lf
    Ответ написан
    Комментировать
  • Как заменить некоторое число символов зная их порядковые номера?

    65536
    @65536
    $a = '11010010101101';
    $b = '00101000010000';
    
    print decbin(bindec($a)|bindec($b));
    Ответ написан
    Комментировать
  • Как лучше всего организовать хранение товаров в таблице?

    65536
    @65536
    eav
    Ответ написан
    Комментировать
  • Готовый бесплатный интернет-магазин?

    65536
    @65536
    один мой друг
    Ответ написан
    Комментировать
  • Где можно попрактиковаться в php?

    65536
    @65536
    Да-да, написать цмс это именно то, с чего стоит начать. Чтобы все предыдущие создатели обосрались и поняли как были в корне неправы. Советующий такое сам похоже не один десяток цмсов носоздавал.
    Ответ написан
    1 комментарий
  • Где вы храните сессии пользователя, почему?

    65536
    @65536
    Внимание, с 20 декабря по 10 января в вашем доме будут отключены cookies.

    В какой ситуации браузер может оказаться с неработающими кукис кроме той когда за рулем сидит параноидальный идиот. Или я что-то пропустил?

    Я отказался от стандартных пхп-сессий. У них основная проблема - это то, что все это хранится в одном файле, который теоретически может или хотел бы разрастаться до бесконечности. Каждое открывание и считывание большого файла будет выжирать. Вторая проблема это то что если этот файл открыт один раз, то пока он не закроется, еще раз его не открыть. Если один запрос висит, следующий стоит в очереди. Это все можно обойти используя session_set_save_handler и т. д., но по-моему слишком сложно. Гораздо проще выдавать пользователям/гостям уникальный ключ (единственное что будет храниться в их кукисах) а уже по этому ключу хранить у себя в базе или где-то как хотеть данные сессии. Единственное что нужно сделать самому это прописать механизм смерти этих сессий и кукисов, и выдачу уникальных ключей, чтобы кому-то чужая не перепала. В базе по такому ключу можно хранить бесконечное кол-во записей, разделенных по какому-то признаку, принадлежности к такому-то модулю, например, и не беспокоиться о проблеме разрастания до бесконечности
    Ответ написан
    Комментировать
  • Как написать условие в ModX?

    65536
    @65536
    Ответ написан
    Комментировать
  • Стоит ли создавать интернет-магазин для портфолио на чистом PHP?

    65536
    @65536
    правильная цепочка в вашем случае такова: чистый пхп -> фреймворк -> цмс -> магаз, можно без звена цмс. чистый пхп -> магаз - это будет такой магаз, который в один не столь отдаленный момент станет невозможно дорабатывать. писать фреймворк это целая жизнь, пока напишете, забудете про магаз, а заодно изучите популярные фв, поэтому написание фреймворка можно сократить. чистый пхп -> цмс - тема еще более гиблая, чем что либо на чистом пхп. цмс должна делаться поверх слоя, в котором уже решены более низкоуровневые задачи, и само по себе создание цмс может оказаться сложнее и нетривиальнее чем создание фв, вылезет куча разнообразных аспектов и тонкостей, о которых заранее не подозреваешь. в общем написание цмс можно тоже сократить. остается перебрать и изучить все что есть готовое из обозримого и что-то выбрать. ну либо пройти путь самурая с многократными переписываниями мегабайтов кода и других мытарств и так и не вспомнить про какой-то там магазин, либо просто сделать очередную неповижную говняшку на пхп
    Ответ написан
    Комментировать
  • Как с помощью php, убрать последнюю букву в слове, если только она гласная?

    65536
    @65536
    !in_array('а', 'е', 'и', ...)
    Ответ написан
    Комментировать
  • Как в php решается проблема с множественным наследованием?

    65536
    @65536
    Да вообще наследование неправильно устроено. Надо было делать как у людей - маму и папу. То есть чтобы класс мог унаследоваться только от двух классов и никак иначе. Таким образом имеем множественное наследование хоть до бесконечности. Не хватило мамы с папой, добавляем бабушку с дедушкой, можно по 2 штуки, и т д. Единственное что понадобится это добавить в язык половой признак класса и модификаторы для полей и методов, которые будут задавать приоритет при наличии у обоих родителей, если задано у обоих, то берём папин вариант (патриархат). Так можно было бы наглядно комбинировать разных мам и пап чтобы порождать детей с нужными повадками.
    Ответ написан
    1 комментарий
  • Где лучше хранить иформацию о каталогах?

    65536
    @65536
    {00-ff}/{00-ff}/{00-ff}/{00-ff}/{00000000-ffffffff}.{ext}
    Ответ написан
    Комментировать
  • PHP7 и foreach. Коварное изменение?

    65536
    @65536
    в общем то и раньше не стоило менять массив из форыча по нему
    Ответ написан
    5 комментариев
  • Какую выбрать схему хранения объектов?

    65536
    @65536
    на днях доделал такой сайт. ломание головы остановилось на eav с несколькими типами полей

    вот как получилось
    объявления
    f1bc0bc3600979af86b4cfbf448642f6.png
    категории объявлений
    f7987ad4cb33f257c4b867e1d6841a14.png
    общие поля для объяв из всех категорий
    62102cd79000c00d74d4835868272352.png
    свойства категорий
    7d575bca3a46792ca52094fcbb294546.png
    значения свойств для объявлений
    58517b28450b090220a79838bd750712.png

    основной косяк еава это то что невозможно выбрать одним запросом в зависимости от настроек фильтра, приходится по каждому параметру собирать айдишники и потом их интерсектить, примерно так
    private function get_offers($page, $per_page)
    {
        $filter_fields = $this->get_current_filter_enabled_fields();
        $filter_values = $this->s('@filter~:values_by_cats/' . $this->cat->id);
    
        //
    
        $offers_ids_sets = array();
        $offers_extra_ids_sets = array();
    
        if ($filter_values) {
            foreach ($filter_values as $field_id => $data) {
                if (isset($filter_fields[$field_id])) {
                    $field = $filter_fields[$field_id];
    
                    $prop = $field['prop'];
                    $common_prop = $field['common_prop'];
    
                    if ($prop) {
                        $type = $prop['type'];
    
                        if ($type == 'bool' && $data['value']) {
                            $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                    ->where('bool_value', true)
                                    ->lists('offer_id')->toArray();
                        }
    
                        if ($type == 'strings_list' && isset($data['selected']) && !is_null($data['selected'])) {
                            $prop_settings = _j($prop['settings']);
    
                            if (isset($prop_settings['strings_list']['items'][$data['selected']])) {
                                $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                        ->where('string_value', $prop_settings['strings_list']['items'][$data['selected']])
                                        ->lists('offer_id')->toArray();
                            }
                        }
    
                        if ($type == 'numbers_list' && isset($data['selected']) && !is_null($data['selected'])) {
                            $prop_settings = _j($prop['settings']);
    
                            if (isset($prop_settings['numbers_list']['items'][$data['selected']])) {
                                $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                        ->where('number_value', $prop_settings['numbers_list']['items'][$data['selected']])
                                        ->lists('offer_id')->toArray();
                            }
                        }
    
                        if (($type == 'numbers_list' || $type == 'number') && isset($data['min']) && isset($data['max'])) {
                            $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                    ->where('number_value', '>=', $data['min'])
                                    ->where('number_value', '<=', $data['max'])
                                    ->lists('offer_id')->toArray();
                        }
                    }
    
                    if ($common_prop) {
                        $type = $common_prop['type'];
    
                        if (($type == 'numbers_list' || $type == 'number') && isset($data['min']) && isset($data['max'])) {
                            $offers_ids_sets[] = OfferExtra
                                    ::where($common_prop['field'], '>=', $data['min'])
                                    ->where($common_prop['field'], '<=', $data['max'])
                                    ->lists('offer_id')->toArray();
                        }
                    }
                }
            }
        }
    
        $offers_ids = array();
    
        if ($offers_ids_sets) {
            $offers_ids = (array)$offers_ids_sets[0];
    
            for ($i = 1; $i < count($offers_ids_sets); $i++) {
                $offers_ids = array_intersect($offers_ids, (array)$offers_ids_sets[$i]);
            }
        }
    
        //
    
        $builder = $this->cat->offers();
    
        if ($offers_ids_sets) {
            $builder = $builder->whereIn('id', $offers_ids);
        }
    
        $builder = $builder->whereHas('extra', function ($builder) use ($offers_extra_ids_sets) {
            $builder->where('enabled', true);
        });
    
        $count = $builder->count();
    
        $offers = $builder->orderBy('created_at', 'DESC')->offset(($page - 1) * $per_page)->take($per_page)->get();
    
        return array($count, $offers);
    }

    и вообще никак невозможно сортировать по параметрам, если нужна сортировка по какому-то параметру придется переносить ее в таблицу товаров самих

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

    65536
    @65536
    я делал permissions <-> groups <-> users, где "<->" связь много ко много. потом еще приделал связь permissions <-> users для персонального отбирания/давания разрешения пользователю каких-то разрешений поверх того, что присваивается ему через группы. там где нужно проверить какое-то разрешение, там оно и проверяется. так же разрешения и группы можно связывать с какими-то другими объектами в системе, чтобы владельца обозначить и проверять принадлежность когда надо тоже
    Ответ написан
    Комментировать
  • Как реализовать ЧПУ?

    65536
    @65536
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^.]+)$ /index.php?route=$1 [L]
    Ответ написан
    7 комментариев
  • Как защитить php скрипт и упаковать в exe?

    65536
    @65536
    зажать в архив с паролем, сменить расширение на ехе
    Ответ написан
    Комментировать
  • Modx Revo 2.4.2. Как вставить значение любого ТВ в сниппет?

    65536
    @65536
    За это я и ненавижу модх. Не знаю, может быть существует какой-то нормальный способ. Я выкручивался так:

    Наделал дополнительных полей
    99dfcfc0bb4509bfabbc89cd19592f98.png

    Создал специальный шаблон сделал эти поля доступными для него
    fc944af5a482b535e6c0b7f73f9b55ed.png

    Создал ресурс с использованием этого шаблона
    512ea0488b979484c389e4587c034744.png
    Набил себе татуху с идентификатором этого ресурса чтобы не забыть

    Сделал специальный сниппет
    c4351c62177db3f2dc82f23632bac872.png

    И там где надо навызывал с указанием нужного тв
    3f6dd63773eecbc9f10a712bd1266c3a.png

    Это жуть, но больше мне ничего в голову не пришло
    Ответ написан
    4 комментария
  • Как исправить ошибку в php?

    65536
    @65536
    Напишите об этом администратору info@site.ru
    Ответ написан
    Комментировать