ID 배열이 주어지면 $galleries = array(1,2,5)
WHERE 절에서 배열 값을 사용하는 SQL 쿼리를 원합니다.
SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */
MySQL과 함께 사용할이 쿼리 문자열을 어떻게 생성 할 수 있습니까?
답변
조심해! 이 답변에는 심각한 SQL 주입 취약점 이 포함되어 있습니다 . 외부 입력이 살균되지 않도록 여기에 제시된 코드 샘플을 사용하지 마십시오.
$ids = join("','",$galleries);
$sql = "SELECT * FROM galleries WHERE id IN ('$ids')";
답변
PDO 사용 : [1]
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $pdo->prepare($select);
$statement->execute($ids);
MySQLi 사용하기 [2]
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
$statement = $mysqli->prepare($select);
$statement->bind_param(str_repeat('i', count($ids)), ...$ids);
$statement->execute();
$result = $statement->get_result();
설명:
IN()
주어진 목록에 값이 존재하는지 확인 하려면 SQL 연산자를 사용하십시오 .
일반적으로 다음과 같습니다.
expr IN (value,...)
()
배열 내부에 배치 할 표현식을 만들 수 있습니다 . 괄호 안에 적어도 하나의 값이 있어야합니다. 그렇지 않으면 MySQL이 오류를 반환합니다. 이것은 입력 배열에 적어도 하나의 값이 있는지 확인하는 것과 같습니다. SQL 인젝션 공격을 방지하려면 먼저 ?
각 입력 항목에 대해를 생성하여 매개 변수화 된 쿼리를 작성하십시오. 여기서는 ID를 포함하는 배열이 호출되었다고 가정합니다 $ids
.
$in = join(',', array_fill(0, count($ids), '?'));
$select = <<<SQL
SELECT *
FROM galleries
WHERE id IN ($in);
SQL;
세 개의 항목으로 구성된 입력 배열 $select
은 다음과 같습니다.
SELECT *
FROM galleries
WHERE id IN (?, ?, ?)
다시 한 번 ?
입력 배열에 각 항목에 대한 것이 있습니다. 그런 다음 PDO 또는 MySQLi를 사용하여 위에서 언급 한대로 쿼리를 준비하고 실행합니다.
IN()
문자열과 함께 연산자 사용
바운드 매개 변수로 인해 문자열과 정수를 쉽게 변경할 수 있습니다. PDO의 경우 변경이 필요하지 않습니다. MySQLi 변화 str_repeat('i',
에str_repeat('s',
당신이 문자열을 확인해야합니다.
[1] : 간결성을 확인하는 오류를 생략했습니다. 각 데이터베이스 방법에 대해 일반적인 오류를 확인해야합니다 (또는 DB 드라이버가 예외를 발생하도록 설정).
[2] : PHP 5.6 이상이 필요합니다. 다시 한 번 간결성을 검사하는 오류를 생략했습니다.
답변
정수 :
$query = "SELECT * FROM `$table` WHERE `$column` IN(".implode(',',$array).")";
문자열 :
$query = "SELECT * FROM `$table` WHERE `$column` IN('".implode("','",$array)."')";
답변
사전에 입력을 올바르게 위생 처리한다고 가정하면 …
$matches = implode(',', $galleries);
그런 다음 검색어를 조정하십시오.
SELECT *
FROM galleries
WHERE id IN ( $matches )
데이터 세트에 따라 적절한 값을 인용하십시오.
답변
사용하다:
select id from galleries where id in (1, 2, 5);
간단한 for each
루프가 작동합니다.
Flavius / AvatarKava의 방법 이 더 좋지만 쉼표를 포함하는 배열 값이 없는지 확인하십시오.
답변
로 플라 비우스 스테프의 대답 , 당신은 사용할 수 intval()
있는지 모든 있도록 id
INT 값은 다음과 같습니다
$ids = join(',', array_map('intval', $galleries));
$sql = "SELECT * FROM galleries WHERE id IN ($ids)";
답변
대한 MySQLi 탈출 기능 :
$ids = array_map(function($a) use($mysqli) {
return is_string($a) ? "'".$mysqli->real_escape_string($a)."'" : $a;
}, $ids);
$ids = join(',', $ids);
$result = $mysqli->query("SELECT * FROM galleries WHERE id IN ($ids)");
준비된 진술이있는 PDO의 경우 :
$qmarks = implode(',', array_fill(0, count($ids), '?'));
$sth = $dbh->prepare("SELECT * FROM galleries WHERE id IN ($qmarks)");
$sth->execute($ids);