source

PDO에서 준비한 문이 HAVING 절을 무시하는 것 같습니다.

manysource 2022. 11. 13. 19:34

PDO에서 준비한 문이 HAVING 절을 무시하는 것 같습니다.

DB-fiddle을 포함했으므로 입력 파라미터를 적절히 조정할 수 있습니다.이것은 내가 기대하는 대로 되돌아가며 PDO에서 볼 수 있는 결과와 다릅니다.

다음과 같은 상세 테이블 뷰와 쿼리를 가지고 있습니다.

CREATE TABLE `tagged` {
    `tag` SMALLINT(5) UNSIGNED NOT NULL
}

Table에는 다양한 값이 있지만 DB의 태그에는 1-10을 사용할 수 있습니다.

INSERT INTO tagged (tag) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

쿼리:

SELECT tagged.tag,
    (@t := :tag),
    @t AS temp_var,
    (@t IS NULL OR FIND_IN_SET(tagged.tag, @t) > 0) AS is_match
FROM tagged
HAVING is_match = 1
LIMIT 150

이것은 클라이언트, 명령줄, jdbc 등에서 실행할 때 매우 적합합니다.만약 내가 입력한다면''또는NULL모든 결과를 얻을 수 있습니다.마찬가지로 의 입력'1'태그만 생성하다1, 및 입력'1,4'1 또는 4의 모든 태그를 가져옵니다.

쿼리가 이러한 결과를 제한하는 방법은is_match = 1에서HAVING절을 클릭합니다.PDO를 사용하여 실행하면 파라미터가 올바르게 바인드되는 것처럼 보이지만 다음 절의 조건은 완전히 무시됩니다.

Array
(
    [0] => stdClass Object
        (
            [tag] => 3
            [(@t := ?)] => 1,4
            [temp_var] => 1,4
            [is_match] => 0     ## should not have been returned
        )

    [1] => stdClass Object
        (
            [tag] => 4
            [(@t := ?)] => 1,4
            [temp_var] => 1,4
            [is_match] => 1
        )

이 실행에 사용되는 PHP 코드(간소화):

$conn = /* pdo connection object */;
$stmt = $conn->prepare(DB::queryOf('test')); //uses our above query from a file
$stmt->bindValue(':tag', $args['tag'], PDO::PARAM_STR); //hardcode binding '1,4'
$stmt->execute(); //also tried plain #execute($args)
return $stmt->fetchAll(PDO::FETCH_OBJ);

제가 놓친 게 있나요?직접 문자열 매개 변수를 바인딩하고 있는데 임시 변수가 있고 올바르게 설정되어 있는 것 같습니다.PDO가 다음과 같은 요소에 대한 결과를 반환하는 이유는 무엇입니까?is_match=0?

이 동작은 사용하는 RDBMS에 따라 다르다고 생각합니다.

이 없는 경우GROUP BY조항, 경우에 따라서는 전체 결과를 "하나의 그룹"으로 간주할 수 있는 것으로 보인다.결과의 한 행이 다음을 만족하기 때문입니다.HAVING조건, 모든 것이 통과될 것이다.

추가 판독치:

SQL 쿼리에서 GROUP BY 없는 HAVING 사용

그룹화 없음

p.s. 제 생각엔> 0필수입니다.

질문을 이렇게 쓰겠습니다.

SELECT tag,
    @t := '1,4' AS temp_var,
    1 AS is_match
FROM tagged
WHERE @t IS NULL OR FIND_IN_SET(tag, @t)
LIMIT 150;

언급URL : https://stackoverflow.com/questions/54748944/pdo-prepared-statement-seems-to-ignore-having-clause