2011-12-02 5 views
7

Hazırlanan deyimler için this question numaralı telefondan staticsan'ın yanıtını kullanmaya çalışıyorum. bu örnek almak sağlar: Sonunda biz sadece tek bir deyimle veritabanına birden veri eklemek, böylece staticsan's cevap olarakBir mysql veritabanında birden çok satırı, hazırladığınız ifadelerle bir kerede nasıl eklenir?

$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); 
$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

dizi MySQL deyimi içine tüm değerleri ekliyor imploding. Bu benim örneğimde nasıl yapılır?

+0

Sizin örnek zaten var parametreler sabit sayıda, bu yüzden çözüldü. Problemini biraz daha detaylandırabilir misin? Şimdiye kadar ne denediniz? Temelde aynı şekilde çalışmalı, ancak daha fazla parametre eklemelidir, ör. bir 'foreach' döngüsünde. – hakre

+0

Hazırlanmış bir açıklama hazırlayabilirsiniz, http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in-single-query –

cevap

5

Bu tamamen geçerlidir:

$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

$stmt->bind_param('iis', $userid, time(), $title); 
$stmt->execute(); 

Sen takıp bağlama ve her zaman çalıştırmak için değerler sizin dizisi üzerinde foreach edebilirsiniz. Bağladığınız örnekte toplu eklenti kadar hızlı olmayacak, ancak daha güvenli olacak. Burada sözü gibi kodu kullanarak hazırlanmış deyimi inşa edebilirsiniz

+1

Teşekkürler, bu işe yarıyor. Ancak her bir dizi elemanı için execute() çalıştırılacak, böylece her satır aynı anda ayrı ayrı veritabanına eklenecektir. Ben haklı mıyım İlk önce tüm değerleri bind_param ve en sonunda bir kez gerçekleştirdiğiniz bir çözüm görmeyi umuyordum. – phpheini

+0

Evet, bu doğru, ancak asıl avantaj, hazırlanan ifadenin sağladığı hız artışıdır - ifadeyi bir kez hazırlamak ve birden çok kez çalışmak her seferinde hazırlanmaktan çok daha hızlıdır. –

+0

Bu hala iyi eski bir statik 'INSERT 'sorgusundan daha yavaş olsa da, değil mi? Yani, bir döngüde sorguları yürütmek her sorgu arasında bir ~ 2 ms gecikme oluşturur. Büyük dizilerle bu sonsuza dek sürecek, değil mi? – NoobishPro

-2

sorgu şuna benzer:

INSERT INTO people (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29) 
+4

evet, ancak hazırlanmamış ifadeler için. Soru şu: 'mysqli-> hazırla (" INSERT INTO bir şey (userid, time, title) VALUES (?,?,?), (?,?,?), (?,? ,?) "); ve sonra ' bind_param ('iisiisiis', $ userid [0], zaman(), $ başlık, $ userid [0], zaman(), $ başlık [0], $ userid [1], time(), $ title [1], $ userid [2], time(), $ title [2]) '' – phpheini

2

,

PDO Prepared Inserts multiple rows in single query

PHP mantık çeşit gibi olacak,

/** 
* Insert With Ignore duplicates in Mysql DB. 
* 
* @param string $date Date. 
*/ 
public static function insertWithIgnore($em, $container, $tableName, $fields, $rows) 
{ 
    $query = "INSERT IGNORE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; 
    $placeHolr = array_fill(0, count($fields), "?"); 
    $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); 
    $query .= implode(",", $qPart); 

    $pdo = self::getPDOFromEm($em, $container); 
    $stmt = $pdo->prepare($query); 
    $i = 1; 
    foreach ($rows as $row) { 
     $row['created_at'] = date("Y-m-d H:i:s"); 
     foreach ($fields as $f) { 
      if (!isset($row[$f])) { 
       $row[$f] = null; 
      } 
      $stmt->bindValue($i++, $row[$f]); 
     } 
    } 

    $result = $stmt->execute(); 

    if ($result == false) { 
     $str = print_r($stmt->errorInfo(), true); 
     throw new \Exception($str); 
    } 

    $stmt->closeCursor(); 
    $pdo = null; 
} 

/** 
* Replace old rows in Mysql DB. 
* 
* @param string $date Date. 
*/ 
public static function replace($em, $container, $tableName, $fields, $rows, $extraFieldValues = null) 
{ 
    if ($extraFieldValues != null) { 
     $fields = array_unique(array_merge($fields, array_keys($extraFieldValues))); 
    } 

    $query = "REPLACE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; 
    $placeHolr = array_fill(0, count($fields), "?"); 
    $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); 
    $query .= implode(",", $qPart); 

    $pdo = self::getPDOFromEm($em, $container); 
    $stmt = $pdo->prepare($query); 
    $i = 1; 
    foreach ($rows as $row) {    
     if ($extraFieldValues != null) { 
      $row = array_merge($row, $extraFieldValues); 
     } 
     foreach ($fields as $f) { 
      $stmt->bindValue($i++, $row[$f]); 
     }       
    } 
    $stmt->execute(); 
    if (!$stmt) { 
     throw new \Exception("PDO::errorInfo():" . print_r($stmt->errorInfo(), true)); 
    } 
    $stmt->closeCursor(); 
    $pdo = null; 
}