【问题标题】:Float, Decimal, Int mysql fields returned as string on Cakephp 2.2在 Cakephp 2.2 上以字符串形式返回的 Float、Decimal、Int mysql 字段
【发布时间】:2013-01-15 17:37:11
【问题描述】:

我有一个使用 CakePHP 2.2 和 MySQL 的应用程序。 我注意到返回值的类型转换是许多类型的字符串,例如 Float、Decimal、Int、Varchar、Text 等:

浮点数或小数:

var_dump($this->field('field_name'));
string(4) "1.00" 

诠释

var_dump($this->field('field_name'));
string(1) "1" 

对于布尔字段仅使用 TINYINT(1) 不会出现此问题:

Tinyint(1)

var_dump($this->field('field_name'));
bool(true) 

通常对于货币字段,我将字段类型设置为 FLOAT 或 DECIMAL(11,2)... 也许我在 CakePHP 中使用这种类型是错误的? 这种行为非常乏味,尤其是对于十进制字段,因为当值为 0 时返回字符串“0.00”,这是真的。 所以我必须永远记住强制这样的类型:

if((float)$this->field('price')){
....
}

为什么 CakePHP 不返回正确类型转换的值?我该如何解决?谢谢!

【问题讨论】:

  • 我认为这可能是 PHP 问题而不是 CakePHP 问题。这还取决于您如何提取数据。通常,如果您通过 GET/POST 或 Cookie 提取数据,PHP 会将字段分配为字符串,而不管它是什么。您将不得不强制类型转换。我不确定如何解决这个问题,我在编程中也遇到过这个问题。我总是决定强迫它
  • 我的问题你明白我正在从数据库中读取数据,并且 CakePHP 仅对 tinyint(1) 字段应用正确的类型转换!
  • 你是对的,这可能是 CakePHP 的一个缺点(一般来说,PHP 也是因为缺乏强类型)。转换变量现在可能是一种解决方法,或者您可以向 CakePHP 开发人员提出功能请求

标签: mysql model casting cakephp-2.1


【解决方案1】:

这不是 CakePHP 的问题。这是由于 PHP 脚本语言中当前使用的松散类型。 TinyInt 和 Boolean 工作,因为它被转换为 bool 类型。

所有人都使用的解决方法是严格将您希望浮动的变量转换为浮动,如您的示例中所示。要检查字符串是否为数字,您可以使用 is_numeric() 函数:

if (is_numeric($testedFloatString)) {
    //If $testedFloatString is a string representing a number cast it to float
    $testedFloatString = (float) $testedFloatString;
}

这是"Type Juggling"的概念。对于浮点数,您需要记住的是:

$varName = (float) $varName;
$varName = (double) $varName;
$varName = (real) $varName;

将全部转换为PHP's Float。随着期待已久的 PHP 6 严格类型的出现,这个问题将不复存在,但我们将不得不再等一会儿。至于现在 - 唯一的方法是自己处理这些变量。 要在 CakePHP 中为您需要的模型自动管理它,请使用 Model::afterFind() callback。此回调用于“修改已从查找操作返回的结果或执行任何其他查找后逻辑。还要注意第二个参数,例如从关联模型调用模型的 find() 时,结果数组的结构会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2023-01-21
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2015-04-02
    相关资源
    最近更新 更多