PHP表单将内容添加到列而不会覆盖

时间:2018-10-25 13:56:07

标签: php postgresql

我需要一种将数据添加到列中而不覆盖旧数据的表单,我已经尝试过对此进行修改,但这种方法不起作用。理想情况下,我希望使用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) ?>`

2 个答案:

答案 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}'";