【发布时间】:2021-09-02 09:54:38
【问题描述】:
我想将数据添加到包含 SET 类型列的用户帐户的表中
roles set('user','admin') NOT NULL
在 PHP 中,值存储在字符串的索引数组中。
我正在绑定参数
$st = $conn->prepare($q);
...
// $pv is the value which causes the problem.
$r = array('user', 'admin');
// Nothing of these worked
// 1. Attempt, pass as the original array hoping PDO will take care
$pv = $r;
// 2. Convert to string with separator in various variations.
$pv = '\''.implode(',', $r).'\'';
// 2b.
$pv = '(\''.implode(',', $r).'\')';
// 2c.
$pv = '(\''.implode('\',\'', $r).'\')';
// 2d.
$pv = '\''.implode('\',\'', $r).'\'';
$st->bindParam(':roles', $pv);
我也试过
$conn->setAttribute(\PDO::ATTR_EMULATE_PREPARES, FALSE);
执行查询总是返回
"01000",1265,"Data truncated for column 'roles' at row 1"
【问题讨论】:
-
那么
$pv的值在哪里? -
为什么要添加引号或大括号?如果您想将值
test插入到文本列中,那么您也不会在它周围加上额外的引号或大括号,对吗?您需要插入的值是user,admin。 -
@CBroe 谢谢。好吧,愚蠢的我,这是我没有尝试过的唯一变体。外引号和内引号都不是括号。所以,最后起作用的是: implode(',', $user->Roles)
-
@Rakete 如果您认为在一个字段中存储多个值是可以的,那么请看看这个,看看您这样做会给您的应用程序带来什么问题:stackoverflow.com/a/3653574/5947043
-
@ADyson 我不确定我们是否在谈论同一件事。我没有在文本列中存储分隔的值列表,这确实是个坏主意。 SET 列正是为此目的而创建的,并且在特定上下文中它是正确的列类型。我不经常使用它们,但有时因为它们非常有效。例如,当我不需要该列的索引并且该值绑定到类型为 set(或等效)的单个属性时。如果你想从规范化的角度来看,一个设定值可以看作是一个原子值。