繁体   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