2011-08-22 2 views
1

나는 100 개가 넘는 필드 (대부분은 체크 박스)가있는 폼을 가지고 있으며 모든 필드가 항상 채워지지는 않지만 많은 수의 필드가 있습니다. 각 필드를 타이핑하여 MySQL 쿼리를 위생 처리하고 구성하는 것에 대한 생각은 나를 울게 만들고 PHP 루프를 사용하여이를 수행 할 방법이 있어야한다고 생각했습니다.PHP에서 쿼리를보다 신속하게 작성하고 작성하는 방법

$ _POST 배열의 모든 요소를 ​​쓰지 않고 $ key => $ value 형식으로 $ formarray에 저장하지 않고 양식을 삭제할 수있었습니다. $ 키는 숫자가 아니거나 순차적이지 않으며 유지해야합니다. $ key의 값은 $ value가 쓰여질 데이터베이스 테이블의 열 이름과 같습니다.

PHP 루프를 사용하여 $ formarray의 내용을 MySQL 테이블에 삽입하는 MySQL 쿼리를 생성 할 수 있기를 원합니다. 이것이 가능한가?

+0

당신이 당신의 현재 코드를 제공 할 수 있습니다 :

여기 완전히 검증되지 않은 예입니다? 그리고 데이터베이스가 어떻게 보이는지, 실제로 100 개의 열이있는 테이블인지 또는 값이 별도의 행으로 삽입되어야하는지 여부입니다. – TJHeuvel

답변

1

매우 신중하지 않는 한 가능하지만 권장하지는 않습니다. 이 루프 접근 방식을 안전하게 만드는 것은 모든 양식 필드에 대해 모든 입력 작업을 수행하는 데 많은 시간을 소비 할 수 있지만 솔루션은 더 강력하고 모듈 식입니다. ,

$validator = array(
    'user_name' => array('mask' => "'%s'", 'escape' => true, 'boolean' => false), 
    'user_age' => array('mask' => "%d", 'escape' => false, 'boolean' => false), 
    'has_car' => array('mask' => "%d", 'escape' => false, 'boolean' => true) 
); 

그런 다음이 검증 배열을 반복하고, 키가 게시 된 데이터에 존재하는지 확인하십시오

당신은, 매핑 배열 느릅 나무의 유효성 검사 및 특정 값을 포맷에 대한 지침이 포함되어 같은 것을 만들어야합니다 별도의 배열에있는 모든 SQL 세트를 값에 지시어를 적용하고 수집 :

$set = array(); 
foreach ($_POST as $key => $dirs) 
{ 
    if ($dirs['boolean']) 
    { 
     $val = isset($_POST[$key]) ? 1 : 0; 
     $set[] = sprintf("%s=".$dirs['mask'],$key,$val); 
    } 
    elseif (isset($_POST[$key])) 
    { 
     $val = $dirs['escape'] ? addslashes($_POST[$key]) : $_POST[$key]; 
     $set[] = sprintf("%s=".$dirs['mask'],$key,$val); 
    } 
} 

을이 후에는 쿼리를 만들 수있는 세트 내파에 의해 :

$sql = "INSERT INTO table SET ".implode(",",$set); 

위의 접근 방법은 실제로 필요한 것은 아니지만 서버 측에서 대형 양식을 처리하는 데 사용할 수있는 개념입니다. 보다 복잡한 유효성 검사를 정의하고이 예제와 같은 확인란 및 텍스트 필드뿐만 아니라 배열을 처리하도록 할 수 있습니다.

귀하의 양식은 항상 귀하의 귀중한 데이터에 대한 문이며, 값이 싸면 미안합니다!

1

PDO와 준비된 문을 사용할 수 있습니다. 그것에 관한 훌륭한 점 중 하나는 그것이 당신을 위해 도망가는 "의심스러운"문자를 ​​처리한다는 것입니다.

1

데이터베이스에서 직접 열 이름을 가져와 열의 허용 목록을 만들 수 있습니다. 그런 다음 해당 목록에 대해 게시 된 필드의 유효성을 검사 할 수 있습니다. PDO를 통해 준비된 문을 사용하면 삽입을 수행 할 SQL 문을 쉽게 작성할 수 있습니다. 준비된 명령.은 데이터를 이스케이프하지 않아도되지만, 값을 데이터베이스에 삽입하기 전에 일부 유효성 검증을 수행하려고 할 것입니다.

SHOW COLUMNS 문은 열에 대한 다른 정보를 제공하므로 예를 들어 열을 BOOL 개만 가져 오는 데 사용할 수 있습니다.

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$valid = array(); 

foreach($dbh->query('SHOW COLUMNS FROM mytable') as $col) { 
    $field = $col['Field']; 
    if(isset($_POST[ $field ])) { 
     // Insert suitable validation here. 
     $validated_value = get_validated_value($_POST[ $field ]); 
     $valid[ $field ] = $validated_value; 
    } 
} 

$cols = implode(',', array_keys($valid)); 
$params = implode(',', array_fill(0, count($valid), '?')); 
$sql = "INSERT INTO mytable ($cols) VALUES ($params)"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array_values($valid)); 
관련 문제