使用包含所有数据库值的 PDO 和 PHP 变量批量插入
Bulk insert using PDO and PHP variable containing all database values
我是 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;
在我的研究过程中,我发现了一个很好的 post:
PDO Prepared Inserts multiple rows in single query
一种方法说我必须更改我的 $insert 变量以包含所有字段名称。
其他方法说我不必那样做。我在看 Chris M. 建议:
The Accepted Answer by Herbert Balagtas works well when the $data array is small. With larger $data arrays the array_merge function becomes prohibitively slow. My test file to create the $data array has 28 cols and is about 80,000 lines. The final script took 41s to complete
但我不明白他在做什么,我正在努力使我的代码适应他的。 PHP 语法对我来说是新的,所以我正在努力处理数组等...
我想起点是变量 $insert,它包含我需要的所有数据库值。
我是否需要修改我的 $insert 变量以包含字段名称?
或者我可以只使用它的内容并提取值(如何?)并将值包含在循环语句中? (这可能会一次执行我的 13k 行)
谢谢
如果要插入 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);
}
我是 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;
在我的研究过程中,我发现了一个很好的 post: PDO Prepared Inserts multiple rows in single query
一种方法说我必须更改我的 $insert 变量以包含所有字段名称。 其他方法说我不必那样做。我在看 Chris M. 建议:
The Accepted Answer by Herbert Balagtas works well when the $data array is small. With larger $data arrays the array_merge function becomes prohibitively slow. My test file to create the $data array has 28 cols and is about 80,000 lines. The final script took 41s to complete
但我不明白他在做什么,我正在努力使我的代码适应他的。 PHP 语法对我来说是新的,所以我正在努力处理数组等...
我想起点是变量 $insert,它包含我需要的所有数据库值。 我是否需要修改我的 $insert 变量以包含字段名称? 或者我可以只使用它的内容并提取值(如何?)并将值包含在循环语句中? (这可能会一次执行我的 13k 行)
谢谢
如果要插入 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);
}