【问题标题】:Update MySQL Columns of type SET from PHP (PDO)从 PHP (PDO) 更新 SET 类型的 MySQL 列
【发布时间】: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(或等效)的单个属性时。如果你想从规范化的角度来看,一个设定值可以看作是一个原子值。

标签: php mysql pdo


【解决方案1】:

解决办法是:

$r = array('user', 'admin');    
$pv = implode(',', $r);
$st->bindParam(':roles', $pv);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2013-07-01
    相关资源
    最近更新 更多