본문 바로가기
MySql

MySQL 가변 크기 변수 목록이있는 MySQL Prepared 문

by 베이스 공부 2020. 11. 18.
반응형

매번 다른 수의 인수를 취하는 PHP로 준비된 MySQL 문을 어떻게 작성합니까? 이러한 쿼리의 예는 다음과 같습니다.

SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)

IN 절은 실행될 때마다 다른 수의 id 를 갖습니다.

내 마음에 두 가지 가능한 해결책이 있지만 더 나은 방법이 있는지보고 싶습니다.

가능한 솔루션 1 문이 100 개의 변수를 허용하도록하고 나머지는 테이블에 포함되지 않음을 보장하는 더미 값으로 채 웁니다. 100 개 이상의 값을 여러 번 호출합니다.

가능한 해결책 2 준비된 진술을 사용하지 마십시오. 가능한 주입 공격에 대해 엄격하게 검사하는 쿼리를 작성하고 실행합니다.

 

해결 방법

 

몇 가지 해결책을 생각할 수 있습니다.

한 가지 해결책은 임시 테이블을 만드는 것입니다. in 절에있는 각 매개 변수에 대해 테이블에 삽입을 수행하십시오. 그런 다음 임시 테이블에 대해 간단한 조인을 수행하십시오.

또 다른 방법은 이와 같은 작업을 수행하는 것입니다.

$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$parmcount=count($parms);   // = 4
$inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,?
$sql='SELECT age, name FROM people WHERE id IN (%s)';
$preparesql=sprintf($sql,$inclause);  // = example statement used in the question
$st=$dbh->prepare($preparesql);
$st->execute($parms);

나는 첫 번째 해결책이 큰 목록에 더 좋을 수도 있고 나중에는 작은 목록에 대해 작동 할 것이라고 의심하지만 증거는 없습니다.

@orrd를 행복하게 만드는 것은 간결한 버전입니다.

$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)',
                          implode(',',array_fill(0,count($parms),'?'))));
$st->execute($parms);

 

참조 페이지 https://stackoverflow.com/questions/327274

 

 

반응형

댓글