2011-01-03 20 views
5

Tôi muốn sử dụng PDO chuẩn bị báo cáo nhưng tôi thấy nó thực sự tốn thời gian để gõ. nó sẽ cực kỳ hữu ích nếu có một hàm chỉ cần truyền mảng kết hợp sau đây:Làm thế nào để chuyển một mảng các hàng tới PDO để chèn chúng?

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

Hãy nhớ rằng các khóa trong mảng luôn khớp với các hàng trong bảng SQL. recaping tất cả mọi thứ, điều này nên cắt đứt các nỗ lực để gõ các :foo và gõ chúng một lần nữa trong chức năng thực thi.

Tôi đang nói cụ thể về truy vấn INSERT.

Làm cách nào để thực hiện điều đó?

Trả lời

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

Bạn đã cứu tôi năm! – Ryan

+3

PDO không có chức năng tích hợp cho điều này? –

+1

không có ý tưởng ........ – ajreal

-1

slighly cải thiện PDO Chèn chức năng đó cũng mất an ninh cân nhắc bằng cách ngăn chặn các cuộc tấn công SQL Injection:

// 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'))); 
} 

Ví dụ:

$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); 
Các vấn đề liên quan