php + mysql: вставить массив php в mysql - PullRequest
0 голосов
/ 27 октября 2010

У меня есть массив с 30000 плюс записями, которые нужно поместить в таблицу MySQL.

Какова лучшая практика?Отсюда?Скажем, [0], [1] и [2] в базе данных будут «title», «type» и «customer»

Добавляет ли он имена ключей, соответствующие именам столбцов в таблице, и вызывает som«волшебная» функция?Или создайте запрос вручную ...

Array
(
    [0] => Array
        (
            [0] => 2140395946
            [1] => 1SAP
            [2] => 0041451463
        )

    [1] => Array
        (
            [0] => 2140411607
            [1] => 2SAP
            [2] => 0041411940
        )

    [2] => Array
        (
            [0] => 2140706194
            [1] => 4SAP
            [2] => 0041411943
        )
etc. etc.

ОБНОВЛЕНИЕ - на основе ответов

Спасибо за ответы.

Решение обычно будетчтобы вручную создать строку SQL, и все строки можно вставить как одну:

INSERT INTO `tx_opengate_table` (`machine` ,`customer` ,`type`)
VALUES
  ('m123', 'dfkj45', 'A'),
  ('m137', 'kfkj49', 'A'), "repeat this line for each entry in the array"
  ... ... ...
  ('m654321', '34dgf456', 'C4') "end with out comma, or remove last comma"
;

Специально для TYPO3

Я могу сделать это в CMS TYPO3 итолько что наткнулся на новую функцию, добавленную не так давно:

//Insert new rows
$table = 'tx_opengate_stuff';
$fields = array('machine','type','customer');
$lines = "array as given above"
$GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows($table,$fields,$lines);

Ответы [ 4 ]

3 голосов
/ 27 октября 2010

Я бы сказал, просто сделай это сам. Вы можете настроить его так:

$query = "INSERT INTO x (a,b,c) VALUES ";
foreach ($arr as $item) {
  $query .= "('".$item[0]."','".$item[1]."','".$item[2]."'),";
}
$query = rtrim($query,",");//remove the extra comma
//execute query

Не забывайте избегать кавычек, если это необходимо.

Кроме того, будьте осторожны, чтобы не слишком много данных отправлялось одновременно Возможно, вам придется выполнять его порциями, а не сразу.

2 голосов
/ 27 октября 2010
$statement = "INSERT INTO table (title, type, customer) VALUES ";
foreach( $data as $row) {
   $statement .= ' ("' . implode($row, '","') . '")';
}

ОБНОВЛЕНИЕ: изменен взрыв, чтобы взорваться (я всегда путаю их).

2 голосов
/ 27 октября 2010

Волшебная функция?Я предполагаю, что вы имеете в виду какой-то слой абстракции БД?ИМХО, это только удвоит вашу работу.

Просто создайте запрос вручную, зацикливаясь на значениях массива [] INSERT, по мере продвижения.

1 голос
/ 27 октября 2010

Вам нужно будет создать запрос вручную, если вы хотите добиться максимальной производительности во время этой операции.Если бы вы итеративно добавляли все, используя PDO или какой-либо уровень абстракции, у вас будет 30000+ запросов на вставку.

Используйте foreach для перебора массива, создайте один вложенный запрос INSERT, который выполняет всю работу за один раз,и просто отправьте его на сервер.

...