0

我的原始 SELECT 查询有效,但不适用于 PHP 代码中插入的变量。

这是我的实际选择查询:

SELECT * FROM `program_list`
WHERE
speciality LIKE '%IM%'
AND (stepone2digit <= 78 OR stepone2digit=0)
AND (stepone3digit <= 189 OR stepone3digit=0)
AND (steptwock2digit <= 78 OR steptwock2digit=0)
AND (steptwock3digit <= 189 OR steptwock3digit=0)
AND (steptwocs = 'PASS' OR steptwocs IS NULL)
AND (steponeattempt <= 1 OR steponeattempt=0)
AND (steptwockattempt <= 1 OR steptwockattempt=0)
AND (steptwocsattempt <= 2 OR steptwocsattempt=0)
AND ((USCEImportance = 'MAND' AND USCENoOfMonths<= '3') OR USCEImportance = 'PREF')
AND (yearsfrompassing >= 2 OR yearsfrompassing=0); 

这是我在 PHP 中传递它的方式:

    $sql = "SELECT * FROM `program_list`
    WHERE
    speciality LIKE '%%s%'
    AND (stepone2digit <= %d OR stepone2digit=0)
    AND (stepone3digit <= %d OR stepone3digit=0)
    AND (steptwock2digit <= %d OR steptwock2digit=0)
    AND (steptwock3digit <= %d OR steptwock3digit=0)
    AND (steptwocs = '%s' OR steptwocs IS NULL)
    AND (steponeattempt <= %d OR steponeattempt=0)
    AND (steptwockattempt <= %d OR steptwockattempt=0)
    AND (steptwocsattempt <= %d OR steptwocsattempt=0)
    AND ((USCEImportance = 'MAND' AND USCENoOfMonths<= '%s') OR USCEImportance = 'PREF')
    AND (yearsfrompassing >= %d OR yearsfrompassing=0)

当我运行原始查询时,它工作正常,但是当我插入变量并从 PHP 运行它时,没有返回任何结果。

我错过了什么?请帮忙。

4

2 回答 2

0

您没有在那里分配“%d”和“%s”(尝试使用 var_dump($sql) 调试您的 $sql)。您应该为此使用 sprintf。例如 :

$sql = sprintf("SELECT * FROM `program_list` WHERE speciality LIKE '%%s%'",$speciality);
于 2012-07-31T04:06:27.697 回答
0

我假设您正在使用sprintf实际值替换您的 %s 和 %d 。

问题出在这个代码片段上:

speciality LIKE '%%s%'

%%将替换为单个%,最后一个%将返回警告或通知,因为%'对 无效sprintf。您必须改用该语法:

speciality LIKE '%%%s%%'

您的完整查询将是:

$sql = "SELECT * FROM `program_list`
WHERE
speciality LIKE '%%%s%%'
AND (stepone2digit <= %d OR stepone2digit=0)
AND (stepone3digit <= %d OR stepone3digit=0)
AND (steptwock2digit <= %d OR steptwock2digit=0)
AND (steptwock3digit <= %d OR steptwock3digit=0)
AND (steptwocs = '%s' OR steptwocs IS NULL)
AND (steponeattempt <= %d OR steponeattempt=0)
AND (steptwockattempt <= %d OR steptwockattempt=0)
AND (steptwocsattempt <= %d OR steptwocsattempt=0)
AND ((USCEImportance = 'MAND' AND USCENoOfMonths<= '%s') OR USCEImportance = 'PREF')
AND (yearsfrompassing >= %d OR yearsfrompassing=0)";

并且不要忘记用于sprintf在查询中插入值。

于 2012-07-31T04:09:00.313 回答