WedX - журнал о программировании и компьютерных науках

PDO MySQL: вставьте несколько строк в один запрос

Здравствуйте, я делаю класс для многократной вставки в pdo.

Это что-то вроде этого

INSERT INTO $table (key1,key2,key3,etc) VALUE (value1,value2,value3,etc), (value1,value2,value3,etc), (value1,value2,value3,etc)

После поиска я узнал, что мне нужно построить что-то вроде

INSERT INTO $table (key1,key2,key3,etc) VALUE (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc)

затем выполните с этим $this->execute($data);, где $data

 0 => 
    array
      'key1' => 'value1'
      'key2' => 'value2'
      'key3' => 'value3'
 1 => 
    array
      'key1' => 'value1'
      'key2' => 'value2'
      'key3' => 'value3'

 etc

проблема в том, что я все еще получаю сообщение об ошибке Array to string conversion на $insert->execute($data);, как я могу это исправить?

вот фрагмент того, что я делаю.

public function multipleInsert($table, $data = array()) 
{

    # INSERT (name) VALUE (value),(value)
    if (count($data) > 1) 
    {
        $fieldnames = array_keys($data[0]);
        $count_inserts = count(array_values($data));
        $count_values = count(array_values($data[0]));

        # array(????) untill x from first data
        for($i = 0; $i < $count_values; $i++)
        {
            $placeholder[] = '?';
        }

        # array((????),(????),(????)) for query
        for ($i=0; $i < $count_inserts; $i++) 
        { 
            $placeholders[] = '('. implode(',',$placeholder) . ')';
        }

        $query  = 'INSERT INTO '. $table;
        $query .= '(`'. implode('`, `', $fieldnames) .'`)';
        $query .= ' VALUES '. implode(', ', $placeholders);

        $insert = $this->start->prepare($query);

        $i = 1;
        foreach($data as $item) 
        {
            foreach ($item as $key => $value) 
            {
               $insert->bindParam($i++, $item[$key]);
            }
        }

        echo $query;
        $insert->execute();

        $return['status'] = true;
        $return['lastid'] = $this->start->lastInsertId();

        return $return;
    } 
    else 
    {
        die('$data is less then two array, use single insert instead.');
    }
}
08.04.2012

Ответы:


1

Простым способом избежать осложнений было бы что-то вроде этого

$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item)
{
    $stmt->bindValue(':a', $item[0]);
    $stmt->bindValue(':b', $item[1]);
    $stmt->bindValue(':c', $item[2]);
    $stmt->execute();
}

Однако это выполняет оператор несколько раз. Итак, лучше, если мы создадим длинный одиночный запрос, чтобы сделать это.

Вот пример того, как мы можем это сделать.

$query = "INSERT INTO foo (key1, key2) VALUES "; //Prequery
$qPart = array_fill(0, count($data), "(?, ?)");
$query .=  implode(",",$qPart);
$stmt = $dbh -> prepare($query); 
$i = 1;
foreach($data as $item) { //bind the values one by one
   $stmt->bindValue($i++, $item['key1']);
   $stmt->bindValue($i++, $item['key2']);
}
$stmt -> execute(); //execute
08.04.2012
  • так что же он выполняет 4 раза? я ищу способ вставить несколько данных в один запрос, глядя на ваш код, который он выполняет несколько раз в зависимости от того, сколько данных. 08.04.2012
  • @AdamRamadhan, как я уже говорил, это способ избежать осложнений. Я обновлю с комбинированным чуть позже. 08.04.2012
  • хорошо, позвольте мне попытаться выяснить это с нефиксированным вводом, например 0 => array 'key1' => 'value1' 'key2' => 'value2' 'key3' => 'value3' 1 => array 'key1' => 'value1' 'key2' => 'value2' 'key3' => 'value3' etc 08.04.2012
  • Привет! спасибо работает! в любом случае, пожалуйста, посмотрите мой обновленный код, есть ли что-то, что я пропустил или что-то не так? 08.04.2012
  • @AdamRamadhan, конечно, это работает: P, и ваш код выглядит нормально. 08.04.2012
  • не вызовет ли это синтаксическую ошибку SQL, потому что в запросе осталась одна? Мне кажется странным, что PDO не включает способ привязки массивов значений. 18.04.2012
  • @СандроАнтонуччи. Хорошее место. Починил это :) 18.04.2012
  • как вы вставляете, проверяя дубликаты? @Старкс 12.11.2012
  • Также было бы целесообразно использовать array_chunk для вашего массива, если его размер очень велик - это потребует еще одного цикла, но это немного проще для mySQL. Кроме того, не забывайте об обновлении дубликатов ключей... 08.08.2013
  • @Росс, я не понимаю твоей точки зрения. Что ты пытаешься сказать и кому? 08.08.2013
  • Это может вызвать ошибки SQL-сервера, такие как слишком много запросов в зависимости от максимального ограничения запросов. 09.01.2014
  • Это не сработает, потому что всегда получает последнее значение $item из цикла, так как bindParam работает по ссылке, а не по значению. Вместо этого вам нужно использовать bindValue. 24.03.2015
  • Мне нравится ваше решение. Спасибо за ваше время. 01.04.2015
  • Я также использовал это. Спасибо 14.01.2021
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]