2015-03-03 55 views
2

即時具有以下代碼:如何手動轉義mySQL的布爾值在CakePHP中插入數據庫?

/** @var DboSource $db */ 
    $db = $this->getDataSource(); 

    var_dump($db->value($open, 'boolean')); 
    die; 

    $this->query(
    'INSERT INTO foo(`client_id`, `open`, `modified`, `created`) VALUES(:clientId, :open, NOW(), NOW()) ON DUPLICATE KEY UPDATE modified = now();', 
    [ 
     ':clientId' => $db->value($clientId, 'integer'), 
     ':open' => $db->value($open, 'boolean') 
    ] 
); 

$open是一個布爾值,則'open' -column被定義爲tinyint(1)。當用$db->value($open, 'boolean')包裝$ open時,結果爲'1','0'(請參閱單引號)。

不幸的輸出導致與open = false一個新的記錄(如'1'插入不正確的true

如果我使用$db->boolean($open)作爲選項,一切都正常工作。我想$db->value()也應該做同樣的工作嗎?

回答

3

看看DboSource::value()何時以及如何在內部使用,這是預期的行爲。如果它不會做它的功能,那麼值將不會爲Model::save()操作做好準備。

DboSource::value()內部傳遞「booleanized」值(DboSource::boolean($value, true)這已經增加了引號)PDO::quote(),其中值是怎麼回事,反正不管被引用的東西,即01'0''1'true,或false,它將始終返回報價值,即'0','1'或甚至''(對於false,等於0)。

與您的代碼的問題是,傳遞給的Model::query()第二個參數值最後被傳遞到PDOStatement::execute().../DboSource.php#L458),它把所有的值作爲字符串和逃脫他們據此,所以最後在你的查詢'1'將最終成爲'\'1\'',因此存在問題。

TL; DR

這似乎是預期的行爲,它的記錄只是很差。所以當使用Model::query()的第二個參數時,如果需要的話(例如強制轉換爲整數,布爾值,字符串等等)對值進行消毒處理,但不要轉義它們,只有在手動將它們插入實際查詢字符串時才轉義它們!