2012-11-24 3 views
1

PHP 배열의 $ _POST 내용을 PDO가있는 테이블에 삽입하고 있습니다. 다음 코드 줄을보고 있었고 "이 작업을 수행하는 데 더 좋은 방법이 있어야합니다."라는 순간이있었습니다. 키 이름이 테이블의 열 이름과 일치하면 모든 것을 삽입하는 더 간단한 방법이 있습니까? 예를 들어PDO 배열 이름으로 키 사용하기

코드 :

$statement = $db->prepare("INSERT INTO `applications`(`username`, `email`, `password`, `name`) VALUES (?,?,?,?)"); 

$statement->execute(array($_POST['username'], $_POST['email'],$_POST['password'],$_POST['name'])); 

이 코드는 작동하지만 그것은 단지 (더 많은 열이 추가됩니다 특히) 이상 - 더 - 상단 조금 보인다.

+0

['bindValue'] (http://www.php.net/manual/en/pdostatement.bindvalue.php)를 사용하고 열의 배열을 반복합니다. –

답변

12

이렇게하면됩니다.

먼저 열을 선언하십시오. 우리는 이들을 사용하여 $ _POST의 서브 세트를 추출하여 컬럼으로 사용합니다. 그렇지 않으면 사용자가 테이블의 모든 열과 일치하지 않는 가짜 요청 매개 변수를 전달할 수 있습니다. 이는 우리 SQL을 손상시킵니다.

$columns = array('username','email','password','name'); 
$column_list = join(',', $columns); 

명명 된 매개 변수 자리 표시 자 (예 : :username)를 만듭니다.

$param_list = join(',', array_map(function($col) { return ":$col"; }, $columns)); 

SQL을 별도로 구성하십시오. 자체 변수에있는 경우 읽고 디버그하기가 쉽기 때문에 별도로 구성하십시오.

$sql = "INSERT INTO `applications` ($column_list) VALUES ($param_list)"; 

항상 오류 상태에 대한 검사는 prepare()execute()에서 돌아왔다.
$statement = $db->prepare($sql); 
if ($statement === false) { 
    die(print_r($db->errorInfo(), true)); 
} 

여기에 우리는 우리가 삽입 할 열을 일치 $ _POST의 필드를 취할.

$param_values = array_intersect_key($_POST, array_flip($columns)); 

그리고 배열을 execute()으로 전달하십시오. 다시 오류 반환 상태를 확인하십시오.

$status = $statement->execute($param_values); 
if ($status === false) { 
    die(print_r($statement->errorInfo(), true)); 
} 
+0

'$ _POST' 배열을 "최소화"하기 위해'array_intersect_key'를 사용하면 어떤 이점이 있습니까? – Blazemonger

+1

@Blazemonger, 사용자가 POST 매개 변수를 스푸핑하고 앱을 중단시킬 수 없도록 보장합니다. –

+0

나는 같은 문제가 있지만 클래스 내부에서 일하고 있는데 값이 $ _POST에서 매개 변수로 오는 것이 아닙니다. 어떤 생각입니까? 부디. –