Opgeslagen procedure die correcte resultaten retourneert, PHP-pagina niet. Mogelijke parameter truncating

Ik heb dit project overgenomen van een vorige ontwikkelaar en ik zal proberen zo beschrijvEINDE mogelijk te zijn.

Op de pagina voert een gebruiker een zoekreeks in en verzEINDEt de pagina. De pagina raakt een opgeslagen procedure en de query retourneert resultaten. Het probleem is wanneer de zoekreeks uit meer dan 15 tekens bestaat. Als dit 15 of minder is, worden de resultaten prima weergegeven. Wanneer de opgeslagen procedure handmatig wordt uitgevoerd, worden de correcte resultaten geretourneerd. Wanneer ik probeer uit te voeren vanuit de browser, krijg ik een fout antwoord.

Eerst de opgeslagen procedure en de parameters:

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

VolgEINDE deel van de vraag uit de opgeslagen procedure:

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 EINDE 'member',
        CASE WHEN (org.org_status_flag = 'P' AND org.dues_category = 'FREE') THEN 1 ELSE 0 EINDE AS 'associate',
        CASE WHEN (org.delete_reason = 'OUT' AND org.org_delete_flag = 'Y' AND org.org_status_flag = 'C') THEN 1 ELSE 0 EINDE '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

EINDE

Bij het handmatig uitvoeren van deze opgeslagen procedure, retourneer ik een positief resultaat. De vorige ontwikkelaar heeft zijn eigen databasehandler geschreven:

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

De functie dbStoredProc ziet eruit als:

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

Als u het meteen na de uitvoering van de query opmerkt, voer ik een var_dump uit op $ iResult . Het antwoord is:

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

Dit resultaat gebeurt wanneer ik tekenreeksen langer dan 15 gebruik. Als ik een tekenreeks van minder dan 15 gebruik, worden de juiste resultaten geretourneerd.

Mis ik iets flagrants?

0
Nee, het werkt niet met 'wealth water' of 'wealthwater' .
toegevoegd de auteur etm124, de bron
Nagel - Ik heb verschillende lengtes geprobeerd.
toegevoegd de auteur etm124, de bron
GEBRUIK NOOIT $ _ AANVRAAG specificeer $ _ POST of $ _ GET indien nodig.
toegevoegd de auteur Jakub, de bron
Heb je geprobeerd met meerdere verschillende reeksen van lengte <= 15 en verschillende reeksen met lengte> 15? Misschien heeft het te maken met karaktercodering of iets dergelijks?
toegevoegd de auteur The Nail, de bron
Werkt het met zoekreeks 'welvaartswater' ?
toegevoegd de auteur The Nail, de bron
De databasehandler verwijdert spaties uit de zoekreeks.
toegevoegd de auteur The Nail, de bron

1 antwoord

Deze code:

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

verwijdert spaties uit uw zoekreeks. Dus in plaats van naar te zoeken

'commonwealth water'

het zoekt naar

'commonwealthwater'

In de kolom org.org_search zijn alle spaties verwijderd, zodat deze overeenkomt met verwijderde zoekreeksen, maar omdat deze beperkt is tot 15 tekens (althans in het voorbeeld):

'COMMONWEALTHWAT'

het kan alleen zoekstrings van maximaal 15 (niet-spatie) tekens lang weergeven.

Omdat de kolom org_search waarschijnlijk met een reden is gemaakt en mogelijk ook in andere code wordt gebruikt, is de oplossing om alle (gebroken?) org_search waarden opnieuw te maken zonder de Beperking van 15 tekens en laat de de-spacing op zijn plaats.

0
toegevoegd
String ingevoerd: "commonwealthwat" - Resultaat: REQUEST ['search_string']: commonwealthwat . String ingevoerd: "commonwealthwater" - Resultaat: REQUEST ['search_string']: commonwealthwater
toegevoegd de auteur etm124, de bron
Bedankt dat je me hiermee hebt geholpen, Nail. Aanvaard.
toegevoegd de auteur etm124, de bron
Het lijkt heel raar. Maar het zou een van de org_name, org_name_2 of org_search in mijn clausule moeten raken. Ik dacht dat dat erg achterdochtig was.
toegevoegd de auteur etm124, de bron
Het spijt me, dat klopt. Te bewerken ...
toegevoegd de auteur etm124, de bron
org_name_1 = 'Commonwealth Water Treatment', org_name_2 = NULL, org_search = 'COMMONWEALTHWAT'
toegevoegd de auteur etm124, de bron
org.org_search is een varchar (38)
toegevoegd de auteur etm124, de bron
Ik heb het bovenstaande 'commonwealthwater' geprobeerd en geen resultaat. Maar als ik 'commonwealthwa' probeer, krijg ik geldige resultaten.
toegevoegd de auteur etm124, de bron
Ik heb het ereg_replace verwijderd en het lijkt te werken, maar ik snap het niet waarom als ereg_replace op zijn plaats is, reeksen van meer dan 15 in lengte geen resultaten teruggeven.
toegevoegd de auteur etm124, de bron
Heeft u de originele oplossing geprobeerd met zoekreeksen van meer dan 15 tekens zonder spaties ?
toegevoegd de auteur The Nail, de bron
Ik snap het. Kun je de inhoud van $ _ REQUEST ['search_string'] controleren wanneer je een zoekreeks van> 15 tekens op de webpagina plaatst?
toegevoegd de auteur The Nail, de bron
Wat is de lengte van de kolom org.org_search in de database? Ik vermoed dat dit degene is die nog steeds overeenkomt als je de spaties verwijdert.
toegevoegd de auteur The Nail, de bron
Wat zijn de waarden van org.org_name_1 , org.org_name_2 en org.org_search voor het item dat overeenkomt met 'commonwealth water' ?
toegevoegd de auteur The Nail, de bron
Ik veronderstel org_name_1 = 'Commonwealth Water Treatment' en niet 'Common Water Treatment' ?
toegevoegd de auteur The Nail, de bron
Vindt u het een groot toeval dat org_search 1: 15 tekens lang is en 2: zonder spaties?
toegevoegd de auteur The Nail, de bron
Ik denk dat mijn antwoord nu compleet is.
toegevoegd de auteur The Nail, de bron
BTW: Ik wed dat de originele code (met de ereg_replace ) overeenkomt met 'commonwealth wat' , dat is 16 karakters lang.
toegevoegd de auteur The Nail, de bron