Извлечение целого из базы данных с помощью Zend Framework возвращает значение в виде строки

Когда я запускаю sql-запрос с использованием оберток ZF, все числовые значения возвращаются как строки. Что мне нужно изменить, чтобы значения возвращались в том же типе данных, что и в БД?

Ответ 1

Я реализовал много кода Zend_Db в Zend Framework.

Как утверждали другие, причина, по которой Zend_Db возвращает строки вместо собственных целых чисел PHP или float, заключается в том, что расширения базы данных PHP возвращают строки. И причина этого в том, что не может быть родного типа PHP для представления определенного типа базы данных.

Например, MySQL BIGINT - это 64-разрядное целое число со знаком. По умолчанию тип PHP int ограничен 32-битными значениями, поэтому, если вы извлекаете данные из базы данных и неявно конвертируете их в int, некоторые значения могут быть усечены. Существует несколько других подобных случаев: float и даты и т.д.

Использование строкового представления для всех типов данных - лучший способ оставаться простым и последовательным, быть в безопасности, избегая потери данных, и избегать написания большого количества специфического кода для конкретного поставщика, чтобы выполнять сопоставление типов данных. Этот дополнительный код также подвергнется штрафу за производительность.

Итак, если у вас есть конкретные случаи, когда вам нужны результаты базы данных для сопоставления с собственными типами данных PHP, вы должны реализовать ее самостоятельно в своем коде приложения (например, в пользовательском классе Zend_Db_Table_Row).

Ответ 2

Базы данных обычно возвращают наборы результатов как текст. Если ваш адаптер db не преобразует вещи для вас (и для звуков, подобных вашим, нет), все значения возвращаются как строки - даты, перечисления и т.д., А также целые числа.

Если вы имеете дело с небольшим количеством таблиц с несколькими целыми полями, просто преобразуйте их вручную. Если вы имеете дело с несколько более сложной ситуацией, вы можете выполнять итерацию по столбцам с помощью определений баз данных (см. sqlite_fetch_column_types() и т.д.). Если ваша ситуация более сложна, чем кажется разумной для этих решений, подумайте о переходе на более функциональную структуру.

Ответ 3

Похоже, что это было запрошено в прошлом, но еще не реализовано. # ZF-300 прокомментирован 9 января 2009 года.

Может быть, вы могли бы поделиться, почему вы хотите выполнить приведение типов, и мы могли бы помочь вам другим способом? PHP довольно мягкий, когда дело доходит до переменных типов данных...

Ответ 4

Для примера использования пользовательского Zend_Db_Table_Row для получения правильных типов данных, как предложил Билл Карвин, посмотрите здесь класс: http://www.zfsnippets.com/snippets/view/id/70

Он может быть реализован в вашей модели как:

class YourTableName extends Zend_Db_Table_Abstract
{
    protected $_name = 'your_table_name';
    protected $_rowClass = 'Model_Row_Abstract';
}

Возможно, вы захотите изменить тип данных Model_Row_Abstract для tinyint на bool, если вы используете его строго для хранения булевых значений.