준비된 문: SELECT 쿼리에서 동적 열 이름 처리
도전:
준비된 문이 SELECT
쿼리 내에서 동적 열 이름을 수용할 수 있습니까?
시나리오:
한 사용자가 MySQL 및 Java 예를 설명했습니다.
<code class="language-java">String columnNames = "d,e,f"; // From user input String tableName = "some_table"; // From user input String query = "SELECT a,b,c,? FROM " + tableName + " WHERE d=?"; //...</code>
매개변수를 columnNames
문자열로 대체하면 다음과 같은 결과가 나옵니다.
<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
그러나 의도된 결과는 다음과 같습니다.
<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
해결책:
동적 열 이름에 대해 준비된 문을 직접 사용하는 것은 가능하지 않습니다. 준비된 문은 열 식별자가 아닌 값을 매개변수화합니다.
대체 전략:
가장 효과적인 솔루션은 데이터베이스 스키마 수정입니다. 수많은 열에 데이터를 분산시키는 대신 동적으로 이름이 지정된 열을 보관할 수 있는 단일 열을 도입하세요. 이 열에는 각 행의 열 이름 목록을 나타내는 직렬화된 문자열이 포함됩니다.
SQL 삽입을 방지하려면 엄격한 입력 삭제가 필요합니다. String#replace()
을 사용하여 따옴표를 이스케이프한 다음 삭제된 열 이름을 SQL 쿼리 문자열에 연결하는 것이 실행 가능한 방법입니다. 가능한 경우 보안상의 이점을 유지하려면 쿼리의 다른 부분에 매개변수화된 쿼리를 사용하는 것이 좋습니다.
위 내용은 준비된 문이 SELECT 쿼리의 동적 열 이름을 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!