Bir PHP döngü içinde bir MySQL sorgusu koymak için kötü mü?

6 Cevap php

Ben genellikle büyük diziler, ya da ben idare MySQL sorguları çalıştırmak için gereken PHP dinamik büyük miktarda veri var.

INSERT-ed veya UPDATE-ed olmak için bilgi döngü olmadan INSERT veya UPDATE gibi birçok süreçleri çalıştırmak için daha iyi bir yolu var mı?

Örnek (kısalık uğruna hazırlanmış deyimi kullanmak vermedi):

$myArray = array('apple','orange','grape');

foreach($myArray as $arrayFruit) {
$query = "INSERT INTO `Fruits` (`FruitName`) VALUES ('" . $arrayFruit . "')";
mysql_query($query, $connection);
}

6 Cevap

OPTION 1 You can actually run multiple queries at once.

$queries = '';

foreach(){
    $queries  .= "INSERT....;";  //notice the semi colon
}

mysql_query($queries, $connection);

Bu işleme tasarruf olur.

SEÇENEK 2

Sizin eklemek aynı tablo için bu kadar basit ise, ONE sorguda birden ekler yapabilirsiniz

$fruits = "('".implode("'), ('", $fruitsArray)."')";
mysql_query("INSERT INTO Fruits (Fruit) VALUES $fruits", $connection);

Sorgu bu gibi bir şey arıyor biter:

$query = "INSERT INTO Fruits (Fruit)
  VALUES
  ('Apple'),
  ('Pear'),
  ('Banana')";

Bu muhtemelen gitmek istediğiniz yoldur.

Eğer mysqli sınıfı varsa, hazırlanmış deyimi kullanarak eklemek için değerleri üzerinden yineleme yapabilirsiniz.

$sth = $dbh->prepare("INSERT INTO Fruits (Fruit) VALUES (?)");
foreach($fruits as $fruit)
{
    $sth->reset(); // make sure we are fresh from the previous iteration
    $sth->bind_param('s', $fruit); // bind one or more variables to the query
    $sth->execute(); // execute the query
}

(Ben daha önce kullanmış ve sevgi) jerebear içinde bölünmesi yöntemi üzerinde özgün çözüm hakkında dikkat edilmesi gereken bir şey okumak için daha kolay olmasıdır. Implosion işlemci döngüsü daha pahalı olabilir, anlamak için daha fazla programcı beyin devir alır. erken optimizasyon, vesaire, vesaire, vesaire ... :)

Bir INSERT birden DEĞER-blokları ile jerebear cevabı hakkında Unutulmaması gereken bir şey:

En DBMS onlar işleyebilir komutların boyutu üst sınırı var çünkü, veri gerçekten büyük miktarlarda için oldukça tehlikeli olabilir. Eğer çok DEĞER-blokları ile bu aşarsanız, insert başarısız olur. MySQL örneğin sınır genellikle 1MB AFAIK olduğunu.

Yani (ideal zamanında, veritabanı meta mevcut olabilir) maksimum büyüklüğü ne olduğunu anlamaya, ve birkaç ınsert'ler üzerinde değerlerin listeleri yayarak bunu aşmadığından emin olun.

Ben mevcut projelerinden biri için ikinci bir seçenek gibi bir şey inşa etmek jerebear cevabı esinlenilmiştir. Çünkü kayıtların kesme hacminin kez tüm verileri kaydetmek ve yapamadık. Yani this ithalatı yapmak için inşa. Eğer veri ekleyebilir ve her kayıt yapılır o zaman bir yöntemini çağırın. Kayıtları, belli yapılandırılabilir bir sayıdan sonra bellekteki veriler jerebear ikinci seçeneği gibi bir kitle ekleme ile kaydedilir.

// CREATE TABLE example ( Id INT, Field1 INT, Field2 INT, Field3 INT);
$import=new DataImport($dbh, 'example', 'Id, Field1, Field2, Field3');
foreach ($whatever as $row) {
  // add data in the order of your column definition
  $import->addValue($Id);
  $import->addValue($Field1);
  $import->addValue($Field2);
  $import->addValue($Field3);
  $import->nextRow();
}
$import->lastRow();
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name)  VALUES("'.$user['first_name'].'",        "' . $user['last_name'] . '")';
mysql_query($query);

}

Yukarıdaki aşağıdaki. Yerine bir döngü kullanarak deneyin kullanarak Insted, tek bir veritabanı sorgusuna verileri birleştirebilirsiniz.

$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);

Produces:

INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...