Php adodb CacheExecute com_exception аргументы неправильного типа

Я пытаюсь заставить кэширование ADODB работать. У меня есть php-скрипт, в котором я определяю соединение с БД.

global $conn;
$conn = new COM ("ADODB.Connection");
$connStr = "PROVIDER-SQLOLEDB;SERVER=;UID=;PWD=;DATABASE=);
$conn->open($connStr);

Я убрал ненужные детали из картины.

Затем в каком-то другом скрипте я импортирую connection.php, а затем пытаюсь сделать обычный запрос.

$query = "SELECT * from table where some_id = 21540 and other_id = BOGUS_INFO"
$rs = $GLOBALS['conn']->CacheExecute(60,$query);

Это возвращает неперехваченное исключение 'com_exception'. Аргументы ADODB.Connection имеют неправильный тип, выходят за пределы допустимого диапазона или конфликтуют с другим.

Я сбит с толку, потому что следующая строка кода работает безупречно.

$rs = $GLOBALS['conn']->execute($query); //OK!

Любые идеи? Я также пробовал CacheGetOne, но получаю ту же ошибку. Может ли это быть из-за того, как я определил эту вещь ниже? (это буквально так в моем коде)

$GLOBALS['ADODB_CACHE_DIR']=$_SERVER['DOCUMENT_ROOT'].'/../cache/adodb';

person Harabagiu Andrei    schedule 27.10.2014    source источник


Ответы (1)


Что ж, после долгих хлопот я нашел ответ, выбрав другой способ ведения дел. Я скачал последнюю сборку ADODB. Вставил его в свой проект и соответственно изменил файлы:

Connection.php изменился на:

require('PATH/adodb.inc.php');
require('PATH/adodb-csvlib.inc.php');//read somewhere that i need this for the caching executes
$GLOBALS['ADODB_CACHE_DIR'] = $_SERVER['DOCUMENT_ROOT'].'/cache/adodb';
global $ADODB_CACHE_DIR; //don't know which one adodb usese really to identify cache directory so for safety - both
$ADODB_CACHE_DIR = $_SERVER['DOCUMENT_ROOT'].'/cache/adodb';
$conn = NewADOConnection('mssqlnative');//i tried first with mssql simple but script terminated execution on execute() attempt.. no error.. no nothing.. no output .. strange
$conn->Connect($myServer, $myUser, $myPass, $myDb);

После этого мне пришлось немного повозиться с кодом, потому что,

$rs = $conn->CacheExecute(time,query) 

возвращает Adodbrecordset_array_mssqlnative Object, а не массив, и в моем коде я использовал для отображения и управления значениями как

while (!$rs->EOF) {
$rs['row']->value;
$rs->MoveNext();
}

и теперь они должны быть

$rs->fields['row'];

Еще одна сложная вещь заключалась в том, чтобы связать массив полей с именами столбцов в моем запросе, но после непродолжительного поиска я обнаружил

$GLOBALS['conn']->SetFetchMode(ADODB_FETCH_ASSOC);

и вуаля! Все работает, даже кеширование. Время выполнения скрипта с этой голой оптимизацией занимало от 1 секунды до 0,1, а иногда даже 0,005.

person Harabagiu Andrei    schedule 27.10.2014