所以,伙计们,请查看我的示例代码,并帮助我,我找不到解决方案,在我传递 ?,?,?,? 等参数的行上不断出现重复的列名称。 我在查询中一起传递了 7 个变量。知道可能是什么问题吗?
$SQL = "INSERT INTO wifi (ssid, password, name, surname) SELECT *
FROM(SELECT ?, ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT
ssid,name,surname FROM wifi WHERE ssid=? AND name=? AND
surname=?) LIMIT 1;";
if ($stmt = $mysqli->prepare($SQL)) {
$stmt->bind_param("sssssss", $ssid, $password, $name, $surname,$ssid, $name, $surname);
$stmt->execute();
echo $SQL;
}
if ( false===$stmt ) {
die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
好吧,我知道这有点复杂,但是这个查询正在 mysql 服务器上运行。我只是在通过 PHP 执行此操作时遇到问题,因为它返回 prepare() failed: Duplicate column name '?'
谢谢!
最佳答案
试试这个:
$SQL = "INSERT INTO wifi (ssid, password, name, surname)
SELECT ?, ?, ?, ? FROM DUAL
WHERE NOT EXISTS (
SELECT *
FROM wifi
WHERE ssid=? AND name=? AND surname=?)";
DUAL
是一个虚拟表名称,当您不需要访问实际表时可以使用它。将占位符放在主SELECT
而不是子查询中似乎可以避免占位符问题。
执行此操作的另一种方法是在这些列上创建唯一索引:
CREATE UNIQUE INDEX ssid_name_surname ON wifi (ssid, name, surname);
然后你可以使用:
$SQL = "INSERT IGNORE INTO wifi (ssid, password, name, surname)
VALUES (?, ?, ?, ?)";
如果您想更新密码(如果密码已存在),请使用 ON DUPLICATE KEY UPDATE
而不是 INSERT IGNORE
:
$SQL = "INSERT INTO wifi (ssid, password, name, surname)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE password = VALUES(password)";
关于php - 复杂的 php mysqli 查询插入数据(如果不存在): getting Duplicate column name '?' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30386526/