1

我正在尝试创建一个用户数据库。一个用户可以拥有不定数量的电话号码。因此,在表单中,我创建了一个 js 函数,它将为我提供新的输入字段,并将信息放入嵌套数组中。

我正在做一个双 foreach 循环来遍历我的数组,并根据 id 是否已经存在并且只需要更新或者它是全新的并且需要插入它来添加 SQL 查询。我将这些 SQL 查询添加到变量 $phoneSql 中。当我回显该变量时,它确实包含一个有效的 SQL 查询,如果我直接在 phpMyAdmin 中尝试它就可以工作。

这是 foreach 循环代码:

 $phoneSql = 'SELECT id FROM user WHERE id = '.$id.' INTO @id;';
 foreach($_POST['phone'] as $key => $value) {
    foreach($_POST['user'][$key] as $id => $number) {
        if($id == 0 && !$number == ''){
            $phoneSql .= 'INSERT INTO phone_number (id, user_id, number) VALUES (NULL, @id, "'.$number.'");';
            } else if (!$number == '') {
                $phoneSql .= 'UPDATE phone_numbers SET user_id = @id,  number = "'.$number.'" WHERE id = '.$id.';';
            } 
        }
    }

我有一个带有表单的edit.php页面,该页面发布到update.php,其中我有上面的foreach循环和以下代码:

$db->updatePhoneNumber($phoneSql);

它还从我正在编辑的用户那里获取 $id。然后它被发送到 db.php 并进入这个函数:

public function updatePhoneNumbers($phoneSql) {
    $ phoneSql = $ phoneSql;

    $sth = $this->dbh->prepare($phoneSql);
    $sth->execute();
    if ($sth->execute()) {
        return true;
    } else {
        return false;
    }
}

但这不起作用。我可以将带有 sql 查询的变量添加到这样的函数中,还是必须以其他方式进行?我对此很陌生,所以我不确定如何进行。我已经尝试寻找解决方案,但没有找到任何解决方案。我很感谢任何建议。

4

1 回答 1

1

您应该做的是使用INSERT ... ON DUPLICATE KEY UPDATE ...构造,为您节省大量逻辑。

例如

INSERT INTO phone_number (id, user_id, number) VALUES (...)
ON DUPLICATE KEY UPDATE user_id=VALUES(user_id), number=VALUES(number)

有了这个,不需要选择,测试,然后插入/更新。您只需插入,如果发生重复键错误,MySQL 会透明地将其转换为更新。

于 2013-03-01T17:42:37.947 回答