1

我正在为我正在做的项目使用 Zend Framework 1.7 和 MySQL 5.0 数据库。系统的一部分是一个较长的表单,它要求用户提供各种日期(以 dd/mm/yyyy 格式)以及一些整数字段。

在我的 MySQL 表中,所有这些字段的默认值为null。当我使用模型中的函数(扩展 Zend_Db_Table)来保存表单数据时,任何空白整数字段都设置为0,并且任何空白日期字段都设置为0000-00-00 - 在这两种情况下,它们都应该是

我相信这是因为 Zend_Db_Table->insert() 引用了所有值,包括空白值。有什么办法可以改变这种行为?我目前必须遍历字段组,并酌情将它们设置为 null。

干杯,
马特

4

2 回答 2

1

尝试:

$data['shouldBeEmtpy'] = new Zend_Db_Expr('NULL');
于 2009-03-19T17:00:18.347 回答
1

vartec - 感谢您的帮助。你的想法给了我一个很好的起点。我进一步开发了它,扩展了 Zend_Db_Table,添加了一个从 MySQL 中吸取列元数据的函数,并使用它来设置默认值。我已经在下面发布了它的草稿。我还没有尝试简化它,并且只涵盖了我立即需要的字段类型。希望它可以帮助其他有同样问题的人。

public function reformatData($array) {
    if (!is_array($array)) {
        return false;
    }

    $cols = $this->info(Zend_Db_Table_Abstract::METADATA);

    if (is_array($cols)) {
        foreach ($cols as $col) {
            if (array_key_exists($col['COLUMN_NAME'], $array)) {
                switch ($col['DATA_TYPE']) {
                    case 'int': case 'tinyint':
                        if ($array[$col['COLUMN_NAME']] == '') {
                            $newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
                        }
                        else {
                            $newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
                        }
                        break;

                    case 'date':
                        if ($array[$col['COLUMN_NAME']] == '') {
                            $newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
                        }
                        elseif(!Zend_Date::isDate($array[$col['COLUMN_NAME']], 'YYYY-MM-dd')) {
                            $date = new Zend_Date($array[$col['COLUMN_NAME']], null, 'en_GB');
                            $newArray[$col['COLUMN_NAME']] = $date->toString('YYYY-MM-dd'); 
                        }
                        else {
                            $newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
                        }
                        break;

                    case 'datetime':
                        if ($array[$col['COLUMN_NAME']] == '') {
                            $newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
                        }
                        elseif(!Zend_Date::isDate($array[$col['COLUMN_NAME']], 'YYYY-MM-dd HH:MM')) {
                            $date = new Zend_Date($array[$col['COLUMN_NAME']], null, 'en_GB');
                            $newArray[$col['COLUMN_NAME']] = $date->toString('YYYY-MM-dd HH:MM'); 
                        }
                        else {
                            $newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
                        }
                        break;

                    default:
                        $newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
                        break;
                }           
            }
        }
        return $newArray;
    }
    else {
        return false;
    }
}
于 2009-03-20T11:21:27.703 回答