Php 在循环中连接时出现连接太多错误
我尝试通过PHP加载csv文件,我的csv文件有很多记录(300条)。加载csv文件进程时,它只上载25行,然后PDO错误显示“连接太多”。有没有办法加快插入过程Php 在循环中连接时出现连接太多错误,php,mysql,csv,pdo,Php,Mysql,Csv,Pdo,我尝试通过PHP加载csv文件,我的csv文件有很多记录(300条)。加载csv文件进程时,它只上载25行,然后PDO错误显示“连接太多”。有没有办法加快插入过程 while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){ try{ $dbcon = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){
try{
$dbcon = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
$dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbcon->prepare("INSERT INTO Growth(id, date, stage, length, width) VALUES(nullif('$emapData[0]','NULL'), nullif('$emapData[1]','NULL'), nullif('$emapData[2]','NULL'), nullif('$emapData[3]','NULL'), nullif('$emapData[4]','NULL')");
$stmt->execute();
}
catch(PDOException $e){
echo "Error: " . $e->getMessage();
}
}
在调用insert语句之前,先设置数据库连接
$dbcon
$dbcon = new PDO("mysql:host=$servername;dbname=$dbname",$username,$password);
while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){
try{
$dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $dbcon->prepare("INSERT INTO Growth(id, date, stage, length, width) VALUES(nullif('$emapData[0]','NULL'), nullif('$emapData[1]','NULL'), nullif('$emapData[2]','NULL'), nullif('$emapData[3]','NULL'), nullif('$emapData[4]','NULL')");
$stmt->execute();
}
catch(PDOException $e){
echo "Error: " . $e->getMessage();
}
堆栈溢出被许多人视为一种服务,为眼前的问题提供快速修复 不幸的是,它也是可重用代码示例的来源。当你从这样的角度来看这个网站时,你会发现大多数答案都令人震惊,因为它们产生的问题多于解决的问题 以这篇文章为例。OP中的代码在许多层面上都是错误的,基本上是误用了一个准备好的语句,抛弃了它的所有好处。事实上,没关系,因为我们都在学习。但答案是让所有问题保持原样,专注于一个特定的问题。因此,我们有一个被社区代码认可的例子,实际上是非常有害的。好吧,我有一些经验告诉你一个坏代码。但来自谷歌的一位毫无戒心的访问者却没有。只需复制并粘贴提供的解决方案。以及它所有的弱点和低效 要在循环中运行准备好的语句,请执行以下操作:
- 当然,连接应该在循环之前完成
- 此外,所有连接代码都必须移动到循环之外,而不仅仅是循环的一部分
- 此外,它必须是一个正确的连接代码,具有所有必需的选项,这样将来就不会出现新问题(例如,由错误的
引起)字符集
- 准备好的陈述应该是实际准备好的陈述,而不是模仿必须将查询中的所有变量替换为占位符,以使此准备好的语句真正发挥作用-首先防止SQL注入
调用也必须从循环中移出。这就是这样一条语句的要点——准备一次,执行多次prepare()
- 错误处理代码必须安全且灵活。而
echo“错误:”$e->getMessage()代码>比它更重要
include 'pdo.php';
$sql = "INSERT INTO Growth(id, date, stage, length, width)
VALUES(nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL'), nullif(?,'NULL')")
$stmt = $dbcon->prepare($sql);
while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){
$stmt->execute($emapData);
}
本规范中有两个假设:
文件包含一个as,而不是在每个文件中连接。连接代码必须在单独的文件中移动,然后只包含在每个需要数据库连接的脚本中pdo.php
- csv文件中的列数等于表中的行数。否则,必须事先在
上调用$emapData
函数array\u slice()