@SidMrk

Как сделать запись в mysql с проверкой на уникальность с учётом времени из поля?

С формы делается регистрация юзера.

Делается запись:

if (isset($_POST["phone"])) {
try {
$connect = new PDO("......");
$sql = "INSERT INTO sportusers (userdate,  phone) VALUES(:postdate, :userphone)";
$stmt->bindValue(":userdate", date('Y-m-d\TH:i:s'));
$stmt->bindValue(":userphone", $_POST["phone"]);

$affectedRowsNumber = $stmt->execute();
if($affectedRowsNumber > 0 ){
echo "Запись сделана";
}
}
    catch (PDOException $e) {
        echo "Database error: " . $e->getMessage();
    }
}


Где :userdate записывается в условном формате 2024-01-30 20:09:44

Вопрос: как при записи сделать проверку на существование первого вхождения записи в строке с таким же userphone , при этом если такая запись уже есть, необходимо проверить в этой же строке userdate на интервал в условные 12 часов?

Т.е. если юзер регается через форму, создаётся строка в таблице с userdate, userphone.
При повторной регистрации, если прошло 12 часов с момента последней регистрации (опираемся на содержимое userdate ) запись успешно создаётся с тем же userphone и новой датой в userdate.
Если 12 часов не прошло, то вывести некое сообщение об ошибке и запись, соответственно, не делать.

Очень прошу помочь в вопросе.
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Akina
Сетевой и системный админ, SQL-программист.
Легко решается триггером. Пример:

- исходная таблица:
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(100),
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);


- триггер:

CREATE TRIGGER tr_users_bi
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  DECLARE allowed_created_at DATETIME;
  DECLARE error_message_text VARCHAR(64);
  SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
  FROM users
  WHERE username = NEW.username;
  IF NEW.created_at < allowed_created_at THEN
    SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text; 
  END IF;
END


DEMO fiddle

PS. Надеюсь, получение сгенерированного сообщения об ошибке и показ его юзеру не составит проблемы..
Ответ написан
Комментировать
@KingstonKMS
Зачем тебе из php создавать и передавать дату в sql?
Делаешь поле userdate со значением по умолчанию CURRENT_TIMESTAMP, в базе создаёшь триггер before_insert, в котором выполняешь проверку времени по результату которой либо создаёшь запись, либо кидаешь исключение.
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Вы можете использовать для вставки следующий запрос:
<?php
$phone = '1234567';
$sql = "INSERT INTO sportusers (userdate,  phone) 
        SELECT NOW(), :userphone
        WHERE NOT EXISTS (
            SELECT 1 FROM sportusers s2 
            WHERE s2.phone = :userphone
            AND userdate > date_sub(now(), interval 12 HOUR)
        )";
$stmt = $pdo->prepare($sql);

$res = $stmt->execute([':userphone' => $phone]);

if($stmt->rowCount() > 0 ){
    echo "Запись сделана";
} else {
    echo "Try later";
}


https://phpize.online/s/h4
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы