반응형
매번 다른 수의 인수를 취하는 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
반응형
'MySql' 카테고리의 다른 글
MySQL LIKE로 검색하는 동안 Mysql Concat 두 열 (0) | 2020.11.18 |
---|---|
MySQL PHP에서 문의 양식 7 양식 ID 받기 (0) | 2020.11.18 |
MySQL pyodbc는 모든 형식의 명명 된 매개 변수를 지원합니까? (0) | 2020.11.18 |
MySQL Sequelize : WHERE LIKE 절의 필드 연결 (0) | 2020.11.18 |
MySQL URL의 특정 ID로 MySQL 데이터베이스에서 데이터 가져 오기 (0) | 2020.11.17 |
댓글