[php] WHERE 절을 사용하여 배열을 쿼리에 전달

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()있는지 모든 있도록 idINT 값은 다음과 같습니다

$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);