5

私が見つけた唯一の同様の質問は次のとおりです。Zend_Dbを使用してphpブール値をmysqlビット列に挿入しますが、これには答えがありません。

以下の簡略化されたテストを参照してください。

'allow'列タイプは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) と、問題はありません。

これはMySQLPDOドライバーのバグですか、それとも私だけですか?

あなたの助けを期待して感謝します。

4

4 に答える 4

3

PHP が「true」をブール値として解釈していないようです。PHP.NETは、PDO::PARAM_BOOL が整数であることを示します。データ型が「bit」のカラムの MySQL の解釈は、 バージョン 5.0 前後で変更されました。これが意味することは、PHP がおそらく完全な整数 (32 ビット) を、予測できないビット数 (1 から 64) を持つ列に挿入しようとしているということです。

于 2012-04-09T18:08:16.220 に答える
3

キャスト機能を使用します。

Values ( CAST( :allow AS UNSIGNED), :roleID, :permID)
于 2012-10-16T14:13:32.347 に答える