2011-12-06 5 views
0

私は以前の開発者からこのプロジェクトを継承しており、私はできるだけわかりやすいものにしようとします。正しい結果を返すストアドプロシージャ。PHPページではありません。可能なパラメータの切り捨て

ページでは、ユーザーが検索文字列を入力し、そのページを送信します。ページはストアドプロシージャをヒットし、クエリは結果を返します。問題は、検索文字列が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 '%'[email protected]_string+'%' OR org.org_name_2 LIKE '%'[email protected]_string+'%' OR org.org_search LIKE '%'[email protected]_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

手動このストアドプロシージャを実行します、私は肯定的な結果を返します。以前の開発者が自分のデータベースハンドラを書いた:

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; 
} 

あなたが右のクエリを実行した後に気付いた場合、私は$iResultvar_dumpをしています:

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

機能dbStoredProcは次のようになります。応答は次のとおりです。私は私が15未満の文字列を使用している場合は、正しい結果が返される15よりも長い文字列を使用する場合

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

この結果は、起こっています。

何か迷いがありますか?

+0

長さが15以上、長さが15以上の異なる文字列を試しましたか?たぶんそれは文字エンコーディングや何かと同様に関係がありますか? –

+0

データベースハンドラは、検索文字列から空白を削除します。 –

+0

また、 '$ _REQUEST'を使用しないでください。必要に応じて' $ _POST'または '$ _GET'を指定してください。 – Jakub

答えて

0

このコード:

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

は、検索文字列からスペースを削除します。だからではなく、

'commonwealth water' 

を探しているのは、少なくとも(それはデ間隔の検索文字列に一致するように、列org.org_searchは、削除すべてのスペースを持っていますが、それは15文字に制限されているので、

'commonwealthwater' 

を探しますこの例では:

'COMMONWEALTHWAT' 

最大15(非スペース)文字の検索文字列にしか一致しません。

org_searchはおそらく理由のために作成された可能性があり、他のコードでも使用される可能性があるため、15文字の制限なしですべての(破損した)org_searchの値を再作成し、所定の位置に。

+0

私はereg_replaceを削除しましたが、動作しているようですが、ereg_replaceがあれば、長さが15以上の文字列は結果を返しません。 – etm124

+0

15文字以上の検索文字列でスペースを使わずに元のソリューションを試しましたか? –

+0

私は上記の '' commonwealthwater''と何の結果も試していません。しかし、私が「コモンウェルスワ」を試みると、私は有効な結果を得ます。 – etm124

関連する問題