2011-12-30 10 views
5
$sql='SELECT phrase,english FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage'])); 

위의 코드는 잘 실행됩니다. 그러나 준비 문에 다른 변수를 넣어야합니다. 나는 다음과 같은 시도했지만 작동하지 않는 것 :PHP의 PDO + 준비 문

$sql='SELECT phrase,? FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['language'],$_POST['languagepage'])); 

알아요 $ _POST [ '언어'] 만 단어 '영어'를 포함합니다 (인쇄에서). 선택의이 부분에 준비 변수를 넣을 수 있습니까?

thx

+0

구문에 오류가없는 것 같습니다. 어떤 오류 코드를 받았습니까? – LotusH

+0

오류가 없습니다. - 오히려 DB에서 값을 다시 얻습니다. 영어로 말해줍니다. 이 값은 DB에있는 열의 변수 및 제목 값입니다. – Adam

+0

예 : { "free": "english", "meetsingles": "english", "searchprofiles": "english"} 단어가 영어 인 다른 값은 ... – Adam

답변

7

쿼리 매개 변수는 열 이름이 아닌 상수 값만 사용할 수 있습니다.

쿼리를 준비 할 때 모든 열과 테이블의 이름을 지정해야합니다. 열을 선택하면 후속 실행 단계로 열을 연기 할 수 없습니다.

사용자 입력을 통해 열 이름을 결정하려면 허용 목록을 사용하여 사용자 입력을 유효한 선택으로 제한하십시오. 지도 배열의 키는 합법적 인 사용자 입력입니다. 맵 배열의 값은 SQL 쿼리에서 사용하려는 문자열이며이 경우에는 열 이름입니다.

$lang_col_map = array(
    "DEFAULT" => "english", 
    "en"  => "english", 
    "es"  => "spanish" 
); 
$lang_col = $lang_col_map[ $_POST["language"] ] ?: $lang_col_map[ "DEFAULT" ]; 

$sql='SELECT phrase,$lang_col FROM static_site_language WHERE page=?;'; 
$pds=$database->pdo->prepare($sql); 
$pds->execute(array($_POST['languagepage'])); 

당신이 $의 lang_col_map 만 값이 SQL 쿼리의 일부가 될 수 있으며, 사용자가 HTTP 요청에서 까다로운 아무것도 보내려고 시도 할 경우이 일치하지 않기 때문에, 그것은 무시됩니다 확신 할 수 있습니다이 방법 그지도의 키. 그래서 쿼리는 SQL injection으로부터 안전합니다.

자세한 내용은 프레젠테이션 SQL Injection Myths and Fallacies를 참조하십시오. 데이터베이스에 의해 지원되는 값입니다

+0

모든 질문/쿼리는 질문하기 전에 알려야합니다. – Xeoncross

2

준비된 문 만 지원 매개 변수. 두 번째 문에서

, 최초의 "?" 값이 아닌 열 이름의 자리 표시 자입니다.

는 대신 동적 SQL 문을 사용합니다. 이 경우 SQL 주입을 방지해야합니다.

$language_authorized = array('english', 'french', 'spanish'); 
$language = $_POST['language']; 
if (in_array($language_authorized, $language)) { 
    $sql='SELECT phrase,'.$language.' FROM static_site_language WHERE page=?;'; 
    $pds = $database->pdo->prepare($sql); 
    $pds->execute(array($_POST['languagepage'])); 
}