IT story

PHP 파열하지만 각 요소를 따옴표로 묶습니다.

hot-time 2020. 12. 29. 07:55
반응형

PHP 파열하지만 각 요소를 따옴표로 묶습니다.


배열이 있다고 가정합니다.

 $elements = array('foo', 'bar', 'tar', 'dar');

그런 다음 DELETE INSQL 쿼리를 작성 하고 싶습니다 .

 $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을 호출 할 수 있습니다 . 다음은 $connMySQLi 연결을 가정 한 예입니다 .

$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

반응형