2013-06-02 3 views
4

준비된 MySQL 문에서 매개 변수로 열 이름을 전달할 수 있습니까? 다음 예를 보자 중간 선이 위가되도록PDO 문에서 동적으로 열 이름 변경

UPDATE Images 
SET :placement = :imageURL 
WHERE ID = :titleID; 

PDO는 각 매개 변수 주위에 '을 추가 MySQL은 좋아하지 않는다

SET 'Homepage' = '1.jpg' 

합니다. PDO 명령문에 필드 이름에 대한 매개 변수를 포함하고이를 허용하는 방법이 있습니까?

그렇지 않으면 내가 선택한 항목 (?)에 따라 여러 가지 PDO 문을 써야 할 것입니다.

+6

[PDO 준비 문을 사용하여 식별자 (테이블 또는 필드 이름) 또는 구문 키워드를 바인딩 할 수 있습니까?] (http://stackoverflow.com/questions/15990857/reference-frequently-asked-questions -about-pdo # 15991422) –

+0

@YourCommonSense - [working link here] (http://stackoverflow.com/questions/23482104/can-i-use-a-pdo-prepared-statement-to-bind-an-identifier) -a-table-or-field-name) – dmnc

답변

8

당신이 뭔가를 할 필요가있을 것이다 :

$column = 'someColumn'; 

$stmt = $db->prepare("UPDATE tableName SET {$column} = :columnValue WHERE ID = :recordId"); 

매개 변수가 자리 값 만입니다.

귀하의 질문에 게시 된 @YourCommonSense 주석을 읽으시 길 바랍니다.

이와 같은 상황에서
0

, 정말 같은 여분의 파라미터의 다른 종류를 사용

$unitLabel = 'store_number'; 
$sql = 'select * from users where [unitLabel] = :unit and level = :level;'; 
$sql = str_replace('[unitLabel]', $unitLabel, $sql); 
$params = array(
    ':unit' => 300, 
    ':level' => 'admin', 
); 
$stmt = $dbh->prepare($sql); 
$stmt->execute($params); 

준비된 SQL 쿼리 처리 끝낸다 (다소)로서 :

SELECT * FROM USERS WHERE store_number = 300 AND level = 'admin'; 

내 상황에 잘 맞습니다. 이게 도움이 되길 바란다. :)

+0

SQL 인젝션에 취약합니까? – GrumpyCrouton

+0

관련된 변수가 오염 된 출처의 값을 사용하지 않기 때문에 제 상황에 있지 않습니다. * 모든 소스로부터의 사용자 입력이 사용 전에 유효성이 확인되고 소독되도록주의를 기울여야하지만 숙련 된 프로그래머에게는 본능적이어야합니다. –

+0

내가 구현 한 방법은 str_replace 대신에 "SELECT * FROM table WHERE {$ var} =?"'를 사용했습니다. 가능한 매개 변수의 배열을 사용하고 거기에 '$ var'가 존재하는지 검사합니다. 그렇지 않으면 페이지를 죽입니다. 귀하의 의견으로는, 이것이 안전한가요? – GrumpyCrouton