Хранимая процедура, возвращающая правильные результаты, страница PHP не. Возможное усечение параметров - PullRequest
0 голосов
/ 06 декабря 2011

Я унаследовал этот проект от предыдущего разработчика и постараюсь быть максимально описательным.

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

Сначала хранимая процедура и параметры:

exec crm_selectSearch2 1, 'commonwealth water', 'PCBI'

Далее часть запроса из хранимой процедуры.:

IF @search_type = 1 BEGIN -- Organization Name
SELECT  org.org_name_1 AS name,
        org.org_id AS id,
        addr.address_city AS city,
        org.phone_number AS phone,
        org.email AS email,
        CASE WHEN ((org.org_status_flag = 'R' OR org.org_status_flag = 'N' OR org.org_status_flag = 'F') AND org.dues_category = 'MBR') THEN 1 ELSE 0 END 'member',
        CASE WHEN (org.org_status_flag = 'P' AND org.dues_category = 'FREE') THEN 1 ELSE 0 END AS 'associate',
        CASE WHEN (org.delete_reason = 'OUT' AND org.org_delete_flag = 'Y' AND org.org_status_flag = 'C') THEN 1 ELSE 0 END 'out',
        org.affiliate_code
FROM        organiz AS org
LEFT JOIN   address AS addr ON addr.address_id = org.address_id
WHERE   (org.org_name_1 LIKE '%'+@search_string+'%' OR org.org_name_2 LIKE '%'+@search_string+'%' OR org.org_search LIKE '%'+@search_string+'%')
AND     (org.affiliate_code = @affiliate_code OR (@affiliate_code = 'PCBI' AND ((org.org_status_flag = 'R' OR org.org_status_flag = 'N' OR org.org_status_flag = 'F') AND org.dues_category = 'MBR')))
ORDER BY    out ASC, org_name_1 ASC

END

При выполнении этой хранимой процедуры вручную я возвращаю положительный результат.Предыдущий разработчик написал свой собственный обработчик базы данных:

$rpResult = dbStoredProc('crm_selectSearch2',$_REQUEST['search_type'],ereg_replace(' ','',$_REQUEST['search_string']),$GLOBALS['aPermissions']['affiliate_code']

Функция dbStoredProc выглядит следующим образом:

if($iMSSQL = dbConnect()) {
    if($iResult = dbExec("select syscolumns.name as column_name, syscolumns.length as length, syscolumns.colorder, syscolumns.type from sysobjects inner join syscolumns on sysobjects.[id] = syscolumns.[id] where sysobjects.name = '".$sProcName."' order by syscolumns.colorder asc")) {
        $aArgs = func_get_args();
        $sSQL = 'EXECUTE '.$sProcName.' ';
        while(@$aRow = mssql_fetch_array($iResult)) {
            if(dbValidate($aRow['type'],$aRow['length'],$aArgs[$aRow['colorder']])) {
                $sSQL = $sSQL.$aRow['column_name'].'='.dbValue($aArgs[$aRow['colorder']],$aRow['type']).',';
                dbDebug('dbStoredProc: Attached "'.$aArgs[$aRow['colorder']].'" to "'.$aRow['column_name'].'";',3);
            } else {
                dbDebug('dbStoredProc: Failed to Attach "'.$aArgs[$aRow['colorder']].'" to "'.$aRow['column_name'].':'.$aRow['type'].'";',2);
            }
        }
        $sSQL[strlen($sSQL)-1] = ';';
        dbDebug('dbStoredProc: "'.$sSQL.'";',3);
        if(@$iResult = mssql_query($sSQL)) {
            dbDebug('dbStoredProc: Executed "'.$sProcName.'"',1);
            var_dump($iResult);
            return $iResult;
        } else {
            dbDebug('dbStoredProc: Failed to Execute "'.$sProcName.'";',1);
            dbDebug('dbStoredProc: '.mssql_get_last_message().';',3);
            return FALSE;
        }
    } else {
        dbDebug('dbStoredProc: Failed to Select Procedure from SysObjects;',1);
        return FALSE;
    }
} else {
    dbDebug('dbStoredProc: Failed to Connect to Database;',1);
    return FALSE;
}

Если вы заметили сразу после выполнения запроса, я делаю var_dump на $iResult.Ответ:

resource(5) of type (mssql result) bool(false)

Этот результат происходит, когда я использую строки длиннее 15. Если я использую строку меньше 15, возвращаются правильные результаты.

Я что-то упустил?

1 Ответ

0 голосов
/ 06 декабря 2011

Этот код:

ereg_replace(' ','',$_REQUEST['search_string'])

удаляет пробелы из строки поиска.Поэтому вместо поиска

'commonwealth water'

он ищет

'commonwealthwater'

В столбце org.org_search удалены все пробелы, поэтому он соответствует пустым строкам поиска, но поскольку он ограничендо 15 символов (по крайней мере, в примере):

'COMMONWEALTHWAT'

может соответствовать только строки поиска длиной до 15 (не пробелов) символов.

Поскольку столбец org_searchВозможно, он был создан по какой-то причине и, возможно, используется и в другом коде. Решение состоит в том, чтобы воссоздать все (поврежденные?) org_search значения без ограничения в 15 символов и оставить пробел на месте.

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