我需要一种将数据添加到列中而不覆盖旧数据的表单,我已经尝试过对此进行修改,但这种方法不起作用。理想情况下,我希望使用3个连字符作为新旧之间的分隔符,因此,如果有人输入XXX,并且已经有YYY,则将其另存为YYY --- XXX,然后如果有人输入XXX并且它为空,则更新为没有连字符,但是我还没有解决添加文本的问题。
声明
<?php
$v = array();
$v[0] = $_POST['note'];
$v[1] = $_POST['product_id'];
$dbh = dbh_get();
$sql = 'UPDATE card SET notes = $v[0] + notes WHERE product=$v[1]';
$stmt = $dbh->prepare($sql);
$stmt->execute($v);
dbh_free($dbh) ?>`
答案 0 :(得分:2)
SQL中的string concatenation运算符是||
。 +
将添加数字:
update card
set notes = $v[0] || notes
where ...
请注意,如果任何表达式为null,则a || b
会产生null
。如果表中的notes
可能为null,请使用null安全的concat()
函数:
update card
set notes = concat($v[0], notes)
where ...
要添加“空格”,可以使用concat_ws()
,它将自动处理空值或空字符串:
update card
set notes = concat_ws('---', $v[0], notes)
where ...
答案 1 :(得分:1)
正如@a_horse_with_no_name
告诉您的那样,您需要使用字符串串联运算符,或者像我希望的那样,使用concat_ws
,因为+
用于数字运算。
但是您的示例中还有两个问题。首先,使用变量将字符串放入sql查询。通常,这会起作用,但是您需要将变量放在引号'
中,以便获得有效的sql字符串。像这样:
$sql = "UPDATE card SET notes = concat_ws('---', '{$v[0]}', notes) WHERE product = '{$v[1]}'";
这将使您创建格式正确的sql语句。但这仍然很糟糕,因为正如我在评论中提到的那样,您永远不应将用户输入的内容直接放入数据库查询中。即使仅用于内部目的。不友好的员工不想破坏内部数据,这并不是第一种情况。
但是,即使这不是故意的,也会破坏脚本。如果$v[0]
或$v[1]
的值包含单引号'
,则sql查询将变为无效。因此,请先将您的值转义到查询中。对于postgres
,您可以在php中使用pg_escape_string
。也许您的班级对此有自己的功能。但这是它的样子:
$note = pg_escape_string($_POST['note']);
$product = pg_escape_string($_POST['product_id']);
$sql = "UPDATE card SET notes = concat_ws('---', '{$note}', notes) WHERE product = '{$product}'";