• Как составить запрос MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    просто дописать джойны всех трёх таблиц
    Ответ написан
    8 комментариев
  • Есть ли разница между памятью в PHP и C#?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    РНР работает как консольная утилита. Запустился, поработал долю секунды, завершился.
    Поэтому вопросы управления памятью в 99% случаев РНР разработчиков не волнуют. Как и её очистка
    Чисто технически подробности управления памятью также полностью скрыты от разработчика.
    Всё что надо знать о работе РНР с памятью - "РНР работает с памятью за тебя"
    Так что в целом, единственное что вас должно интересовать - это не работать с большими объёмами данных в скрипте. Но это и так очевидная рекомендация.

    Если хочется прям вдаваться в детали (хотя совершенно непонятно, зачем это джуну), то PHP insernals Memory management
    Ответ написан
  • Как подобрать данные из локальной базы данных пользователя через Django?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы подключиться к удалённой БД, надо в её настройках разрешить удалённые соединения (bind_address) и добавить соответствующего пользователя. Плюс открыть порт на файрволле.
    Так же, если соединение происходит не через VPN, то очень желательно настроить SSL соединение.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется не "GET ответ", а JSON
    Ответ написан
    Комментировать
  • Как сохранять данные полученные с api в базу данных mySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Написано же, простым русским языком: download each 24 hours & cache it
    То есть никаких "реализовано через api" тут быть не может. Разумеется, при работе с внешними АПИ полученные данные всегда сохраняются локально, и показываются из кэша. В простейшем случае кэш пишется в файл, но удобнее работать с базой.

    "Как сохранять данные полученные с api в базу?" вопрос откровенно дурацкий. Точно так же, как и любые другие.
    Ответ написан
    Комментировать
  • Why does Not all parameters were used in the SQL statement error apear?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    "I am try" звучит примерно как "я попытайся".

    По поводу ошибки. Самое важное, чему должен научиться каждый нуб в питоне (а точнее - в программировании в целом) - это такое понятие, как отладка.
    В которой нет ничего сложного. Это всего лишь означает посмотреть глазками на результат своих действий.

    В том, чтобы наугад писать какие-то слова от балды, нет ничего зазорного - мы все так делаем. Примерно как с английским - да какая разница, try или trying? Но в отличие от английского, языки программирования позволяют нам проверить, соответствует ли результат ожидаемому.
    И в данном случае сообщение об ошибке нам даже подсказывает, куда смотреть: ему явно не нравится значение, которое мы добавляем в БД. И дальше надо сделать две простые вещи:
    Первое - спросить себя, сколько значений мы хотим добавить в БД?
    И второе - распечатать переменную, которая содержит эти самые значения. Сделать такую банальность, как print(val). И сравнить реальность с ожиданиями.
    А дальше совсем просто - полюбовавшись на дело рук своих, начинаем смотреть: каких-таких функций мы навызывали, что у нас получился такой результат. И избавиться от ненужной.

    Но это всё мелочь и ерунда по сравнению с важнейшим понятием отладки, с которым мы познакомились сегодня. Поэтому повторим:
    • внимательно прочитать сообщение об ошибке и подумать - что оно означает.
    • вывести все промежуточные результаты нашей программы, чтобы понять - в каком месте всё пошло не так
    Ответ написан
    2 комментария
  • Как правильно выбрать все товары?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для человека, который только-только осваивает азы SQL, важно для начала понять, как работает вот такой базовый вариант. Как вообще таблицы соединяются между собой.
    select p.* from products p 
    join product_country pc1 on pc1.product_id=p.id and pc1.country_id=1 
    join product_country pc2 on pc2.product_id=p.id and pc2.country_id=2

    [inner] join находит все записи из левой таблицы, для которых есть соответствие в правой таблице, и которые удовлетворяют условию в ON.
    Соответственно, первый джойн отбирает все записи, которые соответствуют country_id=1,
    а второй - оставляет из получившегося набора только те, которые соответствуют и country_id=2
    Ответ написан
    Комментировать
  • Как правильно отформатировать query string внутри json?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это какой-то кошмар.
    Никогда нельзя ковыряться руками в специализированных форматах.
    А надо использовать только предназначенные для этого инструменты. Тем более что это не так сложно.
    В данном случае надо
    • аккуратно распаковать json
    • вытащить из него и аккуратно распаковать query string
    • поменять значение на нужное
    • аккуратно запаковать query string
    • аккуратно запаковать json
    • и никаких f-strings!
    from urllib import parse
    import json
    
    text =  '{"req":[{"index":"prod","param":"q=%s&hits=4&filters=live%3A1"}]}'
    arr = json.loads(text)
    qs = parse.parse_qs(arr['req'][0]['param'])
    qs['q'] = model
    arr['req'][0]['param'] = parse.urlencode(qs,doseq=True)
    text = json.dumps(arr)

    При таком подходе конечный результат всегда будет отформатирован правильно, и программа не будет падать на ровном месте.

    spoiler
    Такое ощущение, что Питон - это новый пэхапе. 10 лет назад на пыхе точно также колупали чем попало, лишь бы заработало здесь и сейчас. И теперь тоже самое в питоне начинается
    Ответ написан
    5 комментариев
  • Как перенести длинную строку в коде?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $send .= "sudo screen -dmS screen_name docker run $user_container $memory_container -d -it --cpus '1' --memory=" . $mem."m $v1 $v2 $v3 $v4 $v5 -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 $v6 $v7 $v8 $v9 $v10 $v11 $v12 $v13;";

    но как же я задолбался все эти кавычечки выковыривать
    Ответ написан
    2 комментария
  • Возможно ли в PHP по заголовкам точно определить устройство и Браузер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Весь вопрос в требуемой точности.
    Я могу написать в юзер-агенте что у меня FireChrome Opera версии 100500 для межгалактических планшетов.
    А на самом деле это будет Brave для PC XT.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    select * from users where rating < ? order by rating desc limit 10
    select * from users where rating > ? order by rating limit 10
    Ответ написан
    1 комментарий
  • Как обновить данные в mysql?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Кто ж вас учил так с БД работать?
    Во-первых, данные всегда должны всегда передаваться в запрос отдельно.
    Во-вторых, код соединения совсем непонятный.
    Если используется mysql.connector, то надо как-то так
    import mysql.connector
    conn = mysql.connector.connect(host='127.0.0.1', database='test', user='user', password='')
    cursor = conn.cursor()
    sql = "UPDATE `user` SET `participate`=%s WHERE `id` = %s"
    cursor.execute(sql, [number, id])
    conn.commit()
    Ответ написан
    5 комментариев
  • Почему PermissionError: [Errno 13] Permission denied на хостинге?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Немного странно спрашивать "в чем может быть проблема", если это написано прямо в заголовке вопроса.
    Ошибка Permission denied является совершенно стандартной, переводится как ошибка прав доступа к файлам/папкам.
    ".htaccess" (как и sqlite) здесь совершенно не при чем
    Пользователь, под которым выполняется веб-сервер, не имеет права на запись в папку app/static/images/goods/
    Надо разобраться, под каким пользователем создана папка и под каким пользователем выполняется веб-сервер. В самом тупом случае поставить папке права 777, но лучше всего конечно сделать так, чтобы веб-сервер выполнялся от имени пользователя
    Ответ написан
    5 комментариев
  • Ошибка IntegrityError: UNIQUE constraint failed?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ахаха, я наконец увидел. Я уже отвечал на этот вопрос.
    Причём, судя по всему, тому же самому клиенту.

    Ну что ж за мания такая, писать имена полей в одинарных кавычках? Откуда эта глупость?
    Если это тот же самый клиент, то почему такая необучаемость? Если другой, то это значит какой-то очередной сетевой гуру так вещает? И где можно припасть к источнику его мудрости?
    Ответ написан
    1 комментарий
  • Хорошо ли использовать в PHP неявное приведение типов int bool?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Технически равноценны, но второй при сравнении с нулём выглядит глупо.
    Хорошо или не хорошо - вопрос философский. РНР до сих пор язык со слабой типизацией, и никаких подвохов или расходов тут нет.
    Я бы сказал, что неявное приведение к булеву типу до сих пор используется повсеместно, что в if, что в while. Особенно в последнем. Писать while (($row = $stmt->fetch()) !=== false) вместо while ($row = $stmt->fetch()) пока ещё народ отказывается.
    Ответ написан
  • Почему не номер телефона не проходит соответствие шаблону в БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    С каких пор LIKE стала работать с регулярками?
    select 9998887766 REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    Ответ написан
    1 комментарий
  • MemcacheD: как хранятся ключи "под капотом" у него?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Понятное дело что ни к посетителям, ни к сессиям мемкеш никакого отношения не имеет, как и РНР. HTTP - это stateless протокол, и все клиенты в РНР на одно лицо.
    Мемкеш - это демон, который обслуживает входящие соединения, которые для него тоже все на одно лицо. Причём это лицо - РНР, а не какой-то там НТТР клиент.
    РНР конечно может создать ключ в мемкеше на основе куки, полученной от пользователя, но для мемкеша это будет совершенно обычный ключ, не привязанный ни к какому "клиенту". А всё привязка - это чисто интерпретации на уровне пользовательского РНР кода.

    А вот почему тормоза и дубли - тут я ответить не могу, потому что с мемкешем сталкивался лет 10 назад по касательной. Это к вопросу о том, что искать часы надо там, где потерял, а не не под фонарём потому что светлее. И задавать вопрос надо про исходную проблему, а не про свои догадки по её поводу.

    По идее никаких дублей в мемкеше быть не должно - это key-value хранилище и ключи должны быть уникальными.
    Возможно, выгрузка показывает уже просраченные ключи.
    А тормоза, возможно, из-за того, что ключи постоянно перезаписываются, вместо того, чтобы записываться только тогда, когда надо обновить данные.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    потому что переводы строк конечно же
    Ответ написан
  • Почему не нужно заранее объявлять массив?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Почему не нужно заранее объявлять массив?


    Как правильно заметили в комментарии выше, "это РНР, тут так можно".
    Раньше вообще можно было инициализировать переменную как строку, и потом обращаться к ней, как к массиву.
    Начиная с 7 версии начался отход от таких вольностей, но он всё ещё в процессе.

    Значит то что пишут $result = [] Это я удобства?


    Не для "удобства", а для того, чтобы волосы на голове сохранились подольше.
    В данном случае нужды в явном присвоении нет.
    Но любой код со временем изменяется. И функция tower_builder() может разрастись. Там появится ещё один цикл, который работает с массивом $result. Который получит какое-то значение до начала нашего цикла, и в итоге конечный результат будет неправильным. Поэтому $result = [] перед началом работы с массивом - это не каприз или удобство, а необходимость
    Ответ написан
    Комментировать
  • Почему не подгружаются стили?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что ./css/style.min.css - это бессмыслица и карго культ.
    Ссылки на локальные ресурсы должны быть абсолютными путями от корня сайта. А не вот это вот.
    То есть в данном случае надо убрать точечку.

    Ну ведь всё просто же.
    В отличие от файловой системы, где никогда заранее не знаешь, где у неё корень, с веб сайтом всё просто и понятно, корень всегда один - /
    / - корень сайта
    /css - папочка css в корне сайта
    /css/style.min.css - файл style.min.css в папочке css которая лежит в корне сайта
    Всё просто, понятно, очевидно

    Зачем вообще было писать эти точечки?
    Они начинаются, когда ты только учишься склыдывать а и б в HTML. И нет у тебя никакого веб-сервера, а есть файлик на диске. В этом случае да - без относительных путей никак не обойтись
    Но как только начинается РНР, который без веб сервера уже не работает, про все точечки в локальных ресурсах надо забыть, и писать всегда абсолютные пути от корня сайта.
    Ответ написан
    2 комментария