• Как сделать вывод юзеров из бд?

    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 комментария
  • Почему тормозит код записи в MySQL после разбивки его на функции?

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

    В целом, цифры какие-то дикие. Что 8 секунд, что 16, что 3. Для записи одного "продукта" нужно максимум 0.1 секунды, если всё очень сильно тормозит
    Ответ написан
  • Почему sql-оператор IN (в WHERE) плох с точки зрения оптимизации?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Использование оператора IN (значение0, значение1, значение2) никак не сказывается на производительности SQL-запроса.
    Чтобы запрос был менее ресурсозатратным, надо посмотреть результат EXPLAIN и расставить индексы.
    Ответ написан
    Комментировать
  • Существует ли тип данных List или Array в MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется, существует.
    Тип данных List или Array в реляционной базе данных - это связанная таблица.

    Соответственно, inventory - это просто таблица из двух полей, id игрока и id скина
    Ответ написан
    Комментировать
  • Поиск по нескольким свойствам по динамическим записям?

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

    В принципе, поиск по одному значению - это просто, по джойну на каждое свойство. Но вот когда выбор из нескольких...
    Как-то так должно по идее работать
    SELECT p.*, sum(po1.classifier_id=1) num1, sum(po2.classifier_id=2) num2 FROM products p
        left JOIN product_options po1 on po1.product_id = id and po1.classifier_id=1 and po1.option_id in (1,2)
        left JOIN product_options po2 on po2.product_id = id and po2.classifier_id=2 and po2.option_id in (10,11)
    group by id having num1 > 1 and num2 > 1;
    Ответ написан
    Комментировать
  • Не передает переменную в запрос?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я думаю, имелось в виду что-то вроде этого
    function regis($pdo, $login, $pass ): bool
    {
        $res = $pdo->prepare("INSERT INTO users(login, password) VALUES (:login,:pass)");
        $res->execute(["login" => $login, "pass" => $pass]);
        return true;
    }


    На будущее: функция должна всегда делать что-то одно. Все проверки, работа с НТТР, сессии - должно быть снаружи.
    Ответ написан
    2 комментария
  • Как реализовать математическую формулу в Telegram боте, написанном на языке python?

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

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

    В данном случае скорее всего подойдёт
    $file = $_SERVER['DOCUMENT_ROOT']."/files/file.png";
    echo filesize($file);


    Если нет - надо сначала разобраться, как этот код вызывается и где на самом деле лежит файл.
    И обязательно почитать про абсолютные и относительные пути
    Ответ написан
    1 комментарий
  • Как получить данные с БД за Н количество дней?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    PHP здесь вообще не нужен, мysql прекрасно умеет работать с датами сама.

    r.date_added > curdate() - interval 30 day

    И на будущее, никогда не использовать date() в условии.
    Ответ написан
    1 комментарий