簡體   English   中英

如何在CakePHP中手動轉義mySQL數據庫插入的布爾值?

[英]How to manually escape a boolean value for a mySQL Database insert in 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的新記錄(因為未正確將true插入'1'

如果我使用$db->boolean($open)作為選項,則一切正常。

但是我認為$db->value()應該做同樣的工作嗎?

查看何時以及如何在內部使用DboSource::value() ,這是預期的行為。 如果它不做它所做的事情,那么就不會為Model::save()操作正確准備值。

DboSource::value()內部將“ booleanized”值( DboSource::boolean($value, true)已將引號引起來)傳遞給PDO::quote() ,無論如何該值都將被引用,即01'0''1'truefalse ,這將始終返回引述的值,即'0''1'或甚至'' (為false ,這是等於0 )。

您的代碼的問題是,傳遞給Model::query()的第二個參數的值最終將傳遞給PDOStatement::execute()... / DboSource.php#L458 ),它將所有值視為字符串並相應地對其進行轉義,因此最終在您的查詢中, '1'將以'\\'1\\''結尾,因此出現了問題。

TL; DR

這似乎是預期的行為,但文獻記錄很少。 因此,當使用Model::query()的第二個參數時,如有必要,對值進行清理(即,轉換為整數,布爾值,字符串等),但不要對其進行轉義,僅當您在實際查詢中手動插入它們時才對它們進行轉義字符串( 但是應盡可能避免使用 )!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM