извлечение целого числа из БД с использованием Zend Framework возвращает значение в виде строки - PullRequest
11 голосов
/ 06 апреля 2009

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

Ответы [ 4 ]

9 голосов
/ 06 апреля 2009

Я реализовал большую часть кода Zend_Db в Zend Framework.

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

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

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

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

1 голос
/ 06 апреля 2009

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

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

0 голосов
/ 23 апреля 2013

Для примера использования пользовательского 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, если вы будете использовать его строго для хранения логических значений.

0 голосов
/ 06 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...