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

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 に答える
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 に答える