我想通過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();
}
題正確答案是你爲什麼要一次插入呢?因爲你的'getMid()'從數據庫中獲取數據需要一個數據庫**之前**其他任何插入到數據庫? – Jurik
性能問題? – m33x
通過使用事務修復性能! – m33x