MySQL SELECT函数在字段列表中返回未知列错误

时间:2019-09-24 08:03:59

标签: php mysql

我有这段代码,由于我似乎写的很好,所以我无法弄清楚代码中的错误。 这是代码...

function add_product_to_cart($pdo, $table, $cart_id, $product_id, $attributes){
    $parameters = [':product_id' => $product_id, ':attributes' => $attributes];

    #$addProduct = ' DECLARE productQuantity INT; ';
    #$addProduct = 'SELECT @cart := ' . $cart_id;
    $addProduct = 'SET @cart := ' . $cart_id . ';';
    $addProduct .= 'SELECT  * FROM `' . $table . '` WHERE cart_id = @cart AND product_id = :product_id';
    $addProduct .= ' AND attributes = :attributes ';
    $addProduct .= 'IF @cart IS NULL THEN INSERT INTO `' . $table . '`(';
    $addProduct .= 'cart_id, product_id, attributes, quantity, added_on) VALUES (';
    $addProduct .= '@cart, :product_id, :attributes, 1, 1, NOW())';
    $addProduct .= ' ELSE UPDATE `' . $table . '` SET quantity = quantity + 1, buy_now = true WHERE cart_id = @cart';
    $addProduct .= ' AND product_id = :product_id AND attributes = :attributes';
    query($pdo, $addProduct, $parameters);
    return $query;
}

这是错误

  

无法连接到数据库服务器:SQLSTATE [42S22]:列不   找到:1054个未知的列'3ab31dbf3ced5f2c4df0b739e740110f'在   

中的“字段列表”

我要做的实际上是检查cart_id是否保存在数据库中,如果已保存,请更新数据库中的数量,如果没有,则将其插入数据库中。

它抱怨的未知列是值,要搜索的列是cart_id

1 个答案:

答案 0 :(得分:1)

Nigel Ren建议,这是利用MySQL INSERT ... ON DUPLICATE KEYS syntax的好地方。

要执行此操作,只需在列(cart_id, product_id)上创建唯一约束。

ALTER TABLE mytable ADD CONSTRAINT my_table_constraint UNIQUE (cart_id, product_id);

请注意,要创建约束,现有数据必须符合要求(即,如果表中已经有重复项,则无法创建它,您需要先删除它们)。

现在,您可以使用followinq查询简化整个代码:

INSERT INTO mytable
    (cart_id, product_id, attributes, quantity, added_on) 
    VALUES (:cart, :product_id, :attributes, 1, 1, NOW())
ON DUPLICATE KEYS UPDATE quantity = quantity + 1, buy_now = true 

如果您尝试在已经存在的(cart_id, product_id)元组上进行插入,那么MySQL会自动跳过该插入并执行ON DUPLICATE KEYS子句中描述的更新命令。

除了使您的代码更短,更简单之外,此语法的另一个好处是可以有效地保护您免受竞争条件的影响:对于您现有的代码,始终有可能两个同时运行的进程会插入重复的记录,而当使用上述方法,MySQL可以保证数据完整性。

唯一的缺点是约束适用于在表上再次执行的所有操作,而不是局限于代码的特定部分。