Когда я запускаю sql-запрос с использованием оберток ZF, все числовые значения возвращаются как строки. Что мне нужно изменить, чтобы значения возвращались в том же типе данных, что и в БД?
Извлечение целого из базы данных с помощью Zend Framework возвращает значение в виде строки
Ответ 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
, если вы используете его строго для хранения булевых значений.