• Почему возникает ошибка Unexpected token in JSON at position 0 parsererror?

    @galaxy
    Из-за Notice у тебя ошибка. Не выводи ошибки PHP в браузер (display_errors = Off) для начала. И разберись с нотисом, почему в сессии не оказалось payment_method
    Ответ написан
  • Солько бит имеет макрос CHAR_BIT?

    @galaxy
    CHAR_BIT - макрос, количество бит в char'е. По стандарту не меньше 8 (но вполне может быть больше).
    sizeof(char) = 1 по определению (sizeof измеряет все в char'ах)
    sizeof(CHAR_BIT) - учитывая, что CHAR_BIT определен примерно как #define CHAR_BIT 8, тут вы вычисляете sizeof(int)
    Ответ написан
    3 комментария
  • Почему код неработает?

    @galaxy
    Извини, дорогой друг, но не работает, потому что ты ленивый рукожоп.

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

    @galaxy
    SELECT f.*, u.last_visit
      FROM f_list f, users u
     WHERE u.id = f.id_sender AND f.id_receiver = 11
     UNION
    SELECT f.*, u.last_visit
      FROM f_list f, users u
     WHERE u.id = f.id_receiver AND f.id_sender = 11
     ORDER BY last_visit desc


    sqlfiddle.com/#!9/cb52eb/2

    Вы пытались смешать в одну кучу sender/receiver, а это два джойна, вообще говоря. Т.к. интересут текущий user, проще делать один джойн + объединение.
    Ответ написан
    1 комментарий
  • Как сделать простой php маршрутизатор (роутер)?

    @galaxy
    Ну вот прям на спичках:
    /* index.php */
    $controllerClass = ucfirst($_GET['controller']);
    $method = $_GET['method'];
    
    require_once("controllers/$controllerClass.php");
    $controller = new $controllerClass();
    $controller->$method();


    (никаких проверок ошибок и защит, конечно).
    Обрабатывает url вида /index.php?controller=user&action=edit
    Создает объект класса User (из controllers/User.php) и вызывает метод edit()
    Ответ написан
    Комментировать
  • Монтирование диска в Windows(не самба)?

    @galaxy
    ибо в самбу он видит как шару(\\adress\)

    net use z: \\adress\
    Ответ написан
    6 комментариев
  • PHP cUrl: Почему я получаю ошибку 403?

    @galaxy
    Читайте документацию внимательнее:

    CURLOPT_HTTPHEADER An array of HTTP header fields to set, in the format array('Content-type: text/plain', 'Content-length: 100')
    Ответ написан
    Комментировать
  • Поможете с функцией PHP?

    @galaxy
    Суперглобальные переменные ($_GET, $_POST и т.д.) потому так и называются, что доступны всегда и из любого места.
    Вы назвали параметр своей функции _POST и таким образом пытаетесь перезатереть суперглобальную переменную. Так делать нельзя.
    Все будет работать, если убрать _POST из параметров (и не передавать его при вызове - он и так отовсюду доступен).
    Ответ написан
    2 комментария
  • Почему не работает команда INSERT INTO в моём коде?

    @galaxy
    #После этого идёт показ всех username из таблицы users, куда и добавлялся элемент, но он показывает, что добавился только первый элемент при создании базы.
    print(cursor.execute(f"SELECT username FROM users").fetchone()) #Вывести в консоль всю таблицу с username-ми
    return True

    Что заставляет вас думать, что тут "идёт показ всех username из таблицы users"?
    Название метода fetchone() ни на какие мысли не наводит?
    Ответ написан
  • Какая ошибка в коде?

    @galaxy
    А что вы шлете на сервер, не пробовали задуматься?
    Если проследить:
    HTTP/1.0
    Host: domain.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length:

    Первая строчка не смущает? А Content-Length?

    Ну и send(s, sendbuf, sizeof(sendbuf), 0); - почему sizeof? 1024 байта с кучей 0x00 хотите послать несчастному серверу?
    Ответ написан
    5 комментариев
  • Почему на почту приходит только один файл?

    @galaxy
    В дополнение отмечу, что мало кто понимает, как работает <input name="file" type="file" multiple="">.
    Почему-то думают, что если несколько раз нажать на кнопку загрузки, то и прикрепится несколько. На самом деле при каждом следующем нажатии и выборе нового файла старый затирается.

    Несколько файлов надо выбирать сразу через зажатый Ctrl.
    Ответ написан
    2 комментария
  • Ошибка при создании триггера..?

    @galaxy
    СУБД, конечно, указывать не обязательно, они же все одинаковые...

    Судя по всему, postgres. В таком случае извольте почитать документацию. Вы видите там возможность прямо в CREATE TRIGGER писать какие-либо DML запросы?

    В постгресе все действия триггера выполняются через специальную функцию (ссылки на примеры на разных языках - https://www.postgresql.org/docs/13/triggers.html), которую триггер должен вызывать.
    Ответ написан
    Комментировать
  • Какой SQL запрос написать?

    @galaxy
    SELECT Company, SUM(CASE WHEN IsDiscounted THEN Price ELSE -Price END) ...
    Ответ написан
    1 комментарий
  • Недостатки PostgreSQL?

    @galaxy
    Самая большая проблема - это архитектура MVCC, которая вызывает распухание таблиц, требует наличие vacuum'инга, и в многих случаях не способствует производительности.

    Но советую все же самому погуглить (для затравки - https://habr.com/ru/company/southbridge/blog/322624/). Будет гораздо проще и полезнее, если вы нагуглите какие-то особенности, а специалисты тут подскажут, насколько они актуальны и критичны.
    Ответ написан
    2 комментария
  • Не импортируется таблица через командную строку на сервере?

    @galaxy
    В вас дело.
    mysql -v запустило клиент mysql, и вы вытаетесь импортировать из командной строки mysql.
    Ответ написан
    Комментировать
  • Как организовать структуру хранения атрибутов?

    @galaxy
    Вообще, рассуждать в отрыве от данных достаточно бессмысленно. Надо смотреть конкретные планы запросов и время выполнения.
    Например, для статистики, которую вы приводили тут где-то (похоже, ответ уже потерли), у меня получаются вполне приемлемые результаты (на мой взгляд, не факт, что вас устроит):
    Схема и данные

    create table products (
    	id serial primary key,
    	name text not null
    );
    
    create table products_attributes (
    	id serial primary key,
    	attribute_id int not null,
    	product_id int not null references products (id),
    	value double precision
    );
    
    
    -- 10 млн продуктов
    insert into products (name)
    select 'p' || n from generate_series(1, 10000000) n;
    
    -- в среднем по 10 аттрибутов на продукт
    -- всего 20 разных аттрибутов
    -- значения - случайные из 1-1000
    insert into products_attributes(attribute_id, product_id, value)
    select a,
           p.id,
           trunc(random() * 1000)
      from products p, generate_series(1, 20) a
     where random() < 0.5;
    
    
    create index ix_attr_attribute_id on products_attributes(attribute_id);
    create index ix_attr_product_id on products_attributes(product_id);
    create unique index uk_attr_attr_product on products_attributes(product_id, attribute_id);
    create index ix_attr_value on products_attributes(value);
    
    -- немного статистики
    select attribute_id, count(*) from products_attributes group by 1 order by 1;
    
     attribute_id |  count
    --------------+---------
                1 | 5001345
                2 | 5001937
                3 | 4998754
                4 | 4998706
                5 | 4999357
                6 | 5004465
                7 | 4999215
    ...
    
    select product_id, count(*) from products_attributes group by 1 order by 2 desc limit 20;
     product_id | count
    ------------+-------
        4769292 |    20
        5366802 |    20
        7241348 |    20
        3019891 |    20
        7789046 |    20
        1688646 |    19
        1585970 |    19
    ...
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 1 AND value BETWEEN 1 AND 400;
      count
    ---------
     1999212
    (1 row)
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 2 AND value BETWEEN 1 AND 400;
      count
    ---------
     1999385
    (1 row)
    
    SELECT count(*) FROM products_attributes WHERE attribute_id = 3 AND value BETWEEN 20 AND 30;
     count
    -------
     55318
    (1 row)



    explain analyze
    select * from products
     where id in (
       select product_id from products_attributes
        where attribute_id = 1 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 2 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 3 AND value BETWEEN 20 AND 30
     );

    Без лимита, 2189 записей - 3.8 сек:
    План

    QUERY PLAN                          
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Gather  (cost=164603.86..347381.12 rows=2047 width=12) (actual time=680.688..3753.927 rows=2189 loops=1)
       Workers Planned: 2
       Workers Launched: 2
       ->  Nested Loop  (cost=163603.86..346176.42 rows=853 width=12) (actual time=652.714..3713.617 rows=730 loops=3)
             ->  Nested Loop  (cost=163603.43..341334.66 rows=762 width=12) (actual time=652.439..3294.369 rows=730 loops=3)
                   ->  Parallel Hash Join  (cost=163602.86..313081.39 rows=4167 width=8) (actual time=649.437..1742.210 rows=3689 loops=3)
                         Hash Cond: (products_attributes_1.product_id = products_attributes_2.product_id)
                         ->  Parallel Index Scan using ix_attr_attribute_id on products_attributes products_attributes_1  (cost=0.57..147444.27 rows=775173 width=4) (actual time=0.577..880.079 rows=666462 loops=3)
                               Index Cond: (attribute_id = 2)
                               Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                               Rows Removed by Filter: 1000851
                         ->  Parallel Hash  (cost=163306.17..163306.17 rows=23690 width=4) (actual time=647.483..647.483 rows=18439 loops=3)
                               Buckets: 65536  Batches: 1  Memory Usage: 2752kB
                               ->  Parallel Index Scan using ix_attr_attribute_id on products_attributes products_attributes_2  (cost=0.57..163306.17 rows=23690 width=4) (actual time=18.296..639.541 rows=18439 loops=3)
                                     Index Cond: (attribute_id = 3)
                                     Filter: ((value >= '20'::double precision) AND (value <= '30'::double precision))
                                     Rows Removed by Filter: 1647812
                   ->  Index Scan using uk_attr_attr_product on products_attributes  (cost=0.57..6.78 rows=1 width=4) (actual time=0.420..0.420 rows=0 loops=11066)
                         Index Cond: ((product_id = products_attributes_1.product_id) AND (attribute_id = 1))
                         Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                         Rows Removed by Filter: 0
             ->  Index Scan using products_pkey on products  (cost=0.43..6.35 rows=1 width=12) (actual time=0.572..0.572 rows=1 loops=2189)
                   Index Cond: (id = products_attributes.product_id)
     Planning Time: 4.481 ms
     JIT:
       Functions: 93
       Options: Inlining false, Optimization false, Expressions true, Deforming true
       Timing: Generation 14.220 ms, Inlining 0.000 ms, Optimization 2.852 ms, Emission 50.889 ms, Total 67.961 ms
     Execution Time: 3762.035 ms
    (29 rows)



    То же, но с лимитом (LIMIT 20):
    Запрос
    explain analyze
    select * from products
     where id in (
       select product_id from products_attributes
        where attribute_id = 1 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 2 AND value BETWEEN 1 AND 400
     )
     and id in (
       select product_id from products_attributes
        where attribute_id = 3 AND value BETWEEN 20 AND 30
     ) limit 20;


    20 записей - 48 мсек:
    spoiler
    QUERY PLAN                                   
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     Limit  (cost=2.14..7292.14 rows=20 width=12) (actual time=3.743..47.724 rows=20 loops=1)
       ->  Nested Loop  (cost=2.14..746133.39 rows=2047 width=12) (actual time=3.741..47.714 rows=20 loops=1)
             ->  Nested Loop  (cost=1.70..734511.89 rows=1829 width=12) (actual time=3.313..44.710 rows=20 loops=1)
                   ->  Nested Loop  (cost=1.14..666709.45 rows=10000 width=8) (actual time=2.377..42.276 rows=95 loops=1)
                         ->  Index Scan using ix_attr_attribute_id on products_attributes products_attributes_2  (cost=0.57..209246.27 rows=56856 width=4) (actual time=1.250..14.969 rows=511 loops=1)
                               Index Cond: (attribute_id = 3)
                               Filter: ((value >= '20'::double precision) AND (value <= '30'::double precision))
                               Rows Removed by Filter: 46859
                         ->  Index Scan using uk_attr_attr_product on products_attributes products_attributes_1  (cost=0.57..8.05 rows=1 width=4) (actual time=0.053..0.053 rows=0 loops=511)
                               Index Cond: ((product_id = products_attributes_2.product_id) AND (attribute_id = 2))
                               Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                               Rows Removed by Filter: 0
                   ->  Index Scan using uk_attr_attr_product on products_attributes  (cost=0.57..6.78 rows=1 width=4) (actual time=0.025..0.025 rows=0 loops=95)
                         Index Cond: ((product_id = products_attributes_1.product_id) AND (attribute_id = 1))
                         Filter: ((value >= '1'::double precision) AND (value <= '400'::double precision))
                         Rows Removed by Filter: 0
             ->  Index Scan using products_pkey on products  (cost=0.43..6.35 rows=1 width=12) (actual time=0.149..0.149 rows=1 loops=20)
                   Index Cond: (id = products_attributes.product_id)
     Planning Time: 9.959 ms
     Execution Time: 47.796 ms
    (20 rows)


    Как видите, оценки планировщика по селективности адекватные. Начинает он с самого высоко-селективного условия. Лимит проносится внутрь самых глубоких джойнов (видно по количеству записей).
    Ответ написан
    3 комментария
  • Какой UTF-8 (hex.) код у переноса на новую строку?

    @galaxy
    Стандартом Юникод определено из соображений обратной совместимости несколько символов (сочетаний символов), после которых идет обязательный переход на новую строку

    VT: Vertical Tab, U+000B
    FF: Form Feed, U+000C
    CR: Carriage Return, U+000D
    CR+LF: CR (U+000D) followed by LF (U+000A)
    LF: Line Feed (U+000A)
    NEL: Next Line, U+0085
    LS: Line Separator, U+2028
    PS: Paragraph Separator, U+2029


    (при этом эффект переноса для VT и NEL не обязателен к исполнению при реализации стандарта).

    На практике в UTF-8 для переноса строк обычно используются те же символы, что и в ASCII (они и кодируются так же, как в ASCII):
    • CR: Carriage Return, UTF-8: 0x0D
    • LF: UTF-8: 0x0A
    • CR+LF: UTF-8: 0x0D0A
    Ответ написан
    Комментировать
  • Firefox показывает некоторые HTTPS сайты как недоверенные. MITM атака провайдера?

    @galaxy
    Из-за кросс-подписи, скорее всего - https://letsencrypt.org/certificates/

    UPD: впрочем, я, видимо, неправ, это тут ни при чем
    Ответ написан
  • Как отправить запрос?

    @galaxy
    Никак. Requests не выполняет JS.
    Ответ написан