2011-01-03 2 views
5

PDO 준비 문을 사용하고 싶지만 입력하는 데 시간이 많이 걸립니다. 배열의 키는 항상 SQL 테이블의 행과 일치하는지 염두에행을 삽입하기 위해 PDO에 행 배열을 전달하는 방법은 무엇입니까?

array(
"title"=>$title 
"userid"=>$userid 
"post"=>$body 
) 

상태 유지 : 바로 다음 연관 배열을 전달하는 기능이있는 경우는 매우 유용 할 것이다. 모든 것을 다시 요약하면 :foo을 입력하고 실행 함수에 다시 입력해야합니다.

저는 특히 INSERT 쿼리에 대해 이야기합니다.

어떻게 수행하나요?

답변

18
function pdo_insert($table, $arr=array()) 
{ 
    if (!is_array($arr) || !count($arr)) return false; 

    // your pdo connection 
    $dbh = '...'; 
    $bind = ':'.implode(',:', array_keys($arr)); 
    $sql = 'insert into '.$table.'('.implode(',', array_keys($arr)).') '. 
      'values ('.$bind.')'; 
    $stmt = $dbh->prepare($sql); 
    $stmt->execute(array_combine(explode(',',$bind), array_values($arr))); 

    if ($stmt->rowCount() > 0) 
    { 
     return true; 
    } 

return false; 
} 

pdo_insert($table, array('title'=>$title, 'userid'=>$user_id, 'post'=>$body)); 
+0

당신은 나에게 구원 년! – Ryan

+3

PDO에는이 기능이 내장되어 있지 않습니까? –

+1

아이디어 없음 ........ – ajreal

-1

또한 SQL 주입 공격을 방지하여 고려 보안을 필요가 두드러 개선 PDO 삽입 기능 :

// Insert an array with key-value pairs into a specified database table (MySQL). 
function pdo_insert($dbh,$table,$keyvals) { 
    $sql = sprintf("INSERT INTO %s (`%s`) %sVALUES (:%s);", 
     $table, 
     implode("`, `", array_keys($keyvals)), 
     PHP_EOL, 
     implode(", :", array_keys($keyvals)) 
    ); 
    $stmt = $dbh->prepare($sql); 
    foreach ($keyvals as $field => $value) { 
     $stmt->bindValue(":$field", $value, PDO::PARAM_STR); 
    } 
    $stmt->execute(); 
    return $dbh->lastInsertId(); 
} 

// Convert special characters to HTML safe entities. 
function h($str) { 
    return trim(stripslashes(htmlspecialchars($str, ENT_QUOTES, 'utf-8'))); 
} 

예 :

$dbh = new PDO($dsn); 
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$keyvals = [     
    'id' => isset($_POST['id']) ? h($_POST['id']) : null, 
    'title' => isset($_POST['title']) ? h($_POST['title']) : null,  
    'description' => isset($_POST['description']) ? h($_POST['description']) : null, 
    'created_at' => time(), 
    'created_by' => 1, 
]; 
$last_ids[] = pdo_insert($dbh,'products',$keyvals); 
관련 문제