Задать вопрос
  • Логические операторы PHP: and, or vs &&, ||?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Поскольку у && приоритет выше, то традиционно выбирают его, чтобы потом не было неожиданностей, как во втором примере.

    Я, собственно, не вижу никакого удобства во втором случае.
    Код должен читаться на лету, без необходимости вчитываться и производить логические вычисления в голове с учётом приоритета выполнения операторов. А здесь мы видим эталонный говнокод, который надо переписать на
    $x = is_good();
    if($x and $y>0)

    Я оставил здесь AND для наглядности, но по-хорошему я бы заменил на &&, просто чтобы следовать единому стилю.
    Ответ написан
    1 комментарий
  • Можно ли автоматизировать через bash удаление кукис определенного сайта в chromium?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну по кукам вот гуглится https://superuser.com/a/920604
    Лежат в sqlite3
    • on Linux: ~/.config/google-chrome/Default/Cookies
    • on Windows: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies
    • on Mac: ~/Library/Application Support/Google/Chrome/Default/Cookies

    Правда, сам файлик БД пришлось поискать, он у меня оказался в ещё одной папке Network
    Запросом
    DELETE FROM cookies where host_key LIKE '%habr.com'
    у меня получилось разлогиниться с Хабра. Только предварительно надо было закрыть браузер.
    Ответ написан
    3 комментария
  • Как узнать сколько сделал код попыток для выпадения нужного числа?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Посчитать все строки, которые этот код вывел. Для удобства можно приложить палец к экрану и вести вниз, в уме прибавляя единицу для каждой строчки.
    Ответ написан
    2 комментария
  • Как настроить nginx под разных пользователей?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сделать шелл скрипт, который создаёт пользователя, папку, конфиг раздаёт права и всё что полагается. Не забываем добавлять www-data в группу пользователя.
    Добавить этот шелл скрипт в /etc/sudoers c NOPASSWD и дергать через sudo из РНР.
    Ответ написан
  • Есть ли какие-то сервисы или форумы, куда можно выложить свой код, чтобы его могли оценить и оптимизировать другие люди?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В теории можно было бы и сюда, но хотя тег и есть, но сами модераторы признают, что модерируют его как бог на душу положит - то пропускают вопросы, то удаляют.

    На английском есть специализированный сайт codereview@stackexchange, при наличии языка это идеальный вариант.

    В принципе, есть ещё русскоязычный stackoverflow, где, при их-то трафике, по идее должны любого клиента принимать с распростёртыми объятиями, но модерят его такие же вахтёры как и здесь.

    Самый надёжный способ получить code-review, это завести два аккаунта. С одного задать вопрос, "как сделать то-то", а с другого - запостить код, который это делает. И тут же набегут советчики, рассказать, что в этом коде неправильно.
    Ответ написан
    2 комментария
  • Как сохранить токен в php-файле и его получать через js?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Делать запрос не напрямую из js, а обращаться к php скрипту на сервере. В РНР делать запрос курлом и возвращать ответ обратно в js.
    Примеров что в сети, что конкретно на этом сайте - миллионы. Вот свежий
    Если не знаете РНР и не готовы учиться, то за готовым кодом на https://freelance.habr.com/
    Ответ написан
  • Какие размеры данных можно хранить в базе данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Дело не в размере данных, а в их структуре.
    Если хранить данные в виде json, то запросы действительно начнут тупить очень быстро.
    Если создать нормальную структуру и записывать каждый элемент данных в свою ячейку, а json использовать только в исключительных случаях, для заведомо неструктурируемой информации, то даже при объемах в сто раз больше всё будет летать.
    Ответ написан
    Комментировать
  • Как раздавать уникальные записи таблицы во многопоточном парсере?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никакие транзакции тут не нужны. транзакции вообще не про это. Почему-то новички упорно путают транзакции с блокировками. Транзакция - это про целостность данных. А чтобы два процесса не считали одну строку - это блокировка.
    Но явные блокировки тут тоже не нужны.

    Сначала забираем запись на себя
    update urls set proxy=proxy_id where done=null and proxy=null limit 1
    потом уже её селектим, работаем, и в конце отпускаем
    select * from urls where proxy=proxy_id
    ...
    Update urls set proxy=null, done=1 where proxy=proxy_id
    Ответ написан
    9 комментариев
  • Как сделать вывод юзеров из бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Делаем загадочные движения руками, незаметно меняем тег br на td и... Магия!
    foreach($row as $v) {
        echo "<td>$v</td>";
    }


    Но на самом деле обычно так не делают, и действительно вытаскивают "что-то одно". Попутно разделяя работу с SQL и HTML и защищаясь от инъекцй. Для этого:

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

    $data = $mysqli->query('SELECT * FROM users')->fetch_all(MYSQLI_ASSOC);
    ?>
    <table>
      <?php foreach($data as $row): ?>
        <tr>
            <td><?=htmlspecialchars($row['id'], ENT_QUOTES) ?></td>
            <td><?=htmlspecialchars($row['name'], ENT_QUOTES) ?></td>
            <td><?=htmlspecialchars($row['email'], ENT_QUOTES) ?></td>
        </tr>
      <?php endforeach ?>
    </table>
    Ответ написан
    1 комментарий
  • Опишите, как устроен процесс контрибьютинга?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Делаем папку c:\php
    2. Скачиваем в неё https://windows.php.net/downloads/releases/php-8.1...
    3. Распаковываем архив.
    4. Запускаем консоль
    5. Переходим в папку с проектом cd c:\web
    6. Запускаем РНР c:\php\php -S localhost:80
    7. Забываем все эти ксампы, мампы, мумбы-юмбы как страшный сон.

    Ответ написан
  • Ошибка table hod has 4 columns but 3 values were supplied?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для программиста очень важно логическое мышление.
    То есть способность анализировать факты и соотносить их со своими представлениями о действительности.

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

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос, конечно, сформулирован криво, но из кода можно понять, что автору нужно.

    Прервать ожидание input() нельзя.
    Поэтому я бы пошёл другим путём - перед запросом ответа запоминал текущее время (time.time()) в переменную, а после ввода - сравнивал её опять с текущим временем, и разница больше заданного значения, то не принимал ответ. Для задачи "пишем свою первую игрушку на Питоне" этого более чем достаточно.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Здесь два вопроса в одном, как прочитать файл, и как назначить в переменные.
    Судя по формулировке, вы не знаете даже как прочитать файл,поэтому надо начать с этого.
    Самый простой и наглядный способ - это просто читать каждую строку и добавлять в список.
    config = [];
    with open(filename) as file:
        for line in file:
            config.append(line.rstrip());

    Теперь можно назначить отдельным переменным, например
    email=config[0]
    Но я бы не стал назначать отдельным переменным, а подумал над более удобным механизмом. Например, добавил бы все значения не в список, а в словарь
    Ответ написан
    3 комментария
  • Как построить структуру данных?

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

    Непонятно, к чему здесь FeatureProps. Зачем тут многие ко многим?
    ProductProps (product_id, feature_id, prop_id) достаточно

    если я захочу заменить точечно на определённых товарах?


    Скорее всего, это будет уже новое свойство.
    Если захочется переименовать для отдельных товаров, то понадобится таблица feature_names(feature_id, product_id, name), которую лефт джойнить к запросу, и брать имя из неё, если есть.

    Имена таблиц тоже лучше делать в нижнем регистре. Сбережёт некоторое количество нервных клеток.

    На всякий случай предупрежу: Если продукт дойдёт до продакшена, то искать всё равно будете Эластиком. И как следствие - выкините весь EAV за ненадобностью, а все свойства сложите в JSON
    Но для практики конечно поколупаться конечно полезно
    Ответ написан
  • Используют ли ОРМ под капотом обычный язык SQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Да
    Ответ написан
    Комментировать
  • Как работать с базой на 2 миллиарда записей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Какой-то странный ответ выбран решением.
    По количеству "фич" SQLite может поспорить со многими "настоящими" базами данных. Я уверен, что автор этого заявления не знает и 5% фич что Sqlite, что Postgres, что mysql.
    Непонятно, за счёт чего "Postgresql конечно будет сложнее". Запросы практически те же самые, код тоже особо не изменится. Понятно, что надо будет собственно установить постгрес или там mysql, но это разовое действие, а сама работа с Postgresql ничуть не сложнее чем с sqlite.

    Главное отличие sqlite от "нормальных" баз данных не в какой-то воображаемой "простоте", а в том что она встроенная. То есть запускается вместе со скриптом, и вместе с ним же умирает. И памяти ей доступно ровно столько, сколько скрипту. Из чего следует, что индексы, хотя и могут помочь, но их приходится заново считывать в память при каждом запуске скрипта.

    В то время как классические DBMS являются постоянно висящими в памяти демонами. У которых все индексы, соответственно, тоже висят в памяти. То есть при обработке запроса система может не сделать вообще ни одного обращения к диску. За счет чего достигается огромный прирост производительности. Надо только следить за тем, чтобы хватало памяти, выделенной для индексов.
    Ответ написан
    2 комментария
  • Как написать бота отслеживающего скидки на маркетплейсах?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не вызовут, если версия РНР "на проде" не меньше 8.0
    Введение в атрибуты
    Ответ написан
    2 комментария