php - 复杂的 php mysqli 查询插入数据(如果不存在): getting Duplicate column name '?'

标签 php mysql mysqli

所以,伙计们,请查看我的示例代码,并帮助我,我找不到解决方案,在我传递 ?,?,?,? 等参数的行上不断出现重复的列名称。 我在查询中一起传递了 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/

相关文章:

php - 使用 PHP 和 MySQL 处理空间数据时出现的问题

php - 在 Docker Compose 中将 PHP-FPM 与 Nginx 连接

PHP 使用 MySQL 更新表

php - 在 PHP 中处理两个 mysql 连接

mysql - "INSERT INTO .. ON DUPLICATE KEY UPDATE"只插入新条目而不替换?

php - 如果表mysqli中的同一列,如何计算行x和行y

php - MYSQLI prepared statement proceeds 没有输出

php - 使用外键从第二个表获取值

php - 关于Php和Mysql哈希表的问题

php - 确定数据中的连胜