php - 阻止 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);
}
}
}
解决方案
根据我对 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
over fetchAll
which 仅返回第一行结果,而这将运行它不会给出所需的结果(我猜这是检查用户名是否已经存在)。即使那样(正如 Ivan Vartanyan 指出的那样),您仍然需要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);
}
}
}
}