Как я могу заставить этот sql запрос работать в моем php? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь сделать систему отслеживания на своем веб-сайте очень простой c, с учетом только количества зарегистрированных людей.

К сожалению, приведенный ниже код не работает. Я проверил журналы ошибок на моем сервере, и в основном вот в чем проблема: после первого выполнения не обнаруживаются никакие сущности, хотя уже есть запись с этим значением, и поэтому код переходит прямо к «else», а затем вылетает, потому что запись с этим первичным ключом уже есть. Может кто-нибудь помочь мне выяснить, почему он не находит сущность при первом выполнении?

Вот код:

$q = "SELECT date, amount FROM tracking WHERE date = ?";
$req = $bdd->prepare($q);
$req->execute(date("Y-m-d"));
$results = $req->fetchAll();
if (count($results) != 0){
    $results["amount"] = $results["amount"] + 1;
    $track = $bdd->prepare("UPDATE tracking SET amount = ? WHERE DATE(date) = ?");
    $track->execute(array($results["amount"], date("Y-m-d")));
    exit;
}
else{
    $q = 'INSERT INTO tracking (date, amount) VALUES (:val1, :val2)';
    $req = $bdd->prepare($q);
    $req->execute(
        [
            "val1" => date(Y-m-d),
            "val2" => 1,
        ]
    );
}

Спасибо

1 Ответ

1 голос
/ 23 апреля 2020

Похоже, ваша таблица tracking должна иметь только одну строку на date. Есть способ обработать это непосредственно на языке запросов MySQL.

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

CREATE UNIQUE INDEX trackdate ON tracking(date);

Затем используйте этот единственный запрос для вставки / обновления.

INSERT INTO tracking (date, amount) VALUES (CURDATE(), 1)
   ON DUPLICATE KEY UPDATE amount = amount + 1;

Каждый раз, когда вы выполняете этот запрос, он либо вставляет необходимые или увеличить столбец amount. И делает это «атомарно», что означает, что если два разных экземпляра программы php попытаются сделать это одновременно, это не запутается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...