【问题标题】:TYPO3 Querybuilder unsigned integer in createNamedParametercreateNamedParameter 中的 TYPO3 Querybuilder 无符号整数
【发布时间】:2020-11-19 08:23:36
【问题描述】:

TYPO3 QueryBuilder 方法 createNamedParameter 只支持有符号整数,但不支持无符号整数。无符号整数甚至没有 PDO 常量。而且 TYPO3 似乎没有像数组 Connection::PARAM_INT_ARRAY 这样的其他常量。

static public function checkDoublePostExist ($table, $doublePostField, $key)
{
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
    $queryBuilder->setRestrictions(GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer::class));

    $result =
        $queryBuilder
            ->count('*')
            ->from($table)
            ->where(
                $queryBuilder->expr()->eq($doublePostField, $queryBuilder->createNamedParameter($key, \PDO::PARAM_INT))
                )
            ->execute()
            ->fetchColumn(0);

    return $result;
}

SQL字段定义为:

doublePostCheck int(11) unsigned DEFAULT '0' NOT NULL

生成的SQL会是这样的:

SELECT COUNT(*) FROM `tt_board` WHERE (`doublePostCheck` = -1018532669) AND (`tt_board`.`deleted` = 0)

这很奇怪,因为该字段不允许有负值。恐怕这个查询不会做正确的事情。

字符串格式可以用于无符号整数吗?

                ->where(
                $queryBuilder->expr()->eq($doublePostField, $queryBuilder->createNamedParameter($key, \PDO::PARAM_STR))
                )

生成的 SQL 是正确的:

SELECT COUNT(*) FROM `tt_board` WHERE (`doublePostCheck` = '3276434627') AND (`tt_board`.`deleted` = 0)

哪种解决方案最适合无符号整数?

【问题讨论】:

    标签: typo3 query-builder


    【解决方案1】:

    问题是您的整数值更高,因为字段 int(11) 可以使用。

    无符号字段的最大值为2147483647,请参阅https://dev.mysql.com/doc/refman/8.0/en/integer-types.html。您的价值 (3276434627) 远高于此值。

    由于PHP的整数最大值是相同的,所以大于最大值时开始从负数区域开始。

    解决方案是将数据库字段更改为使用bigint

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 2010-09-19
      • 2013-10-02
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2011-05-25
      相关资源
      最近更新 更多