5

我发现的唯一类似问题是:Insert php boolean into mysql bit column with Zend_Db但这没有答案。

请看下面的简化测试:

“允许”列类型为 BIT。
'roleID' 列类型是 INT。
“permID”列类型为 INT。

$dbo = new PDO("mysql:dbname=database;host=127.0.0.1", "phpuser", "pass");

$query = $dbo->prepare("INSERT INTO ws_role_perms (allow, roleID, permID)
                            VALUES (:allow, :roleID, :permID)");

$query->bindValue("allow", true, PDO::PARAM_BOOL);
$query->bindValue("roleID", 1, PDO::PARAM_STR);
$query->bindValue("permID", 2, PDO::PARAM_STR);

if ($query->execute() == false) {
    throw new Exception(print_r($query->errorInfo(), true));
}

我收到的错误信息是:

Array (
    [0] => 22001
    [1] => 1406
    [2] => Data too long for column 'allow' at row 1
)

如果我尝试将等效查询直接放入 MySQL,即通过运行查询:INSERT INTO ws_role_perms (allow, roleID, permID) VALUES (true, 1, 2) 我没有问题。

这是 MySQL PDO 驱动程序中的错误,还是只是我?

非常感谢您的帮助。

4

4 回答 4

3

似乎 PHP 没有将“真”解释为布尔值。PHP.NET表明 PDO::PARAM_BOOL 是一个整数。MySQL 对数据类型为 'bit'的列的解释 在 5.0 版之后发生了变化。这意味着 PHP 可能试图将一个完整的整数(32 位)插入到具有不可预测位数(1-64)的列中。

于 2012-04-09T18:08:16.220 回答
3

使用 Cast 功能:

Values ( CAST( :allow AS UNSIGNED), :roleID, :permID)
于 2012-10-16T14:13:32.347 回答
3
$query = $dbConnection->prepare("UPDATE roles SET isTrue= b? WHERE itemID = ?;");
$result = $query->execute(array(true, $productID_GET));

在变量前使用“b”将任何值转换为位。

就我而言,我也有一个位列,我遇到了同样的错误。我就是这样解决的。

于 2018-07-05T02:03:43.307 回答
1

我启用了ANSITRADITIONAL模式,我必须使用以下构造:

IFNULL(IF(?,TRUE,FALSE),NULL)

如果您提供 PHP 'null',它将将该列设置为 NULL。否则 MySQL 将评估提供的变量。如果它为零,则该列将设置为 FALSE,如果它不为零,则该列将设置为 TRUE。

我希望这有帮助。

于 2019-08-16T14:39:46.733 回答