首页 > 解决方案 > 阻止 SQL 插入重复项 (php)

问题描述

只用SQL语句似乎不可能做到这一点,所以我写了一个php检查,完全被脚本忽略了。$resource 数组保存正确的数据。

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); 
        }
    }
}

标签: phpsqldatabaseooppdo

解决方案


根据我对 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 中并不完全可能)。


您的查询失败的原因是您使用fetchover fetchAllwhich 仅返回第一行结果,而这将运行它不会给出所需的结果(我猜这是检查用户名是否已经存在)。即使那样(正如 Ivan Vartanyan 指出的那样),您仍然需要foreachin_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); 
            }
        }
    }
}

推荐阅读