Массовая вставка с использованием переменной PDO и PHP, содержащей все значения базы данных

Я новичок в PHP и пытаюсь обновить устаревший код с MySQL на PDO.

Учитывая, что переменная $ insert содержит все значения для массовой вставки, такие как:

('82817cf5-52be-4ee4-953c-d3f4ed1459b0','1','EM3X001P.1a','04.03.10.42.00.02'),
('82817cf5-52be-4ee4-953c-d3f4ed1459b0','2','EM3X001P.2a','04.03.10.33.00.02'),

…и т.д. 13k строк для вставки

вот устаревший код:

mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db("IPXTools") or die(mysql_error());

if ($insert != '')
{
$insert = "INSERT INTO IPXTools.MSSWireList (ID,Record,VlookupNode,HostWireLocation) VALUES ".$insert;
$insert .= "ON DUPLICATE KEY UPDATE Record=VALUES(Record),VlookupNode=VALUES(VlookupNode),HostWireLocation=VALUES(HostWireLocation)";

mysql_query($insert) or die(mysql_error());
$insert = '';
}

вот новый код:

try
{
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    //set the PDO error mode to exception

// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO IPXTools.MSSWireList (ID, Record, VlookupNode, HostWireLocation)
VALUES (:ID, :Record, :VlookupNode, :HostWireLocation)");
$stmt->bindParam(':ID', $ID);
$stmt->bindParam(':Record', $Record);
$stmt->bindParam(':VlookupNode', $VlookupNode);
$stmt->bindParam(':HostWireLocation', $HostWireLocation);

// insert a row
// loop through all values inside the $insert variable??????? how?
$stmt->execute();
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;

Во время моего исследования я нашел отличный пост:
PDO Prepared Вставляет несколько строк в одном запросе

Один из методов говорит, что мне нужно изменить переменную $ insert, чтобы включить все имена полей.
И другой метод говорит, что я не должен это делать. Я смотрю на предложение Криса М.:

Принятый ответ Герберта Балагтаса хорошо работает, когда массив $ data мал. При больших массивах $ data функция array_merge становится слишком медленной. Мой тестовый файл для создания массива $ data имеет 28 столбцов и около 80 000 строк. Окончательный сценарий занял 41 с, чтобы завершить

но я не понял, что он делает, и я пытаюсь адаптировать свой код к его. Синтаксис PHP является новым для меня, поэтому я борюсь с обработкой массивов и т.д …

Я предполагаю, что отправной точкой будет переменная $ insert, которая содержит все значения базы данных, которые мне нужны.
Нужно ли мне изменять переменную $ insert для включения имен полей?
Или я мог бы просто использовать его содержимое и извлечь значения (как?) И включить значения в инструкцию цикла? (это, вероятно, будет выполнять мои 13k строк по одному за раз)

Спасибо

1

Решение

Если у вас есть 13k записей для вставки, для производительности будет полезно не использовать подготовленный оператор SQL. Просто сгенерируйте SQL-запрос в следующем формате:

INSERT INTO IPXTools.MSSWireList
(ID, Record, VlookupNode, HostWireLocation)
VALUES
('id1', 'r1', 'node1', 'location1'),
('id2', 'r2', 'node2', 'location2'),
...
('id13000', 'r13000', 'node13000', 'location13000');

Что вы можете сделать для этого — использовать манеру вашего старого кода. Ваш try Блок будет выглядеть так:

try
{
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->exec($insert);
}
0

Другие решения

Других решений пока нет …