• Как правильно создать триггер?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    У вас все поля в пределах одной таблицы. Почему не вычисляемое поле?

    Как указал Akina использовать NOW() нельзя, но с учётом того, что срабатывание триггера выполняется только один раз, в момент на которое указывает поле modified можно использовать его. Также приведя условия статуса к верной логике получаем (MySQL online):
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL,
        modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        status int(11) AS ( case
                              when modified < start_date THEN 0
                              when modified >= start_date AND modified <= end_date THEN 1
                              when modified > end_date THEN 2
                              else -1
                            end )
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- fetch 
    SELECT * FROM airdrops;


    статус 2 устанавливался автоматически если текущая дата
    Использовать представление (MySQL online)
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- view
    CREATE VIEW airdrops_status
    AS
    SELECT start_date, end_date,
          case
            when NOW() < start_date THEN 0
            when NOW() >= start_date AND NOW() <= end_date THEN 1
            when NOW() > end_date THEN 2
            else -1
          end AS status
      FROM airdrops;
    -- fetch 
    SELECT * FROM airdrops_status;
    Ответ написан
    6 комментариев
  • Как прочитать данные из двух таблиц одновременно?

    ValeriuCutebov
    @ValeriuCutebov
    Для того чтобы получить данные из двух таблиц, вам необходимо сделать JOIN запрос к базе данных, объединяя таблицу материалов с таблицей категорий. Пример такого запроса может выглядеть так:

    SELECT f.*, c.category_name 
    FROM freeroll f 
    JOIN category c ON f.category_id = c.id 
    ORDER BY f.id

    В этом запросе мы объединяем таблицы freeroll и category, используя условие ON f.category_id = c.id, и выбираем все столбцы из таблицы freeroll (*) и столбец category_name из таблицы category. Этот запрос вернет результат, который содержит данные из обеих таблиц, а также связанные данные из таблицы category для каждого материала.

    Чтобы реализовать этот запрос в методе read() вашей модели Freeroll, вам необходимо изменить запрос в методе read() на:
    $query = "SELECT f.*, c.category_name 
              FROM " . $this->table_name . " f 
              JOIN category c ON f.category_id = c.id 
              ORDER BY f.id";

    Затем, в цикле while, вы можете добавить значение category_name к массиву $freeroll_item:
    $freeroll_item = array(
        "id" => $id,
        "name_turnament" => $name_turnament,
        "prize" => $prize,
        "password" => $password,
        "data" => $data,
        "time" => $time,
        "category_id" => $category_id,
        "category_name" => $category_name,
        "buyin" => $buyin,
        "buyin_symbol" => html_entity_decode($buyin_symbol),
        "prize_symbol" => html_entity_decode($prize_symbol)
    );

    Здесь мы добавляем значение category_name к массиву $freeroll_item, которое мы получили из таблицы category с помощью JOIN запроса.

    Далее, в методе read.php вы можете вызвать метод read() вашей модели Category, чтобы получить все записи из таблицы категорий, и сохранить результаты в массив $category_arr. Это можно сделать следующим образом:
    $category = new Category($db);
    $category_stmt = $category->read();
    $category_num = $category_stmt->rowCount();
    
    $category_arr = array();
    while ($category_row = $category_stmt->fetch(PDO::FETCH_ASSOC)) {
        extract($category_row);
        $category_item = array(
            "id" => $id,
            "category_name" => $category_name
        );
        array_push($category_arr, $category_item);
    }

    Затем, внутри цикла while для каждого материала в $freeroll_arr, вы можете перебрать массив $category_arr, чтобы найти категорию с нужным id, и добавить ее значение к массиву $freeroll_item:
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        extract($row);
    
        $freeroll_item = array(
            "id" => $id,
            "name_turnament" => $name_turnament,
            "prize" => $prize,
            "password" => $password,
            "data" => $data,
            "time" => $time,
            "category_id" => $category_id,
            "buyin" => $buyin,
            "buyin_symbol" => html_entity_decode($buyin_symbol),
            "prize_symbol" => html_entity_decode($prize_symbol)
    );
    
    // Поиск категории с нужным id в массиве $category_arr
    foreach ($category_arr as $category_item) {
        if ($category_item['id'] == $category_id) {
            $freeroll_item['category_name'] = $category_item['category_name'];
            break;
        }
    }
    
    array_push($freeroll_arr["freeroll"], $freeroll_item);
    }

    Здесь мы ищем категорию с нужным id в массиве $category_arr, и если находим, добавляем значение category_name к массиву $freeroll_item.

    Теперь ваш метод read() будет возвращать все записи из таблицы freeroll, включая название категории для каждого материала.
    Ответ написан
    1 комментарий
  • Как массово заполнить таблицу?

    erge
    @erge
    Примус починяю
    Если совсем все сложно с решением выше, хотя оно рабочее (пробуйте разные редакторы, выбирайте какой вам больше подойдет, читайте про регулярные выражения, я не знаю как без них вообще жить ))))

    делайте все из командной строки - скачайте утилиты командной строки sqlite - https://www.sqlite.org/download.html
    Precompiled Binaries for Windows
    sqlite-tools-win32-x86-3410000.zip
    распаковываете утилиты куда вам удобно, прописываете в переменную PATH, ну или например распакуйте в c:\bin

    копируете файл в папку с вашей бд sqlite
    далее запускаете sqlite3.exe в 'этой папке (в консоли, в командной строке!) указывая ему вашу БД, например

    sqlite3.exe my_example_db.sqlt

    далее в командной строке самой sqlite пишете
    create table ru_word (word varchar(100), freq INT);


    PS: порядок полей такой, потому что в файле такой порядок и он грузится как есть, для БД порядок не важен.
    далее

    далее указываете сеператор (разделитель полей в текстовом файле)
    .separator " "
    грузите файл в таблицу
    .import ru_50k.txt ru_word

    все!

    в итого будет примерно так (в командной строке!):
    : переходим в папку с БД, там же должен быть файлru_50k.txt
    cd C:\tmp
    
    : открываем БД в sqlite3
    c:\bin\sqlite3.exe my_example_db.sqlt
    SQLite version 3.41.0 2023-02-21 18:09:37
    Enter ".help" for usage hints.
    sqlite> create table ru_word (word varchar(100), freq INT);
    sqlite> .tables
    ru_word
    sqlite> .separator " "
    sqlite> .import ru_50k.txt ru_word
    sqlite> SELECT count(*) FROM ru_word;
    50000
    sqlite> SELECT MAX(freq) FROM ru_word;
    3854593
    sqlite> SELECT * FROM ru_word LIMIT 10;
    я 3854593
    не 3244771
    что 2665565
    в 2212420
    и 2179689
    ты 2067418
    это 1999607
    на 1240437
    с 1128276
    он 966203
    sqlite> .quit


    PPS: научитесь пользоваться поиском, например загрузка csv в sqlite и т.п. и т.д. etc
    Ответ написан
    1 комментарий
  • Как правильно выбрать все товары?

    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
    Ответ написан
    Комментировать
  • Как сделать множественную выборку?

    iMedved2009
    @iMedved2009
    Не люблю людей
    select 
         country.* ,
        products.*
    from country
    join product_country on country.id = product_country.country_id
    join products on products.id = product_country.product_id
    Ответ написан
    23 комментария
  • Как структурировать бд?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Отношение Many-to-Many строится через промежуточную таблицу связи, поля которой ссылаются на две основные таблицы.
    products_countries (product_id, country_id)
    Ответ написан
  • Как структурировать бд?

    RNSNS
    @RNSNS
    Symfony Backend developer
    Попробуйте создать ещё одну таблицу, которая будет называться product_coutry
    В ней должно быть только 2 поля product_id и country_id
    Так и создаются связи M2M (ManyToMany)
    Ответ написан
  • Как открыть ссылку в фрейме?

    zkrvndm
    @zkrvndm
    Архитектор решений
    <form class="row justify-content-center">
    	<div class="col-8">
    		<label for="inputPassword2" class="visually-hidden">URL</label>
    		<input type="text" class="form-control" id="inputUrl" placeholder="Url">
    	</div>
    	<div class="col-auto">
    		<button type="submit" class="btn btn-primary mb-3">Open</button>
    	</div>
    </form>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    
    <script>
    	
    	$(function() {
    		
    		$('form').submit(function() {
    			
    			event.preventDefault();
    			
    			$('body').html('<iframe src="'+$('#inputUrl').val()+'"></iframe>')
    			
    		});
    		
    	});
    	
    </script>
    Ответ написан
    2 комментария
  • Как дополнить массив?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Чет вообще пошли вопросы уровня третьеклассников...
    $faucet_arr['status'] = 'ok';
    echo json_encode($faucet_arr);
    Ответ написан
    Комментировать
  • Как правильно понять причину отклонения?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Новая волна в плее. До этого боролись с полным доступом к файлам (май прошлого года). Еще раньше выпили менеджеры буфера обмена и запись звонков. Теперь закручивают для лиц с ограниченными возможностями.
    Через эту дырку можно делать, то что запретили раньше. Так, что или приложение будет использовать апи по назначению либо не пройдет модерацию.

    API для специальных возможностей
    API для специальных возможностей нельзя использовать:

    для изменения настроек пользователя без его согласия или блокировки отключения или удаления приложений или сервисов, за исключением случаев, когда разрешение было предоставлено родителем или законным представителем через приложение родительского контроля или уполномоченными администраторами через программное обеспечение для управления корпоративными устройствами;
    для работы в обход настроек конфиденциальности, встроенных в операционную систему Android;
    для модификации пользовательского интерфейса или взаимодействия с ним в нарушение правил Google Play для разработчиков (например, с целью обмана пользователей).
    API для специальных возможностей не предназначен для удаленной записи звонков и не может запрашиваться для этой цели.

    Использование API для специальных возможностей должно быть отмечено на странице приложения в Google Play.

    Рекомендации по использованию метода IsAccessibilityTool
    Если основным назначением приложения является непосредственная поддержка людей с инвалидностью, вы можете указать, что это ПО для обеспечения специальных возможностей, выполнив метод IsAccessibilityTool.

    В противном случае вы не можете использовать этот метод, но приложение все равно должно соответствовать требованиям к раскрытию информации и получению согласия пользователей, описанным в правилах в отношении пользовательских данных, поскольку поддержка специальных возможностей неочевидна. Чтобы узнать больше, прочитайте статью об AccessibilityService API в нашем Справочном центре.

    Используйте API и разрешения с более узкой областью действия, чем у API для специальных возможностей, если этого достаточно для желаемой функциональности.

    Дата вступления в силу: 11 июля 2022 г.


    P.S. Мне пришлось бодаться с модерацией за MANAGE_EXTERNAL_STORAGE . Прилетает реджект на обновление.
    В опеляции повторил тоже что и в описании на пермишен. На странице сильнее выпятил, что это единственная функция у приложения. Добил описанием как это можно использовать совместно с другими программами.
    Я специально из основного приложения выпиливал в отдельное - обсервер директории, который следит за новыми файлами и шлет из на печать.
    Ответ написан
    3 комментария
  • Почему api выводится хаотично а не по порядку?

    Extar93
    @Extar93
    Не нужны нам эти ваши интернеты
    Поменяйте ORDER BY с name на id, как вы и предположили
    Ответ написан
    Комментировать
  • Как правильно работать с api?

    selico
    @selico
    WordPress
    У HivePress есть свое API: https://bump.sh/hivepress/doc/rest-api
    Но, возможно, для приложения вам его не хватит и придется дописывать — это можно будет решить самостоятельно или заказать доработку
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку?

    Потому-что в методе encode ожидает 3 параметра (там у вас даже написано это). Перейдите в метод encode и посмотрите, чего не хватает. Обычно передается payload, secret key и algorithm.
    $jwt = JWT::encode($payload, $key, 'HS256');
    Ответ написан
    Комментировать
  • Как выполнить функцию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const foo = () => (123321).toString();
    
    foo() // "123321"
    Ответ написан
    4 комментария
  • Как в document.querySelector вставить html?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    document.querySelector('.post-list').innerHTML += `
            <div class="card" style="...">
                <div class="card-body">
                    <h5 class="card-title">${post.title}</h5>
                    <p class="card-text">${post.body}</p>
                    <a href="#" class="card-link">Подробнее</a>
                </div>
            </div>`


    posts.array.forEach

    Ошибка, потому что в posts нет элемента array
    Ответ написан
    2 комментария
  • Как правильно сделать проверку на пустоту?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    public function create(){ 
        //clean data
        // ...
        
       if(strlen($this->body) === 0) {
            return false;
        }
    
        //binding of paramters
        //...
    }
    Ответ написан
    4 комментария
  • Можно ли отправить post запрос в форму?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Буду благодарен если подскажите подобные библиотеки для андроид, что бы можно было отправлять запросы напрямую в поле на сайт

    Добрый день.
    HTTP запросы работают не с клиентской частью (с формой отображаемой в браузере), а с серверной частью. Т.е. при помощи методов http вы общаетесь с сервером.
    Соответственно, откройте форму, о которой идет речь и консоль браузера и посмотрите куда именно шлет post запрос эта форма (на какой эндпоинт). Также посмотрите какие данные она отправляет POST запросом.
    Подсказка:
    fpsqEQ4.png
    Но обратите внимание на то, что помимо данных из формы также есть кукис, которые тоже нужно отправлять.

    Саму либу лучше поменять на что-нибудь другое.
    И вообще, если планируется работать с либой из приложения, то стоит подумать о реализации REST API с авторизацией по jwt.
    Ответ написан
    4 комментария
  • Почему я получаю ошибку 500?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Ошибка в строке:
    echo json_encode(array('status'=>$status'result_code'=>$result_code));

    должно быть:
    echo json_encode(array('status'=>$status, 'result_code'=>$result_code));


    PHP run code online

    А кроме этого прочтите что-нибудь об SQL Injection & prepared statements
    Ответ написан
    Комментировать
  • В чём проблема с HashMap?

    Jacen11
    @Jacen11
    То есть объект "kun" уже не может быть NULL

    да что ты говоришь. По твоему значит это какая то ошибка в джаве? язык который используется всеми банками за его надежность

    В чём проблема с HashMap?
    ни в чем
    ты даже не понимаешь что вызов на любом объекте null методов или полей будет эксепшен

    При этом в строке 271 я вывожу в консоль это:

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

    @WaterSmith
    Android-разработчик. Java, Kotlin
    Когда у тебя EditText содержит пустую строку, получается что ты делаешь
    Integer.parseInt("");
    В результате чего получается null
    Поскольку null нельзя присвоить примитивному типу int то при попытке это сделать у тебя возникает NullPointException - для пользователя это выглядит будто программа просто сама закрылась.
    У тебя два выхода:
    1. Отловить этот NullPointException с помощью try catch
    2. Присваивать не примитивному типу int, а объектному Integer, а затем после присвоения проверит, результат на не равенство null
    Не зависимо от способа, либо в catch либо в else переприсваешь значение перемнной на 0, ну или выдешь ошибку, в зависимости от того, чего там требует логика твоей программы.
    Ответ написан
    Комментировать