PHP 파열하지만 각 요소를 따옴표로 묶습니다.
배열이 있다고 가정합니다.
$elements = array('foo', 'bar', 'tar', 'dar');
그런 다음 DELETE IN
SQL 쿼리를 작성 하고 싶습니다 .
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
문제는 요소 배열의 ID가 각각 개별적으로 인용되지 않는다는 것입니다. IE 쿼리는 다음과 같습니다.
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
이 문제를 해결하는 가장 좋고 가장 우아한 방법은 무엇입니까?
implode
호출에 따옴표를 추가하십시오 . (당신이 의미한다고 가정합니다 implode
)
$SQL = 'DELETE FROM elements
WHERE id IN ("' . implode('", "', $elements) . '")';
이것은 다음을 생성합니다.
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
SQL 주입을 방지하는 가장 좋은 방법은 요소가 제대로 이스케이프되었는지 확인하는 것입니다.
쉬운 일이 그 (하지만 난 그것을 테스트하지 않은) 작업을해야 할 것은 하나를 사용하는 것입니다 array_map
또는 array_walk
과 같이, 모든 매개 변수를 탈출 :
$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
를 사용 array_walk
하여 요소에 대한 참조를 전달하는 배열 측면의 모든 요소를 반복하고 다음과 같은 방법으로 따옴표를 추가 할 수 있습니다.
<?php
$arr = ['a','b','c'];
array_walk($arr, function(&$x) {$x = "'$x'";});
echo implode(',', $arr); // 'a','b','c'
?>
간단한 array_map () 함수를 실행하여 문자열을 따옴표로 묶은 다음 implode ()를 감싸서 쉼표를 추가 할 수 있습니다.
$array = ["one", "two", "three", "four"];
implode(",", array_map(function($string) {
return '"' . $string . '"';
}, $array));
여기에서 최상위 답변에 약간 추가하기 위해 MySQLi를 사용하는 경우에도 객체 메서드 callable
형식 을 사용하여 array_map을 사용하여 real_escape_string을 호출 할 수 있습니다 . 다음은 $conn
MySQLi 연결을 가정 한 예입니다 .
$elements = array('foo', 'bar', 'tar', 'dar');
$cleanedElements = array_map([$conn, 'real_escape_string'], $ids);
$SQL = 'DELETE FROM elements WHERE id IN ("' . implode('", "', $elements) . '")';
array_map의 첫 번째 매개 변수는 객체 뒤에 메서드 이름이 오는 배열입니다. 이는 배열의 각 항목에 대해 다음을 실행하는 것과 동일합니다.
$newItem = $conn->real_escape_string($item);
참조 URL : https://stackoverflow.com/questions/10490860/php-implode-but-wrap-each-element-in-quotes
'IT story' 카테고리의 다른 글
자바 스크립트로 SVG 이미지 색상 변경 (0) | 2020.12.29 |
---|---|
Facebook에서 장기 라이브 액세스 토큰 받기 (0) | 2020.12.29 |
Linux에서 여러 jpg를 단일 pdf로 병합 (0) | 2020.12.29 |
'rake db : migrate RAILS_ENV = test'를 실행하라는 메시지가 표시되는 이유는 무엇입니까? (0) | 2020.12.29 |
잘못된 익명 형식 멤버 선언자 (0) | 2020.12.29 |