PHP Срок действия php + mysql каk?

underpl1g

Участник
Автор темы
84
8
Как можно сделать срок действия ключа по дате/часам/минутам? То есть, я ввожу ключ(уже есть форма) и выбираю срок его действия, к примеру ключ будет работать о 05.04.2021, как это реализовать? Чтобы юзер потом не смог по нему авторизоваться...

Кто сможет - пишите в телеграмм/пм форума. Дам на чаек)
 

Hatrig

Известный
38
43
Делаешь таблицу, например:

id | key | create_at | end_at

Дальше с формы отправляешь данные на функцию, которая заносит значения в базу данных, где ID - автоинкремент, key - твой ключ с формы, create_at - значение из php функции date() с типом timestamp, end_at - время из формы, которое ты указываешь вместе с ключем.

Там, где происходит авторизация, сверяешь текущее время и end_at из таблицы, если текущее больше - пишешь срок действия истек. Всё.
 

underpl1g

Участник
Автор темы
84
8
Делаешь таблицу, например:

id | key | create_at | end_at

Дальше с формы отправляешь данные на функцию, которая заносит значения в базу данных, где ID - автоинкремент, key - твой ключ с формы, create_at - значение из php функции date() с типом timestamp, end_at - время из формы, которое ты указываешь вместе с ключем.

Там, где происходит авторизация, сверяешь текущее время и end_at из таблицы, если текущее больше - пишешь срок действия истек. Всё.
Кодом бы))
 

Livarka

Известный
156
65
Можно было чуть логически подумать и сделать самому за это время
создание таблицы:
CREATE TABLE `mpei`.`keys` ( `id` INT NOT NULL , `pName` VARCHAR(32) NOT NULL , `pKey` VARCHAR(32) NOT NULL , `pDateEnd` TIMESTAMP NOT NULL ) ENGINE = InnoDB;
pName ник или че хош вводи туда
pKey - сам ключ длинной 32 символа
pDateEnd время в Unix формате ( почитай че это)
DELETE WITH PDO:
function connect () { // коннект к твоей бд
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';

    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    try {
         return new \PDO($dsn, $user, $pass, $options);
    } catch (\PDOException $e) {
         throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }
}

function deleteOldKeys() {
    $unixTimeNow = time();
    try{
    $con = $this->connect();
    $sql = "DELETE FROM keys WHERE pDateEnd <= ?";
    $stmt = $con->prepare($sql);
    $stmt->execute([$unixTimeNow]);
    }
catch(Exception $e) {
echo $e->getMessage();
}
}
deleteOldKeys(); // ставишь в крон проверку каждую минуту и все
хз мог ошибиться где то, писал прям тут. А еще id надо AUTO INCREMENT присвоить - дерзай
 

Livarka

Известный
156
65
Самый легкий способ как по мне, поставить cron на выполнение скрипта каждые сутки который будет открывать базу, брать поле с сроком действия и вычитать единицу Вот бесплатный крон сервис
ну я ему и кинул для крона метод
 
  • Нравится
Реакции: Quasper

Quasper

Известный
834
354
ну я ему и кинул для крона метод
Ну твой способ будет с регулярным обновлением данных, что сказывается на трафике хоста, хотя он более оптимален но не так лёгок в понимании всего принципа. А я имел ввиду одну крон задачу в сутки которая просто вычитала бы единицу
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
Убиваем MySQL без регистрации и СМС с помощью кода, опубликованного выше. Всё, что вам понадобится - пара тройка запросов к скрипту и вот ваша база данных уже забита абсолютно бессмысленными операциями - добро пожаловать в мир сетевых пробок. Да и вообще, PDO для двух запросов, серьезно?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
PHP:
if (!file_exists('last_executed')) file_put_contents('last_executed', '0');
$executed_time = intval(file_get_contents('last_executed'));
if (time() - $executed_time < 60) exit(http_response_code(403));
file_put_contents('last_executed', strval($time));

$db_handle = new mysqli('localhost', 'user', 'password', 'database');
if ($db_handle->connect_error) exit(http_response_code(500));

$db_handle->query('DELETE FROM keys WHERE pDateEnd <= ' . time());

exit;
Время интервала можно отредактировать во второй строке. Это не даст слишком часто обращаться к базе данных из этого скрипта.
 
Последнее редактирование:
  • Нравится
Реакции: underpl1g

Livarka

Известный
156
65
Убиваем MySQL без регистрации и СМС с помощью кода, опубликованного выше. Всё, что вам понадобится - пара тройка запросов к скрипту и вот ваша база данных уже забита абсолютно бессмысленными операциями - добро пожаловать в мир сетевых пробок. Да и вообще, PDO для двух запросов, серьезно?
зачем юзать mysqli когда есть PDO?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
зачем юзать mysqli когда есть PDO?
Поддержка MySQLi начала осуществляться раньше, соответственно большее количество версий PHP поддерживает это расширение. Более того, MySQLi работает быстрее, чем PDO - как минимум по той причине, что он не такой массивный, как PDO. Подготовленные стейтменты в этом случае не играют большой роли, потому что скрипт не получает каких-либо данных из вне, а соответственно SQL-инъекции добиться невозможно. Так зачем подключать огромный PDO, если можно воспользоваться MySQLi, ускорив работу скрипта и сократив количество кода, да и к тому же упростив его для новичков в программировании?
 

Livarka

Известный
156
65
Поддержка MySQLi начала осуществляться раньше, соответственно большее количество версий PHP поддерживает это расширение. Более того, MySQLi работает быстрее, чем PDO - как минимум по той причине, что он не такой массивный, как PDO. Подготовленные стейтменты в этом случае не играют большой роли, потому что скрипт не получает каких-либо данных из вне, а соответственно SQL-инъекции добиться невозможно. Так зачем подключать огромный PDO, если можно воспользоваться MySQLi, ускорив работу скрипта и сократив количество кода, да и к тому же упростив его для новичков в программировании?
Я считаю, что если он пытается разрабатывать какую-то систему лучше использовать ПДО ибо ты не выстрелишь себе в ногу.
Ок юзает он mysqli и дойдет до того, что надо массив в запрос засунуть
bind_param не принимает массивы при выполнении запроса,
Именные плейсхолдеры и прочий синтаксический сахар для новичка самое то,
Вставка объектов напрямую в базу данных более удобно чем разбивать данные на переменные.
Твои слова про "убийство базы данных" ничем не доказаны.
Максимум плюс твоего кода это подключение в 1 строку к базе данных.
Мой же метод достаточно просто написать и забыть о коннекте раз и навсегда
Да и прочитав твой код я не думаю, что он разберется что есть что.
Интересно, где ты в запросе DELETE увидел какую-то проблему с производительностью? Он Enterprise проект писать собрался с таким вопросом?
После выполнения скрипта у PDO запрос автоматически закрывается.
Зачем твой высер с циклом DELETE если это можно делать в 1 строку?
1618400458093.png

Сначала вытащить ID у которых дата окончания а потом в цикле по удалять строки где есть этот ID ты в своем уме чел? Ты ему полную хуйню посоветовал.
С таким подходом тебе только вордпресс ковырять
Не умеешь делать - не советуй
 
  • Влюблен
Реакции: ALF

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
Я считаю, что если он пытается разрабатывать какую-то систему лучше использовать ПДО ибо ты не выстрелишь себе в ногу.
Ок юзает он mysqli и дойдет до того, что надо массив в запрос засунуть
bind_param не принимает массивы при выполнении запроса,
Именные плейсхолдеры и прочий синтаксический сахар для новичка самое то,
Вставка объектов напрямую в базу данных более удобно чем разбивать данные на переменные.
Твои слова про "убийство базы данных" ничем не доказаны.
Максимум плюс твоего кода это подключение в 1 строку к базе данных.
Мой же метод достаточно просто написать и забыть о коннекте раз и навсегда
Да и прочитав твой код я не думаю, что он разберется что есть что.
Интересно, где ты в запросе DELETE увидел какую-то проблему с производительностью? Он Enterprise проект писать собрался с таким вопросом?
После выполнения скрипта у PDO запрос автоматически закрывается.
Зачем твой высер с циклом DELETE если это можно делать в 1 строку?
Посмотреть вложение 93141
Сначала вытащить ID у которых дата окончания а потом в цикле по удалять строки где есть этот ID ты в своем уме чел? Ты ему полную хуйню посоветовал.
С таким подходом тебе только вордпресс ковырять
Не умеешь делать - не советуй
Во-первых, ты сам говоришь, что он пишет простейший проект, тогда о каких массивах, именных плейсхолдерах и прочих ненужных функциях вообще может идти речь? Во-вторых, да, моё решение с удалением было написано поспешно и это действительно ужасное решение, твой вариант SQL-запроса в этом плане лучше, но это не отменяет того, что MySQLi работает с запросами быстрее, нежели PDO, особенно в случае с подготовленными стейтментами. В остальном я не вижу абсолютно никакой проблемы - не нужно меня никуда отправлять, что за агрессия?

Если редактировать мой код под твой SQL-запрос, то он станет ещё в два раза короче. Всё стало только лучше.
 
  • Нравится
Реакции: Quasper

Livarka

Известный
156
65
Во-первых, ты сам говоришь, что он пишет простейший проект, тогда о каких массивах, именных плейсхолдерах и прочих ненужных функциях вообще может идти речь? Во-вторых, да, моё решение с удалением было написано поспешно и это действительно ужасное решение, твой вариант SQL-запроса в этом плане лучше, но это не отменяет того, что MySQLi работает с запросами быстрее, нежели PDO, особенно в случае с подготовленными стейтментами. В остальном я не вижу абсолютно никакой проблемы - не нужно меня никуда отправлять, что за агрессия?

Если редактировать мой код под твой SQL-запрос, то он станет ещё в два раза короче. Всё стало только лучше.
Наверное плейсхолдеры чтобы человек понимал как правильно делать в будущем?
Как драйвер для работы влияет на саму работу SQL запроса?
ты на языке передаешь подготовленные данные для выполнения и уже сама база данных выполняет работу.
Если mysqli быстрее на 0,00001 сек то есть ли смысл использовать его? Большинство PHP программистов рекомендуют PDO, он проще и понятнее.
Да, коннект я предоставил не сильно легкий для новичка, но это всяко лучше чем делать 2 запроса хуй пойми для чего селект вообще всрался там.
Зачем выгребать id и потом удалять если можно просто удалить ? Ответь на вопрос