Php 在循环中连接时出现连接太多错误

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);

我尝试通过PHP加载csv文件,我的csv文件有很多记录(300条)。加载csv文件进程时,它只上载25行,然后PDO错误显示“连接太多”。有没有办法加快插入过程

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);
}
本规范中有两个假设:

  • pdo.php
    文件包含一个as,而不是在每个文件中连接。连接代码必须在单独的文件中移动,然后只包含在每个需要数据库连接的脚本中
  • csv文件中的列数等于表中的行数。否则,必须事先在
    $emapData
    上调用
    array\u slice()
    函数