Остановить SQL от вставки дубликатов (php) - PullRequest
0 голосов
/ 26 июня 2018

Кажется невозможным сделать это только с помощью операторов SQL, поэтому я написал проверку php, которая полностью игнорируется сценарием. Массив $ resourse содержит правильные данные.

public function handleUpdates($updates) {

    $stmt = $this->database->connect()->prepare("SELECT ? FROM users"); //<-
    $stmt->execute(["username"]); //<-
    $resource = $stmt->fetch(PDO::FETCH_ASSOC); //<-

    foreach ($updates["result"] as $update) {

        $text = $update["message"]["text"];
        $args = $update["message"]["chat"]["username"];

        if ($text === "/start") {              
            if ($resource['username'] !== $args) //this here is ignored
                $this->database->add($args); 
        }
    }
}

1 Ответ

0 голосов
/ 26 июня 2018

Из того, что я помню о PDO / SQL (я перешел в MVC / Doctrine некоторое время назад), эта часть кажется немного избыточной

$stmt = $this->database->connect()->prepare("SELECT ? FROM users"); //<-
$stmt->execute(["username"]); //<-

и может быть заменена на

$stmt = $this->database->connect()->prepare("SELECT username FROM users"); //<-

поскольку вы только хотите получить данные, найденные в столбце имени пользователя, связывать их нет необходимости (в любом случае это невозможно в PDO).


Причина, по которой ваш запрос не выполненявляется то, что вы используете fetch сверх fetchAll, который возвращает только первую строку результатов, в то время как при этом он не даст желаемого результата (что я предполагаю, чтобы проверить, существует ли уже имя пользователя).Даже тогда (как указывает Иван Вартанян) вам нужно будет foreach или in_array над $resource, поскольку его результаты все равно отправляются в виде массива.

Реально вам не нужно искать ипереберите все данные в PHP, рассмотрите возможность поиска переданных вами данных имени пользователя с помощью SQL (код не проверен);

public function handleUpdates($updates) {
    $stmt = $this->database->connect()->prepare("SELECT username FROM users WHERE username = ?");
    $stmt->execute(array($update["message"]["chat"]["username"]));
    $resource = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$resource) {
        foreach ($updates["result"] as $update) {
            $text = $update["message"]["text"];
            $args = $update["message"]["chat"]["username"];
            if ($text === "/start") {   
                $this->database->add($args); 
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...