2014-02-11 1 views
0

Я использую Zend Framework и Oracle, и я пытаюсь получить одно значение из базы данных, как это:Zend_Db_Adapter fetchOne возвращает OCI-Леб объект вместо строки

$userId = (int) $this->_getParam('userId'); 

// CREATE TABLE MEMBERS (
// "MEMEBER_ID" NUMBER, 
// "FIRSTNAME" VARCHAR2(20 CHAR), 
// "LASTNAME" VARCHAR2(20 CHAR), 
// "EMAIL" VARCHAR2(40 CHAR), 
// "ABOUT" CLOB 
//) 

$sql = 'SELECT about FROM members WHERE id = :userId'; 

$binds = array (
    'userId' => $userId 
); 

$about = Zend_Registry::get('db')->fetchOne($sql, $binds); 

Согласно manual, fetchOne() должен возвращать строку, но когда я свалку возвращаемого значения, это выглядит следующим образом:

object(OCI-Lob)#1161 (1) { 
    ["descriptor"] => resource(209) of type (oci8 descriptor) 
} 

Как вы можете видеть, объект возвращаются, который является gainst the manual - «» возвращает только одно скалярное значение, не массив или объект. "

Как я могу преобразовать это в строку?

ответ

0

Проблема в CLOB тип данных, используемый в колонке about. Ответьте на это в notes for Oracle adapter, особенно:

По умолчанию поля LOB возвращаются как объекты OCI-Lob. Вы можете получить их как строку для всех запросов, используя параметры драйвера lob_as_string или для конкретного запроса, используя setLobAsString (boolean) для адаптера или оператора.

Таким образом, решение действительно просто, просто позвоните setLobAsString(true) перед тем, как это fetchOne():

$about = Zend_Registry::get('db')->setLobAsString(true)->fetchOne($sql, $binds); 

echo $about; // string 
0

Вы можете преодолеть эту проблему, добавив 1 строку в вашем application.ini

добавьте

resources.db.params.driver_options.lob_as_string=true 

это преобразует lob в строку автоматически. вам не нужно ничего писать в Zend.

Смежные вопросы