2013-12-11 90 views
0

我想通過PHP數據對象一次插入20個值。目前,我正在做這樣一來,似乎非常難看通過PHP PDO將多個值插入MySQL數據庫

$stmt = $this->pdo->prepare("INSERT INTO <tablename> (`uid`, `mid`, `status`) 
           VALUES (:uid, :mid1, :status), (:uid, :mid2, :status), 
             (:uid, :mid3, :status), (:uid, :mid4, :status), 
             (:uid, :mid5, :status), ... and so on ..."); 
    $stmt->bindParam(':uid', $this->uid); 

    $random_mid = array_rand(range(1,20), 5); 

    $ref = new Mooney($random_mid[0]); 
    $myMid1 = $ref->getMid(); 
    $stmt->bindParam(':mid1', $myMid1); 

    $ref = new Mooney($random_mid[1]); 
    $myMid2 = $ref->getMid(); 
    $stmt->bindParam(':mid2', $myMid2); 

    $ref = new Mooney($random_mid[2]); 
    $myMid3 = $ref->getMid(); 
    $stmt->bindParam(':mid3', $myMid3); 

    ... and so on ... 

    $status = 'open'; // default starting value of status 
    $stmt->bindParam(':status', $status); 
    $stmt->execute(); 

有沒有用一個for循環或使一個更好的解決方案?希望你能提供更好的解決方案/更漂亮的解決方案。感謝您的時間和幫助!

編輯1:現在由於@Jurik代碼工作,並期待這樣的:

private function insertValuesAtOnce() { 
    $stmt = $this->pdo->prepare('INSERT INTO `<tablename>` (`uid`, `mid`, `status`) VALUES (:UID, :MID, :STATUS)'); 
    $random_mid = $this->UniqueRandomNumbersWithinRange(1, 20, 7); 
    require_once('<some path>'); 
    $status = 'open'; 
    foreach($random_mid AS $val){ 
     $ref = new Mooney($val); 
     $myMid = $ref->getMid(); 

     $stmt->execute(array(
      ':UID' => $this->uid, 
      ':MID' => $myMid, 
      ':STATUS' => $status 
     )); 
    } 
} 

但在我看來,這不是一個「一次插入多行」,但更多的「插入單行多次」

編輯2:因爲它似乎並沒有能夠在一次插入所有的值,我將使用該解決方案可將其插入逐行,但它包裝成交易!這將運行時間從0,3915548324585秒/序列化改進爲0,074591159820557秒/序列化。

private function insertValuesAtOnce() { 
    $stmt = $this->pdo->prepare('INSERT INTO `<tablename>` (`uid`, `mid`, `status`) VALUES (:UID, :MID, :STATUS)'); 
    $random_mid = $this->UniqueRandomNumbersWithinRange(1, 20, 7); 
    require_once('<some path>'); 
    $status = 'open'; 

    // Beginn Transaction (ACID)  
    $this->pdo->beginTransaction(); 

    foreach($random_mid AS $val){ 
     $ref = new Mooney($val); 
     $myMid = $ref->getMid(); 

     $stmt->execute(array(
      ':UID' => $this->uid, 
      ':MID' => $myMid, 
      ':STATUS' => $status 
     )); 
    } 
    // End Transaction (ACID) 
    $this->pdo->commit(); 
} 
+0

題正確答案是你爲什麼要一次插入呢?因爲你的'getMid()'從數據庫中獲取數據需要一個數據庫**之前**其他任何插入到數據庫? – Jurik

+0

性能問題? – m33x

+0

通過使用事務修復性能! – m33x

回答

2
<?php 
    $db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD'); 
    $query = $db->prepare(
    'INSERT INTO `user_mooney` (`uid`, `mid`, `status`) 
    VALUES (:UID, :MID, :STATUS)' 
); 

    foreach($random_mid AS $val){ 
    $ref = new Mooney($val); 
    $myMid = $ref->getMid(); 

    $query->execute(array(
     ':UID' => $uid, 
     ':MID' => $myMid, 
     ':STATUS' => $status 
    )); 
    } 

    $query->commit(); 

如果提交拋出你可以叫$query->rollback();錯誤所以,你已經一個由數據庫。

編輯:從了問題編輯2

<?php 
    private function insertValuesAtOnce() { 
     $stmt = $this->pdo->prepare('INSERT INTO `<tablename>` (`uid`, `mid`, `status`) VALUES (:UID, :MID, :STATUS)'); 
     $random_mid = $this->UniqueRandomNumbersWithinRange(1, 20, 7); 
     require_once('<some path>'); 
     $status = 'open'; 

     // Beginn Transaction (ACID)  
     $this->pdo->beginTransaction(); 

     foreach($random_mid AS $val){ 
      $ref = new Mooney($val); 
      $myMid = $ref->getMid(); 

      $stmt->execute(array(
       ':UID' => $this->uid, 
       ':MID' => $myMid, 
       ':STATUS' => $status 
      )); 
     } 
     // End Transaction (ACID) 
     $this->pdo->commit(); 
    } 
+0

這樣做的伎倆,非常感謝。據我瞭解的代碼,它會一個接一個地插入值,因此**不會一次**按我的要求?我對嗎?無論如何非常感謝你! – m33x

+0

嗯,它準備插入一個接一個,如果你願意,你可以鎖定數據庫,然後再開始插入。或者你首先在'$ query-> execute'中創建所有這些數組的數組,然後將這個數組放入執行狀態。所以,在你做第一次插入之前,你已經準備好了所有的價值。 – Jurik

+0

已更新的答案 - 但我不確定這是否可行,請嘗試一下,它會適合您的問題。 – Jurik