sql — $ _GET со сравнением операторов в переполнении стека

Я использую PHP и SQL Server.
Я пытаюсь использовать Сравнение операторов, но не могу получить правильный ответ.
Когда я проверяю URL, нет ответа.
Я проверяю URL как этот:

http://example.com/artafs/get_rule_rate_insco_cvg_bundle.php?INSCO_BRANCH_CODE=AAB066 && REGION_CODE=Region1 && MAIN_CVG_TYPE_CODE=ALL RISK && CVG_TYPE_CODE=TPL && INS_ASSET_CATEGORY_CODE=05 && ASSET_USAGE=P && MR_ASSET_CONDITION=NEW && ASSET_PRICE_MORE_THAN<=0 && ASSET_PRICE_LESS_THAN_OR_EQUAL>=125000000

Это детали проблемы:

if (
isset($_GET['INSCO_BRANCH_CODE']) &&
isset($_GET['REGION_CODE']) &&
isset($_GET['MAIN_CVG_TYPE_CODE']) &&
isset($_GET['CVG_TYPE_CODE']) &&
isset($_GET['INS_ASSET_CATEGORY_CODE']) &&
isset($_GET['ASSET_USAGE']) &&
isset($_GET['MR_ASSET_CONDITION']) &&
isset($_GET['ASSET_PRICE_MORE_THAN'])
) {
$bcode = $_GET['INSCO_BRANCH_CODE'];
$rcode = $_GET['REGION_CODE'];
$cmain = $_GET['MAIN_CVG_TYPE_CODE'];
$cvg = $_GET['CVG_TYPE_CODE'];
$accode = $_GET['INS_ASSET_CATEGORY_CODE'];
$ausage = $_GET['ASSET_USAGE'];
$acon = $_GET['MR_ASSET_CONDITION'];
$apmt = $_GET['ASSET_PRICE_MORE_THAN'];
$apltoe = $_GET['ASSET_PRICE_LESS_THAN_OR_EQUAL'];

$bcode = stripslashes($bcode);
$bcode = $db->mssql_real_escape_string($bcode);

$rcode = stripslashes($rcode);
$rcode = $db->mssql_real_escape_string($rcode);

$cmain = stripslashes($cmain);
$cmain = $db->mssql_real_escape_string($cmain);

$cvg = stripslashes($cvg);
$cvg = $db->mssql_real_escape_string($cvg);

$accode = stripslashes($accode);
$accode = $db->mssql_real_escape_string($accode);

$ausage = stripslashes($ausage);
$ausage = $db->mssql_real_escape_string($ausage);

$acon = stripslashes($acon);
$acon = $db->mssql_real_escape_string($acon);

$apmt = stripslashes($apmt);
$apmt = $db->mssql_real_escape_string($apmt);

$apltoe = stripslashes($apltoe);
$apltoe = $db->mssql_real_escape_string($apltoe);

$result = mssql_query("SELECT TOP 1
a.ASSET_PRICE_MORE_THAN,
a.ASSET_PRICE_LESS_THAN_OR_EQUAL,
a.INSURANCE_RATE,
b.TPL_AMOUNT,
b.PERCENTAGE,
b.AMOUNT
FROM
RULE_RATE_INSCO a
INNER JOIN RULE_RATE_INSCO_CVG b ON
a.INSCO_BRANCH_CODE=b.INSCO_BRANCH_CODE AND
a.REGION_CODE=b.REGION_CODE AND
a.INS_ASSET_CATEGORY_CODE=b.INS_ASSET_CATEGORY_CODE AND
a.MAIN_CVG_TYPE_CODE=b.MAIN_CVG_TYPE_CODE
WHERE
a.INSCO_BRANCH_CODE='$bcode' AND
a.REGION_CODE='$rcode' AND
a.MAIN_CVG_TYPE_CODE='$cmain' AND
b.CVG_TYPE_CODE='$cvg' AND
a.INS_ASSET_CATEGORY_CODE='$accode' AND
a.ASSET_USAGE='$ausage' AND
a.MR_ASSET_CONDITION='$acon' AND
a.ASSET_PRICE_MORE_THAN<='$apmt' AND
a.ASSET_PRICE_LESS_THAN_OR_EQUAL>='$apltoe'
");
}

Тест запроса от SQL Server исправлен, и нет проблем:

SELECT TOP 1
a.ASSET_PRICE_MORE_THAN,
a.ASSET_PRICE_LESS_THAN_OR_EQUAL,
a.INSURANCE_RATE,
b.TPL_AMOUNT,
b.PERCENTAGE,
b.AMOUNT
FROM
RULE_RATE_INSCO a
INNER JOIN RULE_RATE_INSCO_CVG b ON
a.INSCO_BRANCH_CODE=b.INSCO_BRANCH_CODE AND
a.REGION_CODE=b.REGION_CODE AND
a.INS_ASSET_CATEGORY_CODE=b.INS_ASSET_CATEGORY_CODE AND
a.MAIN_CVG_TYPE_CODE=b.MAIN_CVG_TYPE_CODE
WHERE
a.INSCO_BRANCH_CODE='AAB066' AND
a.REGION_CODE='Region1' AND
a.MAIN_CVG_TYPE_CODE='ALL RISK' AND
b.CVG_TYPE_CODE='TPL' AND
a.INS_ASSET_CATEGORY_CODE='05' AND
a.ASSET_USAGE='P' AND
a.MR_ASSET_CONDITION='NEW' AND
a.ASSET_PRICE_MORE_THAN<='0' AND
a.ASSET_PRICE_LESS_THAN_OR_EQUAL>='125000000'

Мое объяснение:
После того, как я проверил использование URL и заполнил параметр в браузере, правильного ответа нет.
Но когда я пытаюсь выполнить запрос из SQL Server, проблем не возникает.
Проблема с оператором сравнения a.ASSET_PRICE_MORE_THAN<='0'
а также a.ASSET_PRICE_LESS_THAN_OR_EQUAL>='125000000', Когда я использую только a.ASSET_PRICE_MORE_THAN=0 нет проблем.

Последнее обновление, но все еще безуспешно:

$keys = array(
'INSCO_BRANCH_CODE',
'REGION_CODE',
'MAIN_CVG_TYPE_CODE',
'CVG_TYPE_CODE',
'INS_ASSET_CATEGORY_CODE',
'ASSET_USAGE',
'MR_ASSET_CONDITION',
'ASSET_PRICE_MORE_THAN',
'ASSET_PRICE_LESS_THAN_OR_EQUAL'
);
function get_isset($key) {
return isset($_GET[$key]);
}
function get_escaped($key) {
global $db;
return $db->mssql_real_escape_string(stripslashes($_GET[$key]));
}

if (!in_array(false, array_map('get_isset', $keys))) {
list (
$bcode,
$rcode,
$cmain,
$cvg,
$accode,
$ausage,
$acon,
$apmt,
$apltoe
) = array_map('get_escaped', $keys);

$result = mssql_query("select top 1 a.ASSET_PRICE_MORE_THAN,a.ASSET_PRICE_LESS_THAN_OR_EQUAL,a.INSURANCE_RATE,
b.TPL_AMOUNT,b.PERCENTAGE,b.AMOUNT from RULE_RATE_INSCO a inner join RULE_RATE_INSCO_CVG b on a.INSCO_BRANCH_CODE=b.INSCO_BRANCH_CODE and
a.REGION_CODE=b.REGION_CODE and a.INS_ASSET_CATEGORY_CODE=b.INS_ASSET_CATEGORY_CODE and a.MAIN_CVG_TYPE_CODE=b.MAIN_CVG_TYPE_CODE
where a.INSCO_BRANCH_CODE='$bcode'
and a.REGION_CODE='$rcode'
and a.MAIN_CVG_TYPE_CODE='$cmain'
and b.CVG_TYPE_CODE='$cvg'
and a.INS_ASSET_CATEGORY_CODE='$accode'
and a.ASSET_USAGE='$ausage'
and a.MR_ASSET_CONDITION='$acon'
and a.ASSET_PRICE_MORE_THAN<='$apmt'
and a.ASSET_PRICE_LESS_THAN_OR_EQUAL>='$apltoe'");

}

-1

Решение

Попробуйте ограничить запрос целым числом вместо строки (‘125000000’).

0

Другие решения

URL-это беспорядок. Только один амперсанд (&) используется для разделения параметров, только знак равенства (=) используется между именем параметра и его значением, а значения должны кодироваться в%:

http://example.com/artafs/get_rule_rate_insco_cvg_bundle.php?INSCO_BRANCH_CODE=AAB066&REGION_CODE=Region1&MAIN_CVG_TYPE_CODE=ALL%20RISK&CVG_TYPE_CODE=TPL&INS_ASSET_CATEGORY_CODE=05&ASSET_USAGE=P&MR_ASSET_CONDITION=NEW&ASSET_PRICE_MORE_THAN=0&ASSET_PRICE_LESS_THAN_OR_EQUAL=125000000

Вы должны отладить это, отображая $_GET содержание через var_dump($_GET);,

Также вы забыли проверить, если $_GET['ASSET_PRICE_LESS_THAN_OR_EQUAL'] установлено. Вы можете избежать таких ошибок, если правильно отформатируете свой код и избежите повторения. Используйте функции для повторяющихся частей (не проверено):

$keys = array(
'INSCO_BRANCH_CODE',
'REGION_CODE',
'MAIN_CVG_TYPE_CODE',
'CVG_TYPE_CODE',
'INS_ASSET_CATEGORY_CODE',
'ASSET_USAGE',
'MR_ASSET_CONDITION',
'ASSET_PRICE_MORE_THAN',
'ASSET_PRICE_LESS_THAN_OR_EQUAL'
);
function get_isset($key) {
return isset($_GET[$key]);
}
function get_escaped($key) {
global $db;
return $db->mssql_real_escape_string(stripslashes($_GET[$key]));
}

if (!in_array(false, array_map('get_isset', $keys))) {
list (
$bcode,
$rcode,
$cmain,
$cvg,
$accode,
$ausage,
$acon,
$apmt,
$apltoe
) = array_map('get_escaped', $keys);

$result = mssql_query("SELECT TOP 1
a.ASSET_PRICE_MORE_THAN,
a.ASSET_PRICE_LESS_THAN_OR_EQUAL,
a.INSURANCE_RATE,
b.TPL_AMOUNT,
b.PERCENTAGE,
b.AMOUNT
FROM
RULE_RATE_INSCO a
INNER JOIN RULE_RATE_INSCO_CVG b ON
a.INSCO_BRANCH_CODE=b.INSCO_BRANCH_CODE AND
a.REGION_CODE=b.REGION_CODE AND
a.INS_ASSET_CATEGORY_CODE=b.INS_ASSET_CATEGORY_CODE AND
a.MAIN_CVG_TYPE_CODE=b.MAIN_CVG_TYPE_CODE
WHERE
a.INSCO_BRANCH_CODE='$bcode' AND
a.REGION_CODE='$rcode' AND
a.MAIN_CVG_TYPE_CODE='$cmain' AND
b.CVG_TYPE_CODE='$cvg' AND
a.INS_ASSET_CATEGORY_CODE='$accode' AND
a.ASSET_USAGE='$ausage' AND
a.MR_ASSET_CONDITION='$acon' AND
a.ASSET_PRICE_MORE_THAN<='$apmt' AND
a.ASSET_PRICE_LESS_THAN_OR_EQUAL>='$apltoe'
");
}

Также параметр ASSET_PRICE_LESS_THAN_OR_EQUAL назван нелогично. Вы должны изменить имя или сравнить с его значением, используя > вместо >=,

0